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数据类型判断及列表脚本操作
Nov 04 Python
利用Python脚本生成sitemap.xml的实现方法
Jan 31 Python
python ansible服务及剧本编写
Dec 29 Python
python2.7 json 转换日期的处理的示例
Mar 07 Python
python实现对指定输入的字符串逆序输出的6种方法
Apr 26 Python
python利用ffmpeg进行录制屏幕的方法
Jan 10 Python
python3安装crypto出错及解决方法
Jul 30 Python
Python如何使用正则表达式爬取京东商品信息
Jun 01 Python
keras K.function获取某层的输出操作
Jun 29 Python
sqlalchemy实现时间列自动更新教程
Sep 02 Python
Pycharm2020最新激活码|永久激活(附最新激活码和插件的详细教程)
Sep 29 Python
python疲劳驾驶困倦低头检测功能的实现
Apr 04 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个人网站架设连环讲(二)
2006/10/09 PHP
如何使用Gitblog和Markdown建自己的博客
2015/07/31 PHP
PHP经典面试题之设计模式(经常遇到)
2015/10/15 PHP
详解PHP的Yii框架中的Controller控制器
2016/03/29 PHP
PHP中ajax无刷新上传图片与图片下载功能
2017/02/21 PHP
php文件包含的几种方式总结
2019/09/19 PHP
PHP7原生MySQL数据库操作实现代码
2020/07/03 PHP
Javascript中的window.event.keyCode使用介绍
2011/04/26 Javascript
JavaScript prototype属性深入介绍
2012/11/27 Javascript
jQuery之排序组件的深入解析
2013/06/19 Javascript
javascript中的self和this用法小结
2014/02/08 Javascript
滚动条响应鼠标滑轮事件实现上下滚动的js代码
2014/06/30 Javascript
一个php+js实时显示时间问题
2015/10/12 Javascript
JavaScript 中 apply 、call 的详解
2017/03/21 Javascript
自定义vue全局组件use使用、vuex的使用详解
2017/06/14 Javascript
浅谈Angular 的变化检测的方法
2018/03/01 Javascript
使用NestJS开发Node.js应用的方法
2018/12/03 Javascript
js实现简单掷骰子效果
2019/10/24 Javascript
OpenLayers3实现鼠标移动显示坐标
2020/09/25 Javascript
python解析xml文件实例分析
2015/05/27 Python
深入浅析python定时杀进程
2016/06/06 Python
Selenium控制浏览器常见操作示例
2018/08/13 Python
Python数据类型之Set集合实例详解
2019/05/07 Python
在Python函数中输入任意数量参数的实例
2019/07/16 Python
python实现经纬度采样的示例代码
2020/12/10 Python
印度尼西亚最完整和最大的在线药房网站:Farmaku.com
2019/11/23 全球购物
劳资员岗位职责
2013/11/11 职场文书
高中生职业生涯规划书
2014/02/24 职场文书
小学英语教师先进事迹
2014/05/28 职场文书
消防工作实施方案
2014/06/09 职场文书
学生检讨书
2015/01/27 职场文书
秦始皇兵马俑导游词
2015/02/02 职场文书
2015年公司保安年终工作总结
2015/05/14 职场文书
房产电话营销开场白
2015/05/29 职场文书
kubernetes集群搭建Zabbix监控平台的详细过程
2022/07/07 Servers
Redis主从复制操作和配置详情
2022/09/23 Redis