前言

自己的一个Apriori 获取关联规则的python实现。具体原理不讲,代码添加了说明,还是很好理解的。

数据预处理

#最小置信度
min_conf = 0.5
#最小支持度
min_sup = 2
f=open('data.txt')
dataset = f.readlines()
print(dataset)
['T1\tbread, cream, milk, tea\n', 'T2\tbread, cream, milk\n', 'T3\tcake, milk\n', 'T4\tmilk, tea\n', 'T5\tbread, cake, milk\n', 'T6\tbread, tea\n', 'T7\tbeer, milk, tea\n', 'T8\tbread, tea\n', 'T9\tbread, cream, milk, tea\n', 'T10\tbread, milk, tea']
dataset = [data.replace('\n','').split('\t') for data in dataset]
print(dataset)
[['T1', 'bread, cream, milk, tea'], ['T2', 'bread, cream, milk'], ['T3', 'cake, milk'], ['T4', 'milk, tea'], ['T5', 'bread, cake, milk'], ['T6', 'bread, tea'], ['T7', 'beer, milk, tea'], ['T8', 'bread, tea'], ['T9', 'bread, cream, milk, tea'], ['T10', 'bread, milk, tea']]
dataset = [tuple([data[0],sorted(data[1].replace(' ', '').split(','))]) for data in dataset]
print(dataset)
[('T1', ['bread', 'cream', 'milk', 'tea']), ('T2', ['bread', 'cream', 'milk']), ('T3', ['cake', 'milk']), ('T4', ['milk', 'tea']), ('T5', ['bread', 'cake', 'milk']), ('T6', ['bread', 'tea']), ('T7', ['beer', 'milk', 'tea']), ('T8', ['bread', 'tea']), ('T9', ['bread', 'cream', 'milk', 'tea']), ('T10', ['bread', 'milk', 'tea'])]
terms = [term for data in dataset for term in data[1]]
terms.sort()
terms = [terms[i] for i in range(0,len(terms)) if i==0 or terms[i]!=terms[i-1]]
print(terms)
['beer', 'bread', 'cake', 'cream', 'milk', 'tea']

Aprior寻找频繁项集

def is_sub_seq(P, T):
'''判断P是否为T的子序列
Parameters
--------
P: 一个有序序列
T: 一个有序序列
'''
i, j = 0, 0
while(i<len(P) and j<len(T)):
if(P[i]==T[j]):
i+=1
j+=1
return i==len(P)
def Aprior_sieve(L):
'''从一个项集组成的序列中中筛选出频繁项集
Parameters
---
L: 一个项集组成的序列 Returns
---
一个频繁项集和它支持度组成的序列
'''
L = [[l,0] for l in L]
for l in L:
for data in dataset:
if(is_sub_seq(l[0], data[1])):
l[1] += 1
L = [l for l in L if l[1]>=minsup]
return L
def Aprior_gen(L,k):
'''通过k项集构造k+1项集
Parameters
---
L:一个频繁k项集和它支持度组成的序列
k:频繁k项集的项数 Returns
---
一个k+1项集组成的序列
'''
print(k,":\t",L)
NL = []
myset = {tuple(l[0]) for l in L}
for i in range(0, len(L)):
for j in range(i+1, len(L)):
if(L[i][0][:k-1]==L[j][0][:k-1]):
nl = L[i][0].copy()
nl.append(L[j][0][k-1])
ok = True
for r in range(0, k-1):
tmp = nl.copy()
tmp.pop(r)
tmp = tuple(tmp)
if(tmp not in myset):
ok = False
break
if(ok):
NL.append(nl)
else:
break
return NL
L = [[term] for term in terms]
L = Aprior_sieve(L)
print(L)
[[['bread'], 7], [['cake'], 2], [['cream'], 3], [['milk'], 8], [['tea'], 7]]
Ans = []
Ans.append(L)
for i in range(1,len(terms)):
L = Aprior_gen(Ans[i-1],i)
L = Aprior_sieve(L)
if(len(L)==0):
break
Ans.append(L)
print(Ans)
1 :	 [[['bread'], 7], [['cake'], 2], [['cream'], 3], [['milk'], 8], [['tea'], 7]]
2 : [[['bread', 'cream'], 3], [['bread', 'milk'], 5], [['bread', 'tea'], 5], [['cake', 'milk'], 2], [['cream', 'milk'], 3], [['cream', 'tea'], 2], [['milk', 'tea'], 5]]
3 : [[['bread', 'cream', 'milk'], 3], [['bread', 'cream', 'tea'], 2], [['bread', 'milk', 'tea'], 3], [['cream', 'milk', 'tea'], 2]]
4 : [[['bread', 'cream', 'milk', 'tea'], 2]]
[[[['bread'], 7], [['cake'], 2], [['cream'], 3], [['milk'], 8], [['tea'], 7]], [[['bread', 'cream'], 3], [['bread', 'milk'], 5], [['bread', 'tea'], 5], [['cake', 'milk'], 2], [['cream', 'milk'], 3], [['cream', 'tea'], 2], [['milk', 'tea'], 5]], [[['bread', 'cream', 'milk'], 3], [['bread', 'cream', 'tea'], 2], [['bread', 'milk', 'tea'], 3], [['cream', 'milk', 'tea'], 2]], [[['bread', 'cream', 'milk', 'tea'], 2]]]

获取关联规则

mydict = { tuple(l[0]):l[1] for i in range(0, len(Ans)) for l in Ans[i]}
print(mydict)
R=set()
{('bread',): 7, ('cake',): 2, ('cream',): 3, ('milk',): 8, ('tea',): 7, ('bread', 'cream'): 3, ('bread', 'milk'): 5, ('bread', 'tea'): 5, ('cake', 'milk'): 2, ('cream', 'milk'): 3, ('cream', 'tea'): 2, ('milk', 'tea'): 5, ('bread', 'cream', 'milk'): 3, ('bread', 'cream', 'tea'): 2, ('bread', 'milk', 'tea'): 3, ('cream', 'milk', 'tea'): 2, ('bread', 'cream', 'milk', 'tea'): 2}
def conf(rule):
return mydict[rule[1]]/mydict[rule[0]]
def gen_rule(X, Y):
for item in Y:
if item not in X:
nX = X.copy()
nX.append(item)
nX.sort()
rule = (tuple(nX),Y)
if(rule not in R and conf(rule)>=min_conf):
R.add(rule)
gen_rule(nX, Y)
for l in mydict.keys():
gen_rule([],l)
R = [(f, tuple(set(b)-set(f))) for f, b in R]
R.sort()
print(R)
[(('bread',), ()), (('bread',), ('milk',)), (('bread',), ('tea',)), (('bread', 'cream'), ()), (('bread', 'cream'), ('milk',)), (('bread', 'cream'), ('milk', 'tea')), (('bread', 'cream'), ('tea',)), (('bread', 'cream', 'milk'), ()), (('bread', 'cream', 'milk'), ('tea',)), (('bread', 'cream', 'milk', 'tea'), ()), (('bread', 'cream', 'tea'), ()), (('bread', 'cream', 'tea'), ('milk',)), (('bread', 'milk'), ()), (('bread', 'tea'), ()), (('cake',), ()), (('cake',), ('milk',)), (('cake', 'milk'), ()), (('cream',), ()), (('cream',), ('bread',)), (('cream',), ('bread', 'milk')), (('cream',), ('bread', 'milk', 'tea')), (('cream',), ('bread', 'tea')), (('cream',), ('milk',)), (('cream',), ('milk', 'tea')), (('cream',), ('tea',)), (('cream', 'milk'), ()), (('cream', 'milk'), ('bread',)), (('cream', 'milk'), ('bread', 'tea')), (('cream', 'milk'), ('tea',)), (('cream', 'milk', 'tea'), ()), (('cream', 'milk', 'tea'), ('bread',)), (('cream', 'tea'), ()), (('cream', 'tea'), ('bread',)), (('cream', 'tea'), ('bread', 'milk')), (('cream', 'tea'), ('milk',)), (('milk',), ()), (('milk',), ('bread',)), (('milk',), ('tea',)), (('milk', 'tea'), ()), (('tea',), ()), (('tea',), ('bread',)), (('tea',), ('milk',))]
print(len(mydict), len(R))
17 42

感想

算法的原理还是比较简单的,但实现起来还是要花些功夫。另外使用python的一些特性可以极大简化代码实现,如列表解析(学到了一种多重循环的解析),容器转换。踩了一波语法特性的坑,比如copy,dict的键为容器的话只能用tuple

Apriori 获取关联规则实现的更多相关文章

  1. 关联规则—频繁项集Apriori算法

    频繁模式和对应的关联或相关规则在一定程度上刻画了属性条件与类标号之间的有趣联系,因此将关联规则挖掘用于分类也会产生比较好的效果.关联规则就是在给定训练项集上频繁出现的项集与项集之间的一种紧密的联系.其 ...

  2. 一步步教你轻松学关联规则Apriori算法

    一步步教你轻松学关联规则Apriori算法 (白宁超 2018年10月22日09:51:05) 摘要:先验算法(Apriori Algorithm)是关联规则学习的经典算法之一,常常应用在商业等诸多领 ...

  3. apriori && fpgrowth:频繁模式与关联规则挖掘

    已迁移到我新博客,阅读体验更佳apriori && fpgrowth:频繁模式与关联规则挖掘 详细代码我放在github上:click me 一.实验说明 1.1 任务描述 1.2 数 ...

  4. 机器学习实战 - 读书笔记(11) - 使用Apriori算法进行关联分析

    前言 最近在看Peter Harrington写的"机器学习实战",这是我的学习心得,这次是第11章 - 使用Apriori算法进行关联分析. 基本概念 关联分析(associat ...

  5. 机器学习经典算法之Apriori

    一. 搞懂关联规则中的几个概念 关联规则这个概念,最早是由 Agrawal 等人在 1993 年提出的.在 1994 年 Agrawal 等人又提出了基于关联规则的 Apriori 算法,至今 Apr ...

  6. 【转载】Apriori

    通过这个博客学习:数据挖掘十大算法(四):Apriori(关联分析算法) 代码也是摘自上面博客,对照代码理解理论部分可能更加有助于对该算法的理解 from numpy import * # 构造数据 ...

  7. Apriori算法第一篇

    摘要: Apriori算法是产生k项高频项目组的一般手段.算法概要:首先产生k项高频项目集合Lk,自身链接形成k+1项的项目结合C(k+1),然后剪枝(去掉以前去掉的不满足支持度的高频),生成K=1项 ...

  8. 机器学习实战(Machine Learning in Action)学习笔记————07.使用Apriori算法进行关联分析

    机器学习实战(Machine Learning in Action)学习笔记————07.使用Apriori算法进行关联分析 关键字:Apriori.关联规则挖掘.频繁项集作者:米仓山下时间:2018 ...

  9. R_Studio(关联)对dvdtrans.csv数据进行关联规则分析

    dvdtrans.csv数据:该原始数据仅仅包含了两个字段(ID, Item) 用户ID,商品名称(共30条) #导入arules包 #install.packages("arules&qu ...

随机推荐

  1. 在金融服务计算中,必须要使用BigDecimal

    在Java程序开发过程中,比较初级(工作经验受限)的开发人员,把注意力全部放在了一些高大上的新技术中,往往忽略了一些初级问题.. 金融服务系统中,对金额的敏感至关重要,账户余额.还款金额.代收本金.代 ...

  2. Linux-- 文件编辑器 vi/vim(1)

    初识 vi/vim 文本编辑器 1.vi 和 vim 相同,都是文本编辑器,在 vi 模式下可以查看文本,编辑文本,是 Linux 最常用的命令,vi 模式下分为三部分,第一部分一般模式,在一般模式中 ...

  3. JS判断两个数字的大小

    javascript中定义的var类型是弱类型,默认是String类型,在比较两个数字大小的时候默认比较的是两个字符串,比如,在比较10和2时,按数字做比较10是比2大,可是按默认的字符串比较时,第一 ...

  4. BZOJ 3053: The Closest M Points(K-D Tree)

    Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1235  Solved: 418[Submit][Status][Discuss] Descripti ...

  5. string 模块

    string 说明:string 模块保留了很多有用的常量和类,用来处理 string 和 unicode 对象. 作用:包含处理文本的常量和类. capwords( ) capwords( ) 的作 ...

  6. EDID的简介和解析

    去年对EDID做了一个解析,下面是学习EDID过程中整理的资料. 一.EDID简介 EDID: Extended Display Identification Data (外部显示设备标识数据)--- ...

  7. Learning notes | Data Analysis: 1.1 data evaluation

    | Data Evaluation | - Use Shift + Enter or Shift + Return to run the upper box so as to make it disp ...

  8. 【树形DP】MZOJ_1063_士兵守卫

    本题也是这三天来在下写的几篇树形DP之一,但是不知道为什么洛谷上面老是unknown error,...直接去了UVa,说我编译错误...我在想是不是头文件的原因,于是被逼无奈,交了一道c89的代码. ...

  9. 111. Climbing Stairs 【LintCode easy】

    Description You are climbing a stair case. It takes n steps to reach to the top. Each time you can e ...

  10. Activemq首次运行报错 “找不到或无法加载主类”

    首次运行Program Files\apache-activemq-5.10.0\bin目录下的activemq.bat文件,报错信息如下: 找不到或无法加载主类 Files\apache-activ ...