python中Apriori算法实现讲解


Posted in Python onDecember 10, 2017

本文主要给大家讲解了Apriori算法的基础知识以及Apriori算法python中的实现过程,以下是所有内容:

1. Apriori算法简介

Apriori算法是挖掘布尔关联规则频繁项集的算法。Apriori算法利用频繁项集性质的先验知识,通过逐层搜索的迭代方法,即将K-项集用于探察(k+1)项集,来穷尽数据集中的所有频繁项集。先找到频繁项集1-项集集合L1, 然后用L1找到频繁2-项集集合L2,接着用L2找L3,知道找不到频繁K-项集,找到每个Lk需要一次数据库扫描。注意:频繁项集的所有非空子集也必须是频繁的。Apriori性质通过减少搜索空间,来提高频繁项集逐层产生的效率。Apriori算法由连接和剪枝两个步骤组成。

2. Apriori算法步骤

 根据一个实例来解释:下图是一个交易单,I1至I5可看作5种商品。下面通过频繁项集合来找出关联规则。

假设我们的最小支持度阈值为2,即支持度计数小于2的都要删除。

python中Apriori算法实现讲解        

上表第一行(第一项交易)表示:I1和I2和I5一起被购买。

python中Apriori算法实现讲解

C1至L1的过程: 只需查看支持度是否高于阈值,然后取舍。上图C1中所有阈值都大于2,故L1中都保留。

python中Apriori算法实现讲解

L1至C2的过程分三步:

遍历产生L1中所有可能性组合,即(I1,I2)...(I4,I5 )    对便利产生的每个组合进行拆分,以保证频繁项集的所有非空子集也必须是频繁的。即对于(I1,I2)来说进行拆分为I1,I2.由于I1和I2在L1中都为频繁项,所以这一组合保留。对于剩下的C2根据原数据集中进行支持度计数

python中Apriori算法实现讲解

C2至L2的过程: 只需查看支持度是否高于阈值,然后取舍。

python中Apriori算法实现讲解

L2至C3的过程:

还是上面的步骤。首先生成(1,2,3)、(1,2,4)、(1,2,5)....为什么最后只剩(1,2,3)和(1,2,5)呢?因为剪枝过程:(1,2,4)拆分为(1,2)和(1,4)和(2,4).然而(1,4)在L2中不存在,即非频繁项。所有剪枝删除。然后对C3中剩下的组合进行计数。发现(1,2,3)和(1,2,5)的支持度2。迭代结束。

所以算法过程就是 Ck - Lk - Ck+1 的过程:

3.Apriori算法实现

# -*- coding: utf-8 -*-
"""
Created on Sat Dec 9 15:33:45 2017
@author: LPS
"""
import numpy as np
from itertools import combinations # 迭代工具
data = [[1,2,5], [2,4], [2,3], [1,2,4], [1,3], [2,3], [1,3], [1,2,3,5], [1,2,3]]
minsp = 2
d = []
for i in range(len(data)):
 d.extend(data[i])
new_d = list(set(d))
def satisfy(s, s_new, k): # 更新确实存在的L 
 e =[]
 ss_new =[]
 for i in range(len(s_new)):
  for j in combinations(s_new[i], k): # 迭代产生所有元素可能性组合
   e.append(list(j))
  if ([l for l in e if l not in s]) ==[] :
   ss_new.append(s_new[i])
  e = []
  return ss_new # 筛选满足条件的结果 
def count(s_new): # 返回narray格式的C
 num = 0
 C = np.copy(s_new)
 C = np.column_stack((C, np.zeros(C.shape[0])))
 for i in range(len(s_new)):
  for j in range(len(data)):
   if ([l for l in s_new[i] if l not in data[j]]) ==[] :
    num = num+1
  C[i,-1] = num
  num = 0   
 return C
def limit(L): # 删掉不满足阈值的C
 row = []
 for i in range(L.shape[0]):
  if L[i,-1] < minsp :
   row.append(i)
 L = np.delete(L, row, 0) 
 return L
def generate(L, k): # 实现由L至C的转换
 s = []
 for i in range(L.shape[0]):
  s.append(list(L[i,:-1]))
 s_new = []
# L = L.delete(L, -1, 1)
# l = L.shape[1]
 for i in range(L.shape[0]-1):
  for j in range(i+1, L.shape[0]):
   if (L[j,-2]>L[i,-2]):
    t = list(np.copy(s[i]))
    t.append(L[j,-2])
    s_new.append(t) # s_new为列表
    
 s_new = satisfy(s, s_new, k) 
 C = count(s_new)
 return C
# 初始的C与L
C = np.zeros([len(new_d), 2])
for i in range(len(new_d)):
 C[i:] = np.array([new_d[i], d.count(new_d[i])])
L = np.copy(C)
L = limit(L)
# 开始迭代
k = 1
while (np.max(L[:,-1]) > minsp):
 C = generate(L, k) # 由L产生C
 L = limit(C)  # 由C产生L
 k = k+1
# 对最终结果去重复
print((list(set([tuple(t) for t in L])))
# 结果为 [(1.0, 2.0, 3.0, 2.0), (1.0, 2.0, 5.0, 2.0)]
Python 相关文章推荐
浅析Python中MySQLdb的事务处理功能
Sep 21 Python
python中Matplotlib实现绘制3D图的示例代码
Sep 04 Python
解决pycharm安装后代码区不能编辑的问题
Oct 28 Python
python制作简单五子棋游戏
Jun 18 Python
python基于Selenium的web自动化框架
Jul 14 Python
Pytorch 数据加载与数据预处理方式
Dec 31 Python
基于TensorBoard中graph模块图结构分析
Feb 15 Python
Windows下实现将Pascal VOC转化为TFRecords
Feb 17 Python
Flask和pyecharts实现动态数据可视化
Feb 26 Python
Python如何实现机器人聊天
Sep 10 Python
Python使用openpyxl复制整张sheet
Mar 24 Python
Python 实现定积分与二重定积分的操作
May 26 Python
Python自动化运维之IP地址处理模块详解
Dec 10 #Python
python利用rsa库做公钥解密的方法教程
Dec 10 #Python
Python跨文件全局变量的实现方法示例
Dec 10 #Python
git进行版本控制心得详谈
Dec 10 #Python
Python内置模块turtle绘图详解
Dec 09 #Python
Python程序退出方式小结
Dec 09 #Python
Python实战小程序利用matplotlib模块画图代码分享
Dec 09 #Python
You might like
php常用文件操作函数汇总
2014/11/22 PHP
对laravel in 查询的使用方法详解
2019/10/09 PHP
Prototype 工具函数 学习
2009/07/23 Javascript
IE的有条件注释判定IE版本详解(附实例代码)
2012/01/04 Javascript
表头固定(利用jquery实现原理介绍)
2012/11/08 Javascript
jquery利用ajax调用后台方法实例
2013/08/23 Javascript
js怎么判断flash swf文件是否加载完毕
2014/08/14 Javascript
javascript无刷新评论实现方法
2015/05/13 Javascript
Javascript单例模式的介绍和实例
2016/10/08 Javascript
flag和jq on 的绑定多个对象和方法(必看)
2017/02/27 Javascript
jQuery表格(Table)基本操作实例分析
2017/03/10 Javascript
vue 请求后台数据的实例代码
2017/06/22 Javascript
Angular2.0实现modal对话框的方法示例
2018/02/18 Javascript
js统计页面上每个标签的数量实例代码
2018/05/29 Javascript
详解Vue webapp项目通过HBulider打包原生APP
2018/06/29 Javascript
详解VUE项目中安装和使用vant组件
2019/04/28 Javascript
使用pkg打包ThinkJS项目的方法步骤
2019/12/30 Javascript
如何配置vue.config.js 处理static文件夹下的静态文件
2020/06/19 Javascript
ant-design-vue中的select选择器,对输入值的进行筛选操作
2020/10/24 Javascript
Vue 3.0中jsx语法的使用
2020/11/13 Javascript
python实现去除下载电影和电视剧文件名中的多余字符的方法
2014/09/23 Python
python通过imaplib模块读取gmail里邮件的方法
2015/05/08 Python
微信跳一跳辅助python代码实现
2018/01/05 Python
Python利用matplotlib.pyplot绘图时如何设置坐标轴刻度
2018/04/09 Python
Python3用tkinter和PIL实现看图工具
2018/06/21 Python
实例讲解Python爬取网页数据
2018/07/08 Python
python3中sorted函数里cmp参数改变详解
2020/03/12 Python
python编写扎金花小程序的实例代码
2021/02/23 Python
在html5的Canvas上绘制椭圆的几种方法总结
2013/01/07 HTML / CSS
巴西葡萄酒商店:Divvino
2020/02/22 全球购物
2014小学二年级班主任工作总结
2014/12/05 职场文书
2015年团支部工作总结
2015/04/03 职场文书
公共场所卫生管理制度
2015/08/05 职场文书
学生会任命书范本
2015/09/21 职场文书
表扬稿表扬信的格式及范文
2019/06/24 职场文书
Apache POI的基本使用详解
2021/11/07 Servers