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编写类UNIX系统的命令行工具的教程
Apr 15 Python
Python实现的栈(Stack)
Jan 26 Python
tensorflow实现简单的卷积神经网络
May 24 Python
python实现俄罗斯方块游戏
Mar 25 Python
Python中垃圾回收和del语句详解
Nov 15 Python
python使用Paramiko模块实现远程文件拷贝
Apr 30 Python
django框架使用views.py的函数对表进行增删改查内容操作详解【models.py中表的创建、views.py中函数的使用,基于对象的跨表查询】
Dec 12 Python
pytorch梯度剪裁方式
Feb 04 Python
用Python绘制漫步图实例讲解
Feb 26 Python
使用Matplotlib绘制不同颜色的带箭头的线实例
Apr 17 Python
pytorch 预训练模型读取修改相关参数的填坑问题
Jun 05 Python
python DataFrame中stack()方法、unstack()方法和pivot()方法浅析
Apr 06 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
php数据库密码的找回的步骤
2011/01/12 PHP
PHP文件上传判断file是否己选择上传文件的方法
2014/11/10 PHP
php中in_array函数用法探究
2014/11/25 PHP
PHP 设计模式系列之 specification规格模式
2016/01/10 PHP
PHP用continue跳过本次循环中剩余代码的注意点
2017/06/27 PHP
js实现页面打印功能实例代码(附去页眉页脚功能代码)
2009/12/15 Javascript
jQuery建立一个按字母顺序排列的友好页面索引(兼容IE6/7/8)
2013/02/26 Javascript
jquery text(),val(),html()方法区别总结
2013/11/04 Javascript
jquery 根据name名获取元素的value值
2015/02/27 Javascript
JS基础随笔(菜鸟必看篇)
2016/07/13 Javascript
浅谈DOCTYPE对$(window).height()取值的影响
2016/07/21 Javascript
js 获取本地文件及目录的方法(推荐)
2016/11/10 Javascript
详解bootstrap的modal-remote两种加载方式【强化】
2017/01/27 Javascript
backbone简介_动力节点Java学院整理
2017/07/14 Javascript
基于vue cli重构多页面脚手架过程详解
2018/01/23 Javascript
jQuery实现新闻播报滚动及淡入淡出效果示例
2018/03/23 jQuery
详解Next.js页面渲染的优化方案
2019/01/27 Javascript
jQuery实现经典的网页3D轮播图封装功能【附源码下载】
2019/02/15 jQuery
js单线程的本质 Event Loop解析
2019/10/29 Javascript
Js代码中的span拼接问题解决
2019/11/22 Javascript
浅谈Ant Design Pro 菜单自定义 icon
2020/11/17 Javascript
Python两个整数相除得到浮点数值的方法
2015/03/18 Python
Python编程中的for循环语句学习教程
2015/10/14 Python
解决Python出现_warn_unsafe_extraction问题的方法
2016/03/24 Python
Python3调用百度AI识别图片中的文字功能示例【测试可用】
2019/03/13 Python
python之信息加密题目详解
2019/06/26 Python
python实现输入三角形边长自动作图求面积案例
2020/04/12 Python
django haystack实现全文检索的示例代码
2020/06/24 Python
俄罗斯玩具、儿童用品、儿童服装和鞋子网上商店:MyToys.ru
2019/10/14 全球购物
力学专业毕业生自荐信
2013/11/17 职场文书
单位刻章介绍信范文
2014/01/11 职场文书
秦兵马俑教学反思
2014/02/07 职场文书
数控专业自荐书范文
2014/03/16 职场文书
vue-element-admin项目导入和导出的实现
2021/05/21 Vue.js
MySQL约束超详解
2021/09/04 MySQL
python人工智能human learn绘图可创建机器学习模型
2021/11/23 Python