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 MD5文件生成码
Jan 12 Python
python解析xml文件操作实例
Oct 05 Python
python 统计代码行数简单实例
May 04 Python
PyChar学习教程之自定义文件与代码模板详解
Jul 17 Python
Python网络爬虫与信息提取(实例讲解)
Aug 29 Python
Python3.6简单的操作Mysql数据库的三个实例
Oct 17 Python
Python3中lambda表达式与函数式编程讲解
Jan 14 Python
Python中拆分字符串的操作方法
Jul 23 Python
pip安装python库的方法总结
Aug 02 Python
基于python实现地址和经纬度转换
May 19 Python
在 Python 中使用 MQTT的方法
Aug 18 Python
教你怎么用Python监控愉客行车程
Apr 29 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
DC动画电影《黑暗正义联盟》曝预告 5月5日上线数字平台
2020/04/09 欧美动漫
安装PHP可能遇到的问题“无法载入mysql扩展” 的解决方法
2007/04/16 PHP
ThinkPHP使用心得分享-ThinkPHP + Ajax 实现2级联动下拉菜单
2014/05/15 PHP
页面加载完后自动执行一个方法的js代码
2014/09/06 Javascript
JavaScript控制图片加载完成后调用回调函数的方法
2015/03/20 Javascript
js日期范围初始化得到前一个月日期的方法
2015/05/05 Javascript
js实现商城星星评分的效果
2015/12/29 Javascript
JavaScript中三种异步上传文件方式
2016/03/06 Javascript
Node.js的Koa框架上手及MySQL操作指南
2016/06/13 Javascript
工作中比较实用的JavaScript验证和数据处理的干货(经典)
2016/08/03 Javascript
浅谈jQuery为哪般去掉了浏览器检测
2016/08/29 Javascript
利用jQuery实现打字机字幕效果实例代码
2016/09/02 Javascript
js合并两个数组生成合并后的key:value数组
2018/05/09 Javascript
js事件触发操作实例分析
2019/06/21 Javascript
python3.3实现乘法表示例
2014/02/07 Python
在Python中操作字典之setdefault()方法的使用
2015/05/21 Python
Windows下Python使用Pandas模块操作Excel文件的教程
2016/05/31 Python
深入解析Python中的descriptor描述器的作用及用法
2016/06/27 Python
Python 闭包的使用方法
2017/09/07 Python
python的构建工具setup.py的方法使用示例
2017/10/23 Python
Python3解决棋盘覆盖问题的方法示例
2017/12/07 Python
Python实现检测文件MD5值的方法示例
2018/04/11 Python
解决python删除文件的权限错误问题
2018/04/24 Python
python3实现zabbix告警推送钉钉的示例
2019/02/20 Python
Python利用matplotlib做图中图及次坐标轴的实例
2019/07/08 Python
python字典通过值反查键的实现(简洁写法)
2020/09/30 Python
台湾森森购物网:U-mall
2017/10/16 全球购物
澳大利亚自然和有机的健康美容产品一站式商店:Ziani Beauty
2017/12/28 全球购物
个人自我鉴定范文
2013/10/04 职场文书
公益广告标语
2014/06/19 职场文书
美术专业自荐信
2014/07/07 职场文书
乡镇领导班子批评与自我批评材料
2014/09/23 职场文书
自愿离婚协议书2015
2015/01/26 职场文书
机修车间主任岗位职责
2015/04/08 职场文书
开工典礼致辞
2015/07/29 职场文书
Java工作中实用的代码优化技巧分享
2022/04/21 Java/Android