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中的多线程实例教程
Aug 27 Python
简介Python的collections模块中defaultdict类型的用法
Jul 07 Python
Python针对给定列表中元素进行翻转操作的方法分析
Apr 27 Python
Python实现账号密码输错三次即锁定功能简单示例
Mar 29 Python
浅谈python新式类和旧式类区别
Apr 26 Python
使用celery执行Django串行异步任务的方法步骤
Jun 06 Python
python基于Selenium的web自动化框架
Jul 14 Python
python中多个装饰器的调用顺序详解
Jul 16 Python
Django admin.py 在修改/添加表单界面显示额外字段的方法
Aug 22 Python
Python爬取豆瓣视频信息代码实例
Nov 16 Python
Python递归实现打印多重列表代码
Feb 27 Python
python使用Thread的setDaemon启动后台线程教程
Apr 25 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 Try Catch异常测试
2009/03/01 PHP
php学习之 数组声明
2011/06/09 PHP
jquery select(列表)的操作(取值/赋值)
2009/08/06 Javascript
javascript 最常用的10个自定义函数[推荐]
2009/12/26 Javascript
基于jQuery的试卷自动排版系统实现代码
2011/01/06 Javascript
javascript实现焦点滚动图效果 具体方法
2013/06/24 Javascript
各浏览器对document.getElementById等方法的实现差异解析
2013/12/05 Javascript
jQuery元素选择器实例代码
2017/02/06 Javascript
微信小程序实现添加手机联系人功能示例
2017/11/30 Javascript
详解tween.js 中文使用指南
2018/01/05 Javascript
详解Node.js 中使用 ECDSA 签名遇到的坑
2018/11/26 Javascript
vue中使用props传值的方法
2019/05/08 Javascript
三分钟教你用Node做一个微信哄女友(基友)神器(面向小白)
2019/06/21 Javascript
前端vue如何使用高德地图
2020/11/05 Javascript
JavaScript十大取整方法实例教程
2020/12/03 Javascript
[02:25]DOTA2英雄基础教程 熊战士
2014/01/03 DOTA
[02:42]决战东方!DOTA2亚洲邀请赛重启荣耀之争
2017/03/17 DOTA
Python基础语法(Python基础知识点)
2016/02/28 Python
浅谈Python基础之I/O模型
2017/05/11 Python
python生成tensorflow输入输出的图像格式的方法
2018/02/12 Python
解决python测试opencv时imread导致的错误问题
2019/01/26 Python
python线程定时器Timer实现原理解析
2019/11/30 Python
pytorch中的卷积和池化计算方式详解
2020/01/03 Python
如何使用python实现模拟鼠标点击
2020/01/06 Python
django queryset相加和筛选教程
2020/05/18 Python
python如何保存文本文件
2020/06/07 Python
英国第二大营养品供应商:Vitabiotics
2016/10/01 全球购物
有机童装:Toby Tiger
2018/05/23 全球购物
工程建设实施方案
2014/03/14 职场文书
2014年单位工作总结范文
2014/11/27 职场文书
2015年评职称工作总结范文
2015/04/20 职场文书
幽默导游词开场白
2015/05/29 职场文书
傲慢与偏见读书笔记
2015/06/29 职场文书
Windows下使用Nginx+Tomcat做负载均衡的完整步骤
2021/03/31 Servers
java如何实现socket连接方法封装
2021/09/25 Java/Android
使用Postman测试需要授权的接口问题
2022/06/21 Java/Android