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自动化测试之连接几组测试包实例
Sep 28 Python
使用Python编写Linux系统守护进程实例
Feb 03 Python
python 打印出所有的对象/模块的属性(实例代码)
Sep 11 Python
Python 3.x 连接数据库示例(pymysql 方式)
Jan 19 Python
python3读取MySQL-Front的MYSQL密码
May 03 Python
教你使用python实现微信每天给女朋友说晚安
Mar 23 Python
python opencv 图像尺寸变换方法
Apr 02 Python
Python面向对象程序设计OOP入门教程【类,实例,继承,重载等】
Jan 05 Python
Python实现的企业粉丝抽奖功能示例
Jul 26 Python
python线程里哪种模块比较适合
Aug 02 Python
python 实现朴素贝叶斯算法的示例
Sep 30 Python
Django程序的优化技巧
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
大师制作的中短波矿石收音机
2020/04/02 无线电
PHP base64+gzinflate压缩编码和解码代码
2008/10/03 PHP
php addslashes和mysql_real_escape_string
2010/01/24 PHP
php单文件版在线代码编辑器
2015/03/12 PHP
基于PHP实现生成随机水印图片
2020/12/09 PHP
使用jQuery UI的tooltip函数修饰title属性的气泡悬浮框
2013/06/24 Javascript
javascript unicode与GBK2312(中文)编码转换方法
2013/11/14 Javascript
js获取某元素的class里面的css属性值代码
2014/01/16 Javascript
js数组方法扩展实现数组统计函数
2014/04/09 Javascript
js数组依据下标删除元素
2015/04/14 Javascript
jQuery实现图片向左向右切换效果的简单实例
2016/05/18 Javascript
JavaScript生成验证码并实现验证功能
2016/09/24 Javascript
xmlplus组件设计系列之网格(DataGrid)(10)
2017/05/05 Javascript
详解vue2父组件传递props异步数据到子组件的问题
2017/06/29 Javascript
AngularJS实现select的ng-options功能示例
2017/07/12 Javascript
Js和VUE实现跑马灯效果
2020/05/25 Javascript
零基础写python爬虫之抓取百度贴吧代码分享
2014/11/06 Python
Python中顺序表的实现简单代码分享
2018/01/09 Python
python八皇后问题的解决方法
2018/09/27 Python
解决Python中回文数和质数的问题
2019/11/24 Python
python报错: 'list' object has no attribute 'shape'的解决
2020/07/15 Python
python基于爬虫+django,打造个性化API接口
2021/01/21 Python
CSS3 选择器 伪类选择器介绍
2012/01/21 HTML / CSS
解决HTML5中滚动到底部的事件问题
2019/08/22 HTML / CSS
Joe Fresh官网:加拿大时尚品牌和零售连锁店
2016/11/30 全球购物
N:Philanthropy官网:美国洛杉矶基础款服装
2020/06/09 全球购物
事务机电主管工作职责
2014/02/25 职场文书
《守株待兔》教学反思
2014/03/01 职场文书
詹天佑教学反思
2014/04/30 职场文书
高中课前三分钟演讲稿
2014/08/18 职场文书
基层领导干部“四风”问题批评与自我批评
2014/09/23 职场文书
个人先进事迹材料
2014/12/29 职场文书
风之谷观后感
2015/06/11 职场文书
2016年清明节红领巾广播稿
2015/12/17 职场文书
导游词之吉林花园山
2019/10/17 职场文书
python基于机器学习预测股票交易信号
2021/05/25 Python