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引用类型和值类型的区别与使用解析
Oct 17 Python
python os用法总结
Jun 08 Python
78行Python代码实现现微信撤回消息功能
Jul 26 Python
Python使用combinations实现排列组合的方法
Nov 13 Python
对Python3之方法的覆盖与super函数详解
Jun 26 Python
Django 简单实现分页与搜索功能的示例代码
Nov 07 Python
python装饰器的特性原理详解
Dec 25 Python
Selenium 滚动页面至元素可见的方法
Mar 18 Python
如何在django中实现分页功能
Apr 22 Python
python文件读取失败怎么处理
Jun 23 Python
python爬虫今日热榜数据到txt文件的源码
Feb 23 Python
Python - 10行代码集2000张美女图
May 23 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
destoon后台网站设置变成空白的解决方法
2014/06/21 PHP
thinkPHP5.0框架安装教程
2017/03/25 PHP
一个刚完成的layout(拖动流畅,不受iframe影响)
2007/08/17 Javascript
JavaScript ECMA-262-3 深入解析.第三章.this
2011/09/28 Javascript
分享XmlHttpRequest调用Webservice的一点心得
2012/07/20 Javascript
js中通过父级进行查找定位元素
2014/06/15 Javascript
多种js图片预加载实现方式分享
2016/02/19 Javascript
JS遍历页面所有对象属性及实现方法
2016/08/01 Javascript
js实现对table的增加行和删除行的操作方法
2016/10/13 Javascript
CheckBox多选取值及判断CheckBox选中是否为空的实例
2017/10/31 Javascript
JavaScript基于面向对象实现的猜拳游戏
2018/01/03 Javascript
在vue中使用echarts图表实例代码详解
2018/10/22 Javascript
JS使用Dijkstra算法求解最短路径
2019/01/17 Javascript
jQuery实现全选、反选和不选功能的方法详解
2019/12/04 jQuery
JavaScript实现捕获鼠标坐标
2020/04/12 Javascript
vue实现点击按钮切换背景颜色的示例代码
2020/06/23 Javascript
在Vue中使用Echarts实例图的方法实例
2020/10/10 Javascript
Python中非常实用的一些功能和函数分享
2015/02/14 Python
Python循环语句中else的用法总结
2016/09/11 Python
python 实现一个贴吧图片爬虫的示例
2017/10/12 Python
python实现堆和索引堆的代码示例
2018/03/19 Python
python os用法总结
2018/06/08 Python
Python if语句知识点用法总结
2018/06/10 Python
Pytorch加载部分预训练模型的参数实例
2019/08/18 Python
Python接口测试文件上传实例解析
2020/05/22 Python
Python 使用生成器代替线程的方法
2020/08/04 Python
AE美国鹰日本官方网站: American Eagle Outfitters
2016/12/10 全球购物
安德玛比利时官网:Under Armour比利时
2019/08/28 全球购物
英国最大的在线照明商店:Litecraft
2020/08/31 全球购物
软件工程专业推荐信
2013/10/28 职场文书
医院总经理岗位职责
2014/02/04 职场文书
伊琍体标语
2014/06/25 职场文书
会计入职心得体会
2016/01/22 职场文书
浅谈pytorch中stack和cat的及to_tensor的坑
2021/05/20 Python
四十九个javascript小知识实用技巧
2021/11/20 Javascript
Jmerte 分布式压测及分布式压测配置
2022/04/30 Java/Android