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 相关文章推荐
Python2.x版本中基本的中文编码问题解决
Oct 12 Python
Python中强大的命令行库click入门教程
Dec 26 Python
tensorflow学习笔记之简单的神经网络训练和测试
Apr 15 Python
神经网络(BP)算法Python实现及应用
Apr 16 Python
python 筛选数据集中列中value长度大于20的数据集方法
Jun 14 Python
Django跨域请求问题的解决方法示例
Jun 16 Python
Python 3.x基于Xml数据的Http请求方法
Dec 28 Python
值得收藏的10道python 面试题
Apr 15 Python
python 字符串追加实例
Jul 20 Python
解决Django连接db遇到的问题
Aug 29 Python
py-charm延长试用期限实例
Dec 22 Python
pytorch 准备、训练和测试自己的图片数据的方法
Jan 10 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学习之数据类型之间的转换代码
2011/05/29 PHP
php限制ip地址范围的方法
2015/03/31 PHP
php实现文本数据导入SQL SERVER
2015/05/17 PHP
PHP执行SQL文件并将SQL文件导入到数据库
2015/09/17 PHP
pjblog中的UBBCode.js
2007/04/25 Javascript
jquery构造器的实现代码小结
2011/05/16 Javascript
hover的用法及live的用法介绍(鼠标悬停效果)
2013/03/29 Javascript
在Node.js中实现文件复制的方法和实例
2014/06/05 Javascript
javascript数组去重的方法汇总
2015/04/14 Javascript
JavaScript中rem布局在react中的应用
2015/12/09 Javascript
浅析jQuery事件之on()方法绑定多个选择器,多个事件
2016/04/27 Javascript
用JavaScript动态建立或增加CSS样式表的实现方法
2016/05/20 Javascript
【经典源码收藏】jQuery实用代码片段(筛选,搜索,样式,清除默认值,多选等)
2016/06/07 Javascript
Vue实现导出excel表格功能
2018/03/30 Javascript
新版小程序登录授权的方法
2018/12/12 Javascript
jQuery实现的点击显示隐藏下拉菜单功能完整示例
2019/05/17 jQuery
Vue自定义指令结合阿里云OSS优化图片的实现方法
2019/11/12 Javascript
python中精确输出JSON浮点数的方法
2014/04/18 Python
Python制作钉钉加密/解密工具
2016/12/07 Python
深入浅析Python2.x和3.x版本的主要区别
2018/11/30 Python
python中多个装饰器的调用顺序详解
2019/07/16 Python
Python批量启动多线程代码实例
2020/02/18 Python
基于django 的orm中非主键自增的实现方式
2020/05/18 Python
使用Python-OpenCV消除图像中孤立的小区域操作
2020/07/05 Python
Html5 web本地存储实例详解
2016/07/28 HTML / CSS
卡西欧G-SHOCK英国官网: 防水防震手表
2018/01/08 全球购物
Under Armour安德玛意大利官网:美国高端运动科技品牌
2020/01/16 全球购物
TecoBuy澳大利亚:在线电子和小工具商店
2020/06/25 全球购物
什么是Deployment descriptors;都有什么类型的部署描述符
2015/07/28 面试题
大学生创业策划书
2014/02/02 职场文书
欢迎标语大全
2014/06/21 职场文书
2014基层党员批评与自我批评范文
2014/09/24 职场文书
行风评议整改报告
2014/11/06 职场文书
专家推荐信怎么写
2015/03/25 职场文书
商场圣诞节活动总结
2015/05/06 职场文书
python游戏开发之pygame实现接球小游戏
2022/04/22 Python