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实现机器人行走效果
Jan 29 Python
Python字符串格式化%s%d%f详解
Feb 02 Python
Flask框架使用DBUtils模块连接数据库操作示例
Jul 20 Python
基于Django框架利用Ajax实现点赞功能实例代码
Aug 19 Python
python中dict字典的查询键值对 遍历 排序 创建 访问 更新 删除基础操作方法
Sep 13 Python
Python设计模式之桥接模式原理与用法实例分析
Jan 10 Python
使用django的ORM框架按月统计近一年内的数据方法
Jul 18 Python
对python 树状嵌套结构的实现思路详解
Aug 09 Python
Python3使用PySynth制作音乐的方法
Sep 09 Python
Python 列表的清空方式
Jan 13 Python
Pyqt5 关于流式布局和滚动条的综合使用示例代码
Mar 24 Python
python热力图实现简单方法
Jan 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
某大型网络公司应聘时的笔试题目附答案
2008/03/27 PHP
PHP 远程文件管理,可以给表格排序,遍历目录,时间排序
2009/08/07 PHP
基于PHP Socket配置以及实例的详细介绍
2013/06/13 PHP
解析smarty模板中类似for的功能实现
2013/06/18 PHP
PHP中func_get_args(),func_get_arg(),func_num_args()的区别
2013/09/30 PHP
如何写php守护进程(Daemon)
2015/12/30 PHP
PHP计算数组中值的和与乘积的方法(array_sum与array_product函数)
2016/04/01 PHP
php封装的smarty类完整实例
2016/10/19 PHP
JavaScript splice()方法详解
2020/09/22 Javascript
jQuery防止click双击多次提交及传递动态函数或多参数
2014/04/02 Javascript
究竟什么是Node.js?Node.js有什么好处?
2015/05/29 Javascript
基于Javascript实现弹出页面效果
2016/01/01 Javascript
基于javascript实现图片预加载
2016/01/05 Javascript
Vue.js 2.0中select级联下拉框实例
2017/03/06 Javascript
Vue实现virtual-dom的原理简析
2017/07/10 Javascript
JS实现问卷星自动填问卷脚本并在两秒自动提交功能
2020/06/17 Javascript
基于vue.js实现的分页
2018/03/13 Javascript
vue中$refs的用法及作用详解
2018/04/24 Javascript
vue框架制作购物车小球动画效果实例代码
2019/09/26 Javascript
react实现同页面三级跳转路由布局
2019/09/26 Javascript
JS操作json对象key、value的常用方法分析
2019/10/29 Javascript
vue实现将一个数组内的相同数据进行合并
2019/11/07 Javascript
Element-UI+Vue模式使用总结
2020/01/02 Javascript
微信小程序复选框实现多选一功能过程解析
2020/02/14 Javascript
vue中v-model对select的绑定操作
2020/08/31 Javascript
Python的re模块正则表达式操作
2016/05/25 Python
python函数中return后的语句一定不会执行吗?
2017/07/06 Python
Python 私有函数的实例详解
2017/09/11 Python
Python获取当前函数名称方法实例分享
2018/01/18 Python
Python用于学习重要算法的模块pygorithm实例浅析
2018/08/16 Python
kafka-python 获取topic lag值方式
2019/12/23 Python
解决python ThreadPoolExecutor 线程池中的异常捕获问题
2020/04/08 Python
基于python实现数组格式参数加密计算
2020/04/21 Python
干部现实表现材料
2014/02/13 职场文书
酒店秘书求职信范文
2014/02/17 职场文书
银行服务明星推荐材料
2014/05/29 职场文书