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 相关文章推荐
pycharm 实现显示project 选项卡的方法
Jan 17 Python
如何更优雅地写python代码
Jul 02 Python
python 图片去噪的方法示例
Jul 09 Python
Python3.0 实现决策树算法的流程
Aug 08 Python
Python简易计算器制作方法代码详解
Oct 31 Python
python numpy 矩阵堆叠实例
Jan 17 Python
NumPy排序的实现
Jan 21 Python
在django中使用apscheduler 执行计划任务的实现方法
Feb 11 Python
keras 两种训练模型方式详解fit和fit_generator(节省内存)
Jul 03 Python
Python Pivot table透视表使用方法解析
Sep 11 Python
python 多线程中join()的作用
Oct 29 Python
Python可视化神器pyecharts绘制水球图
Jul 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
第三节--定义一个类
2006/11/16 PHP
使用zend studio for eclipse不能激活代码提示功能的解决办法
2009/10/11 PHP
微博短链接算法php版本实现代码
2012/09/15 PHP
php中smarty实现多模版网站的方法
2015/06/11 PHP
PHP的重载使用魔术方法代码实例详解
2021/02/26 PHP
input的focus方法使用
2010/03/13 Javascript
JS 面向对象之神奇的prototype
2011/02/26 Javascript
js change,propertychange,input事件小议
2011/12/20 Javascript
Javascript setInterval的两种调用方法(实例讲解)
2013/11/29 Javascript
javascript获取flash版本号的方法
2014/11/20 Javascript
异步JavaScript编程中的Promise使用方法
2015/07/28 Javascript
弹出遮罩层后禁止滚动效果【实现代码】
2016/04/29 Javascript
两种简单的跨域方法(jsonp、php)
2017/01/02 Javascript
详解用node-images 打造简易图片服务器
2017/05/08 Javascript
Vue 2.0的数据依赖实现原理代码简析
2017/07/10 Javascript
JS实现的简单下拉框联动功能示例
2018/05/11 Javascript
javascript少儿编程关于返回值的函数内容
2018/05/27 Javascript
使用Vue父子组件通信实现todolist的功能示例代码
2019/04/11 Javascript
Vue组件间通信方法总结(父子组件、兄弟组件及祖先后代组件间)
2019/04/17 Javascript
Java Varargs 可变参数用法详解
2020/01/28 Javascript
使用Typescript开发微信小程序的步骤详解
2021/01/12 Javascript
[39:53]完美世界DOTA2联赛PWL S2 LBZS vs Forest 第一场 11.19
2020/11/19 DOTA
python打开文件并获取文件相关属性的方法
2015/04/23 Python
python操作 hbase 数据的方法
2016/12/18 Python
快速实现基于Python的微信聊天机器人示例代码
2017/03/03 Python
Python中第三方库Requests库的高级用法详解
2017/03/12 Python
Python实现登陆文件验证方法
2018/10/06 Python
Python爬取爱奇艺电影信息代码实例
2019/11/26 Python
python带参数打包exe及调用方式
2019/12/21 Python
Python3中configparser模块读写ini文件并解析配置的用法详解
2020/02/18 Python
python爬虫请求头设置代码
2020/07/28 Python
仿CSDN Blog返回页面顶部功能实现原理及代码
2013/06/30 HTML / CSS
中等生评语大全
2014/05/04 职场文书
纪检干部先进事迹材料
2014/08/23 职场文书
计算机考试作弊检讨书1000字
2015/01/01 职场文书
追讨欠款律师函
2015/05/27 职场文书