使用python挖掘频繁项集
本实验包含以下内容:
学习挖掘频繁项集,掌握apriori算法
1.实现用apriori算法挖掘频繁项集(最小支持度计数2)
2.分析你所实现的apriori算法的缺点
3. 数据集:
TID | 项集 |
---|---|
T100 | I1,I2,I5 |
T200 | I2,I4 |
T300 | I2,I3 |
T400 | I1,I2,I4 |
T500 | I1,I3 |
T600 | I2,I3 |
T700 | I1,I3 |
T800 | I1,I2,I3,I5 |
T900 | I1,I2,I3 |
代码如下:
# 录入数据
def data_fetch():data = [['l1', 'l2', 'l5'],['l2', 'l4'],['l2', 'l3'],['l1', 'l2', 'l4'],['l1', 'l3'],['l2', 'l3'],['l1', 'l3'],['l1', 'l2', 'l3', 'l5'],['l1', 'l2', 'l3']]return data# 根据项目,寻找支持度计数
def xunzhao(s, L):k = len(s) - 1 # 根据项目长度,决定在频繁几项集中寻找if k < 0: # s为空的情况print(s, '不是有效输入')# 标志变量,如果s中的项目有和当前比较的不同的,就置0;t = 0for i in range(len(L[k])): # 遍历频繁k项集t = 1for j in range(k + 1): # 开始比较是不是该项目if L[k][i][0][j] != s[j]:t = 0breakif t:return L[k][i][1] # 是的话,返回该项目的支持度计数print('未找到') # 遍历结束的话说明未找到return -1 # 返回 -1 (无)# 得到划分,并顺便求出置信度
def huafen(L, l, conf): # 划分得到置信度X = l[0] # 需要划分的列表lx = len(X) # 长度# 用二进制的性质求真子集for i in range(1, 2 ** lx - 1):s1 = []s2 = []for j in range(lx):# 二进制末尾是0就进s1,否则就进s2达到划分目的if (i >> j) % 2:s1.append(X[j])else:s2.append(X[j])conf[str(s1), '->', str(s2)] = l[1] / xunzhao(s1, L)# 判断s中的数据在data中的数目
def jishu(s, data):c = 0 # 记录出现数目# 标志变量,如果s中的数据有在data这一行不存在的,就置0;t = 0for ii in data: # 数据每一行t = 1for jj in s: # 对于 s 中的每一个项if not (jj in ii):t = 0breakc += t # 如果 s 在这一行存在,c++return c# 输入频繁k-1项集,支持度计数,数据,输出频繁k项集
def Apriori(L, N, data):if not L:return LL_ = [] # 频繁k项集L = [i[0] for i in L] # k-1项集包含哪些k = len(L[0]) + 1 # 几项集L_len = len(L)up = k - 2 # 拼接同项长度i = 0while i < L_len - 1: # 只剩最后一个时肯定没法拼A = L[i][0:up] # 拼接前项c = i # 记录走到那个前项了i += 1 # i 到下一个for j in range(c + 1, L_len):if L[j][0:up] != A: # 前几项不一致就停止i = j # i 快进到发现新键值的地方breakelse: # 前几项一致时s = L[c] + L[j][up:] # 生成预选项t = jishu(s, data) # 得到 s 的支持度计数if t >= N: # 支持度计数大于NL_.append([s, t]) # 添加到频繁项集中return L_data = data_fetch() # 生成数据,存到data
N = 2 # 支持度计数
L = {} # 储存一项集
for i in data: # 得到所有的一项集for j in i:if j in L:L[j] += 1else:L[j] = 1
L_1 = [] # 储存频繁一项集
for i in L.keys(): # 取其中所有的频繁集if L[i] >= N:L_1.append([[i], L[i]])
L = [] # 频繁1~4项集
L.append(sorted(L_1, key=lambda x: x[0])) # 按键值排序转为列表
print('频繁 1 项集', L[0])
for i in range(3):L.append(Apriori(L[i], N, data)) # 求频繁2项集print('频繁', i + 2, '项集', L[i + 1])
# 置信度计算 ===============================================
conf = {} # 储存置信度
# 对每一个k项集分析
print('置信度:============================================')
for i in L[1:len(L)]: # 频繁1项集不用看for j in i:huafen(L, j, conf) # 划分得到置信度
for key in conf:print(key,conf[key]*100,'%')
结果示例:
频繁 1 项集 [[['l1'], 6], [['l2'], 7], [['l3'], 6], [['l4'], 2], [['l5'], 2]]
频繁 2 项集 [[['l1', 'l2'], 4], [['l1', 'l3'], 4], [['l1', 'l5'], 2], [['l2', 'l3'], 4], [['l2', 'l4'], 2], [['l2', 'l5'], 2]]
频繁 3 项集 [[['l1', 'l2', 'l3'], 2], [['l1', 'l2', 'l5'], 2]]
频繁 4 项集 []
置信度:============================================
("['l1']", '->', "['l2']") 66.66666666666666 %
("['l2']", '->', "['l1']") 57.14285714285714 %
("['l1']", '->', "['l3']") 66.66666666666666 %
("['l3']", '->', "['l1']") 66.66666666666666 %
("['l1']", '->', "['l5']") 33.33333333333333 %
("['l5']", '->', "['l1']") 100.0 %
("['l2']", '->', "['l3']") 57.14285714285714 %
("['l3']", '->', "['l2']") 66.66666666666666 %
("['l2']", '->', "['l4']") 28.57142857142857 %
("['l4']", '->', "['l2']") 100.0 %
("['l2']", '->', "['l5']") 28.57142857142857 %
("['l5']", '->', "['l2']") 100.0 %
("['l1']", '->', "['l2', 'l3']") 33.33333333333333 %
("['l2']", '->', "['l1', 'l3']") 28.57142857142857 %
("['l1', 'l2']", '->', "['l3']") 50.0 %
("['l3']", '->', "['l1', 'l2']") 33.33333333333333 %
("['l1', 'l3']", '->', "['l2']") 50.0 %
("['l2', 'l3']", '->', "['l1']") 50.0 %
("['l1']", '->', "['l2', 'l5']") 33.33333333333333 %
("['l2']", '->', "['l1', 'l5']") 28.57142857142857 %
("['l1', 'l2']", '->', "['l5']") 50.0 %
("['l5']", '->', "['l1', 'l2']") 100.0 %
("['l1', 'l5']", '->', "['l2']") 100.0 %
("['l2', 'l5']", '->', "['l1']") 100.0 %进程已结束,退出代码为 0
总结:
生成备选频繁项集时,没有充分利用频繁项集的子集也属于频繁项集的性质,导致有一些冗余。
使用python挖掘频繁项集相关推荐
- 河北工业大学数据挖掘实验三 应用 Apriori 算法挖掘频繁项集
河北工业大学数据挖掘实验三 应用 Apriori 算法挖掘频繁项集 一.实验目的 二.实验原理 1.Apriori 算法 2.提高频繁项集逐层产生的效率 三.实验内容和步骤 1.实验内容 2.实验步骤 ...
- python 频繁项集_Apriori算法:从数据中挖掘频繁项集
简介 Apriori是一种流行的算法,用于在关联规则学习中提取频繁项集.Apriori算法被设计用于对包含交易的数据库进行操作,例如商店客户的购买.如果项目集满足用户指定的支持阈值,则该项目集被视为& ...
- Apriori算法挖掘频繁项集
用Apriori或者FP-growth算法挖掘出所有的频繁项集,并写出具体的实现代码.假设事务数据库D表1:最小支持度计数为2. 下图是以Apriori算法为例. 表1 事务数据库D Ti ...
- FP-growth:从FP树中挖掘频繁项集
前言 若想具体理解FP-growth,请参阅这位大神的作品: https://www.cnblogs.com/pinard/p/6307064.html 本文的前一节<FP-growth:构建F ...
- 基于Python的购物篮频繁项集数据挖掘分析系统
目 录 第一章 绪论 1 1.1 选题背景与研究意义 1 1.2 应用领域 1 1.3 主要研究内容 2 1.4 论文组织结构 2 第二章 理论基础 4 2.1 数据挖掘 4 2.2 频繁项集 5 2 ...
- 频繁项集挖掘之apriori和fp-growth
Apriori和fp-growth是频繁项集(frequent itemset mining)挖掘中的两个经典算法,主要的区别在于一个是广度优先的方式,另一个是深度优先的方式,后一种是基于前一种效率较 ...
- 频繁项集挖掘算法——Eclat算法
前面介绍过的Apriori算法和FP-growth算法都是从TID项集格式(即{TID:itemset})的事务集中挖掘频繁模式,其中TID是事务标识符,而itemset是事务TID中购买的商品.这种 ...
- 数据挖掘之Apriori频繁项集挖掘
本文的代码文件原件可以在我们的 "数据臭皮匠" 中输入"第六章1" 拿到 1.基本概念介绍 频繁项集和关联规则的挖掘首先需要了解一些概念, 如支持度, 置信度, ...
- python 频繁项集_频繁项集算法Eclat
Equivalence Class Transformation(Eclat)是频繁项挖掘和关联性分析的另外一种常用的算法,与Apriori和FP-growth不同的是,Eclat采用垂直数据格式.所 ...
最新文章
- 第02课:深度学习 Python 必备知识点
- python爬取豆瓣电影top250_Python爬虫 - scrapy - 爬取豆瓣电影TOP250
- 数值的加减会改变python中id,在python中调用Nan值并更改为数字
- php protected const,关于const:PHP类常量 – 公共,私有还是受保护?
- 问题的分析与解决(培训总结)
- ECshop新手入门模板制作教程[转载]
- 计算机画图虚线,天正建筑怎么把直线变成虚线
- php设备巡检管理,设备巡检管理:你必须知道的4个玩法
- it是什么行业?具体又包括哪些细分领域呢?
- 什么样的文案才算是好文案?
- 【JavaScript 逆向】webpack 之某妹游戏登录逆向
- 行业报告归档 2017.3.21
- win7c盘空间越来越小:C盘哪些文件可以清理删除呢
- 关于CAJViewer阅读器如何修改做标记的颜色?
- RFID防盗安全门在图书馆的应用
- 推荐六个在线生成网址二维码的API接口
- MFC开发之静态文本框实现编辑框滚动显示文字效果
- Unity3D游戏编程-鼠标打飞碟
- 用计算机写一份心得体会,计算机心得体会范文
- 公司安排不合理的出差,可以不同意吗