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中使用MELIAE分析程序内存占用实例
Feb 18 Python
Python中MySQLdb和torndb模块对MySQL的断连问题处理
Nov 09 Python
zookeeper python接口实例详解
Jan 18 Python
Django Admin实现三级联动的示例代码(省市区)
Jun 22 Python
在Python中使用gRPC的方法示例
Aug 08 Python
对pandas中时间窗函数rolling的使用详解
Nov 28 Python
Pandas分组与排序的实现
Jul 23 Python
Python 如何优雅的将数字转化为时间格式的方法
Sep 26 Python
利用python实现PSO算法优化二元函数
Nov 13 Python
python json.dumps中文乱码问题解决
Apr 01 Python
python 中的@运算符使用
May 26 Python
自动在Windows中运行Python脚本并定时触发功能实现
Sep 04 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
解析crontab php自动运行的方法
2013/06/24 PHP
详解WordPress中用于更新和获取用户选项数据的PHP函数
2016/03/08 PHP
用HTML/JS/PHP方式实现页面延时跳转的简单实例
2016/07/18 PHP
PHP实现的DES加密解密封装类完整实例
2017/04/29 PHP
如何通过View::first使用Laravel Blade的动态模板详解
2017/09/21 PHP
JavaScript初学者需要了解10个小技巧
2010/08/25 Javascript
jQuery中验证表单提交方式及序列化表单内容的实现
2014/01/06 Javascript
js跨域问题浅析及解决方法优缺点对比
2014/11/08 Javascript
解决JavaScript数字精度丢失问题的方法
2015/12/03 Javascript
node.js文件上传处理示例
2016/10/27 Javascript
原生JS改变透明度实现轮播效果
2017/03/24 Javascript
jQuery实现动态给table赋值的方法示例
2017/07/04 jQuery
Angular.js初始化之ng-app的自动绑定与手动绑定详解
2017/07/31 Javascript
Node.js静态服务器的实现方法
2018/02/28 Javascript
JS实现对json对象排序并删除id相同项功能示例
2018/04/18 Javascript
vue和webpack项目构建过程常用的npm命令详解
2018/06/15 Javascript
js实现动态增加文件域表单功能
2018/10/22 Javascript
element-ui 文件上传修改文件名的方法示例
2019/11/05 Javascript
js实现一款简单踩白块小游戏(曾经很火)
2019/12/02 Javascript
javascript实现fetch请求返回的统一拦截
2019/12/22 Javascript
JavaScript中的this/call/apply/bind的使用及区别
2020/03/06 Javascript
8个非常实用的Vue自定义指令
2020/12/15 Vue.js
[16:56]教你分分钟做大人:司夜刺客
2014/10/30 DOTA
python实现二维码扫码自动登录淘宝
2016/12/27 Python
python selenium UI自动化解决验证码的4种方法
2018/01/05 Python
Python 添加文件注释和函数注释操作
2020/08/09 Python
Dillard’s百货官网:Dillards.com
2018/05/26 全球购物
Engel & Bengel官网:婴儿推车、儿童房家具和婴儿设备
2019/12/28 全球购物
五年级数学教学反思
2014/02/11 职场文书
企业管理毕业生求职信
2014/03/11 职场文书
个人社会实践自我鉴定
2014/03/24 职场文书
感恩小明星事迹材料
2014/05/23 职场文书
运动会400米加油稿(8篇)
2014/09/22 职场文书
硕士论文致谢范文
2015/05/14 职场文书
JavaWeb 入门篇(3)ServletContext 详解 具体应用
2021/07/16 Java/Android
idea以任意顺序debug多线程程序的具体用法
2021/08/30 Java/Android