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 相关文章推荐
wxPython中文教程入门实例
Jun 09 Python
python集合类型用法分析
Apr 08 Python
分享Python文本生成二维码实例
Jan 06 Python
Python代码解决RenderView窗口not found问题
Aug 28 Python
Python程序退出方式小结
Dec 09 Python
Python随机生成均匀分布在三角形内或者任意多边形内的点
Dec 14 Python
python中set()函数简介及实例解析
Jan 09 Python
Django项目中model的数据处理以及页面交互方法
May 30 Python
python实现排序算法解析
Sep 08 Python
python自动化unittest yaml使用过程解析
Feb 03 Python
python使用openpyxl操作excel的方法步骤
May 28 Python
python的html标准库
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
模拟OICQ的实现思路和核心程序(三)
2006/10/09 PHP
解析posix与perl标准的正则表达式区别
2013/06/17 PHP
php输入流php://input使用示例(php发送图片流到服务器)
2013/12/25 PHP
php mb_substr()函数截取中文字符串应用示例
2014/07/29 PHP
PHP中加密解密函数与DES加密解密实例
2014/10/17 PHP
PHP计算指定日期所在周的开始和结束日期的方法
2015/03/24 PHP
php递归实现无限分类的方法
2015/07/28 PHP
thinkPHP自定义类实现方法详解
2016/11/30 PHP
javascript 强制刷新页面的实现代码
2009/12/13 Javascript
node.js中的fs.fsync方法使用说明
2014/12/15 Javascript
学习Bootstrap组件之下拉菜单
2015/07/28 Javascript
很全面的JavaScript常用功能汇总集合
2016/01/22 Javascript
浅谈vue引用静态资源需要注意的事项
2018/09/28 Javascript
Javascript中弹窗confirm与prompt的区别
2018/10/26 Javascript
js实现select下拉框选择
2020/01/11 Javascript
[01:04]DOTA2上海特锦赛现场采访 FreeAgain遭众解说围攻
2016/03/25 DOTA
python登录豆瓣并发帖的方法
2015/07/08 Python
python获取元素在数组中索引号的方法
2015/07/15 Python
Python实现k-means算法
2018/02/23 Python
python实现图书管理系统
2018/03/12 Python
Python对CSV、Excel、txt、dat文件的处理
2018/09/18 Python
Python统计一个字符串中每个字符出现了多少次的方法【字符串转换为列表再统计】
2019/05/05 Python
Python 经典算法100及解析(小结)
2019/09/13 Python
python创建子类的方法分析
2019/11/28 Python
利用scikitlearn画ROC曲线实例
2020/07/02 Python
浅析python中的del用法
2020/09/02 Python
舒适的豪华鞋:Taryn Rose
2018/05/03 全球购物
美国传奇滑手Paul Rodriguez创办的街头滑板品牌:Primitive Skateboarding
2019/10/29 全球购物
计算机应用与科学个人的自我评价
2013/11/15 职场文书
贫民窟的百万富翁观后感
2015/06/09 职场文书
永远是春天观后感
2015/06/12 职场文书
演讲稿之开卷有益
2019/08/07 职场文书
python使用pywinauto驱动微信客户端实现公众号爬虫
2021/05/19 Python
教你利用python实现企业微信发送消息
2021/05/23 Python
Eclipse+Java+Swing+Mysql实现电影购票系统(详细代码)
2022/01/18 Java/Android
零基础学java之循环语句的使用
2022/04/10 Java/Android