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 Unittest自动化单元测试框架详解
Apr 04 Python
Python基于pandas实现json格式转换成dataframe的方法
Jun 22 Python
Flask模拟实现CSRF攻击的方法
Jul 24 Python
Python大数据之从网页上爬取数据的方法详解
Nov 16 Python
Python timeit模块的使用实践
Jan 13 Python
在keras中获取某一层上的feature map实例
Jan 24 Python
使用Bazel编译TensorBoard教程
Feb 15 Python
Python yield生成器和return对比代码实例
Apr 20 Python
Django+Celery实现动态配置定时任务的方法示例
May 26 Python
pyCharm 设置调试输出窗口中文显示方式(字符码转换)
Jun 09 Python
python 多线程中join()的作用
Oct 29 Python
GitHub上值得推荐的8个python 项目
Oct 30 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的FTP学习(四)
2006/10/09 PHP
PHP 网站修改默认访问文件的nginx配置
2017/05/27 PHP
php+mysql开发中的经验与常识小结
2019/03/25 PHP
PHP获取远程http或ftp文件的md5值的方法
2019/04/15 PHP
PHP 使用位运算实现四则运算的代码
2021/03/09 PHP
开发跨浏览器javascript常见注意事项
2009/01/01 Javascript
window.location.hash 使用说明
2010/11/08 Javascript
JS定时器实例详细分析
2013/10/11 Javascript
jQuery ajax调用WCF服务实例
2014/07/16 Javascript
一个小例子解释如何来阻止Jquery事件冒泡
2014/07/17 Javascript
DOM基础教程之事件类型
2015/01/20 Javascript
jQuery实现跨域iframe接口方法调用
2015/03/14 Javascript
jQuery实现360°全景拖动展示
2015/03/18 Javascript
JavaScript实现单击网页任意位置打开新窗口与关闭窗口的方法
2017/09/21 Javascript
vue使用keep-alive实现数据缓存不刷新
2017/10/21 Javascript
webpack热模块替换(HMR)/热更新的方法
2018/04/05 Javascript
Javascript实现运算符重载详解
2018/04/07 Javascript
JS使用setInterval实现的简单计时器功能示例
2018/04/19 Javascript
Vue写一个简单的倒计时按钮功能
2018/04/20 Javascript
jQuery实现基本淡入淡出效果的方法详解
2018/09/05 jQuery
使用next.js开发网址缩短服务的方法
2020/06/17 Javascript
python中异常捕获方法详解
2017/03/03 Python
pyspark.sql.DataFrame与pandas.DataFrame之间的相互转换实例
2018/08/02 Python
python实现可逆简单的加密算法
2019/03/22 Python
英国可持续奢侈品包包品牌:Elvis & Kresse
2018/08/05 全球购物
俄罗斯连接商品和买家的在线平台:goods.ru
2020/11/30 全球购物
大一学生的职业生涯规划书范文
2014/01/19 职场文书
私人会所最新创业计划书范文
2014/03/24 职场文书
银行内勤岗位职责
2014/04/09 职场文书
期末学生评语大全
2014/04/24 职场文书
环保倡议书300字
2014/05/15 职场文书
大学运动会加油稿200字(5篇)
2014/09/27 职场文书
国家税务局领导班子对照检查材料思想汇报
2014/10/04 职场文书
成绩单家长意见
2015/06/03 职场文书
MySql 缓存查询原理与缓存监控和索引监控介绍
2021/07/02 MySQL
win10重装系统后上不了网怎么办 win10重装系统网络故障的解决办法
2022/07/23 数码科技