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新手在作用域方面经常容易碰到的问题
Apr 03 Python
介绍Python的@property装饰器的用法
Apr 28 Python
Python导出DBF文件到Excel的方法
Jul 25 Python
python使用xslt提取网页数据的方法
Feb 23 Python
Python实例方法、类方法、静态方法的区别与作用详解
Mar 25 Python
​如何愉快地迁移到 Python 3
Apr 28 Python
Python定时任务随机时间执行的实现方法
Aug 14 Python
python识别验证码图片实例详解
Feb 17 Python
python画环形图的方法
Mar 25 Python
使用Python绘制台风轨迹图的示例代码
Sep 21 Python
解决import tensorflow导致jupyter内核死亡的问题
Feb 06 Python
如何用python绘制雷达图
Apr 24 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 insert语法详解
2008/06/07 PHP
php fputcsv命令 写csv文件遇到的小问题(多维数组连接符)
2011/05/24 PHP
php图片处理函数获取类型及扩展名实例
2014/11/19 PHP
jquery无法设置checkbox选中即没有变成选中状态
2014/03/27 Javascript
超级简单的jquery操作表格方法
2014/12/15 Javascript
JS获得选取checkbox整行数据的方法
2015/01/28 Javascript
JS函数this的用法实例分析
2015/02/05 Javascript
原生js配合cookie制作保存路径的拖拽
2015/12/29 Javascript
jQuery事件绑定用法详解(附bind和live的区别)
2016/01/19 Javascript
jquery实现全选功能效果的实现代码
2016/05/05 Javascript
在JavaScript中调用Java类和接口的方法
2016/09/07 Javascript
微信小程序 window_x64环境搭建
2016/09/30 Javascript
javascript深拷贝和浅拷贝详解
2017/02/14 Javascript
表格展示利器 Bootstrap Table实例代码
2017/09/06 Javascript
jQuery中使用validate插件校验表单功能
2019/05/24 jQuery
实例说明Python中比较运算符的使用
2015/05/13 Python
python入门基础之用户输入与模块初认识
2016/11/14 Python
django站点管理详解
2017/12/12 Python
在CentOS6上安装Python2.7的解决方法
2018/01/09 Python
pandas DataFrame实现几列数据合并成为新的一列方法
2018/06/08 Python
python 快速把超大txt文件转存为csv的实例
2018/10/26 Python
Python实现统计英文文章词频的方法分析
2019/01/28 Python
OpenCV+face++实现实时人脸识别解锁功能
2019/08/28 Python
python实现代码统计程序
2019/09/19 Python
原来我一直安装 Python 库的姿势都不对呀
2019/11/11 Python
Django Admin后台模型列表页面如何添加自定义操作按钮
2020/11/11 Python
boostrap modal 闪现问题的解决方法
2020/09/01 HTML / CSS
美国家居装饰购物网站:Amanda Lindroth
2020/03/25 全球购物
简述进程的启动、终止的方式以及如何进行进程的查看
2014/02/20 面试题
某科技软件测试面试题
2013/05/19 面试题
开展党的群众路线教育实践活动方案
2014/02/05 职场文书
《大作家的小老师》教学反思
2014/04/16 职场文书
我的理想演讲稿
2014/04/30 职场文书
2014年保育员工作总结
2014/12/02 职场文书
事业单位考察材料范文
2014/12/25 职场文书
学术会议领导致辞
2015/07/29 职场文书