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编写生成验证码的脚本的教程
May 04 Python
Python检测一个对象是否为字符串类的方法
May 21 Python
Python+django实现简单的文件上传
Aug 17 Python
Python 专题三 字符串的基础知识
Mar 19 Python
python生成随机图形验证码详解
Nov 08 Python
更改Python的pip install 默认安装依赖路径方法详解
Oct 27 Python
pytorch 更改预训练模型网络结构的方法
Aug 19 Python
Python搭建代理IP池实现检测IP的方法
Oct 27 Python
NumPy统计函数的实现方法
Jan 21 Python
python标准库OS模块函数列表与实例全解
Mar 10 Python
Python爬虫实战之爬取京东商品数据并实实现数据可视化
Jun 07 Python
Python Flask搭建yolov3目标检测系统详解流程
Nov 07 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 字符串编码截取函数(兼容utf-8和gb2312)
2009/05/02 PHP
(PHP实现)只使用++运算实现加法,减法,乘法,除法
2013/06/27 PHP
php缓存技术详细总结
2013/08/07 PHP
浅析echo(),print(),print_r(),return之间的区别
2013/11/27 PHP
php文件上传、下载和删除示例
2020/08/28 PHP
php array_walk_recursive 使用自定的函数处理数组中的每一个元素
2016/11/16 PHP
Laravel中encrypt和decrypt的实现方法
2017/09/24 PHP
jQuery 工具函数学习资料
2010/04/29 Javascript
JavaScript游戏之是男人就下100层代码打包
2010/11/08 Javascript
检查输入的是否是数字使用keyCode配合onkeypress事件
2014/01/23 Javascript
js创建一个input数组并绑定click事件的方法
2014/06/12 Javascript
jQuery的几个我们必须了解的特点
2015/05/03 Javascript
JSONObject使用方法详解
2015/12/17 Javascript
Bootstrap面板学习使用
2017/02/09 Javascript
AngularJS之页面跳转Route实例代码
2017/03/10 Javascript
使用canvas及js简单生成验证码方法
2017/04/02 Javascript
Javascript中的async awai的用法
2017/05/17 Javascript
vue2.0 与 bootstrap datetimepicker的结合使用实例
2017/05/22 Javascript
JS库之wow.js使用方法
2017/09/14 Javascript
利用Node.js了解与测量HTTP所花费的时间详解
2017/09/22 Javascript
JS获取子节点、父节点和兄弟节点的方法实例总结
2018/07/06 Javascript
微信小程序左滑删除功能开发案例详解
2018/11/12 Javascript
原生javascript制作的拼图游戏实现方法详解
2020/02/23 Javascript
Python基于socket实现简单的即时通讯功能示例
2018/01/16 Python
Python决策树和随机森林算法实例详解
2018/01/30 Python
解决pytorch 交叉熵损失输出为负数的问题
2020/07/07 Python
亚洲颇具影响力的男性在线购物零售商:His
2019/11/24 全球购物
迪斯尼假期(欧洲、中东及非洲):Disney Holidays EMEA
2021/02/15 全球购物
.net笔试题
2014/03/03 面试题
便利店投资的创业计划书
2014/01/12 职场文书
中学教师自我鉴定
2014/02/07 职场文书
关于环保的建议书
2014/05/12 职场文书
信息工作经验交流材料
2014/05/28 职场文书
高三霸气励志标语
2014/06/24 职场文书
高考作弊检讨书1500字
2015/02/16 职场文书
讲解Python实例练习逆序输出字符串
2022/05/06 Python