关联规则算法——apriori算法
引⾔
关联规则分析也称“购物篮”分析,最早是为了发现超市销售数据库中不同的商品之间的关联关系。
例如购买了⾯包的顾客同时⾮常有可能会购买⽜奶,这就导出了⼀条关联规则“⾯包=》⽜奶”,其中,⾯包称为规则的前项,⽜奶称为后项。通过对⾯包降低售价促销,适当提⾼⽜奶售价,关联销售出的⽜奶就有可能增加超市整体的利润。
常⽤的关联规则算法:
算法名称算法描述
apriori法最经典的挖掘频繁项集的算法,通过连接产⽣候选项及其⽀持度,然后通过剪枝⽣成频繁项集
灰⾊关联度法分析和确定各因素之间的影响程度或若⼲⼦因素对主因素的贡献度
理论部分
1.⽀持度:项集A,B同时发⽣的概率,也称相对⽀持度
A,B同时发⽣的事务数
Support(A⟹B)=P(A∪B)=所有的事务数
2.置信度:项集A发⽣,则项集B发⽣的概率
A,B同时发⽣的事务数
Confidence(A⟹B)=P(A∣B)=A发⽣的事务数
3.最⼩⽀持度和最⼩置信度是通过专家给出的,同时满⾜⼩于最⼩⽀持度阈值和最⼩置信度阈值的规则称为强规则。
4 通过计算1.和2.中的⽀持度和置信度,与给定的最⼩⽀持度阈值和最⼩置信度阈值⽐较可判断该规则是否为强规则。
5 频繁项集
如果项集I的相对⽀持度<;给定的最⼩⽀持度阈值,则称I是频繁项集
算法步骤
1.列出所有可能的项集
2.剪枝,将⼦集不是频繁项集的项集剔除
3.计算剪枝后的项集的⽀持度,去除<;最⼩⽀持度阈值的项集
案例
采取餐饮业实例,总共有10个订单,订单数据中包括客户序号和菜品id,a表⽰健康麦⾹包,b是排⾻粥,c是⾖浆,d是燕麦包,e是炒河粉。
txt数据如下(注:数据中没有客户序号):
a c e
b d
b c
a b c d
a b
b c
a b
a b c e
a b c
a c e
代码
代码有两个.py⽂件,⼀个是⾃定义的apriori1算法,⼀个apriori实现的代码。
1.apriori1算法
from __future__ import print_function
import pandas as pd
# ⾃定义连接函数,⽤于实现L_{k-1}到C_k的连接
def connect_string(x, ms):
x =list(map(lambda i:sorted(i.split(ms)), x))
l =len(x[0])
r =[]
for i in range(len(x)):
for j in range(i,len(x)):
if x[i][:l -1]== x[j][:l -1]and x[i][l -1]!= x[j][l -1]:
r.append(x[i][:l -1]+sorted([x[j][l -1], x[i][l -1]]))
return r
# 寻关联规则的函数
def find_rule(d, support, confidence, ms=u'--'):
result = pd.DataFrame(index=['support','confidence'])# 定义输出结果
support_series =1.0* d.sum()/len(d)# ⽀持度序列
column =list(support_series[support_series > support].index)# 初步根据⽀持度筛选
k =0
while len(column)>1:
k = k +1
connect和join的区别print(u'\n正在进⾏第%s次搜索...'% k)
column = connect_string(column, ms)
print(u'数⽬:%s...'%len(column))
sf =lambda i: d[i].prod(axis=1, numeric_only=True)# 新⼀批⽀持度的计算函数
# 创建连接数据,这⼀步耗时、耗内存最严重。当数据集较⼤时,可以考虑并⾏运算优化。
d_2 = pd.DataFrame(list(map(sf, column)), index=[ms.join(i)for i in column]).T
support_series_2 =1.0* d_2[[ms.join(i)for i in column]].sum()/len(d)# 计算连接后的⽀持度
column =list(support_series_2[support_series_2 > support].index)# 新⼀轮⽀持度筛选
support_series = support_series.append(support_series_2)
column2 =[]
for i in column:# 遍历可能的推理,如{A,B,C}究竟是A+B-->C还是B+C-->A还是C+A-->B?
i = i.split(ms)
for j in range(len(i)):
column2.append(i[:j]+ i[j +1:]+ i[j:j +1])
cofidence_series = pd.Series(index=[ms.join(i)for i in column2])# 定义置信度序列for i in column2:# 计算置信度序列
cofidence_series[ms.join(i)]= support_series[ms.join(sorted(i))]/ support_series[ms.join(i[:len(i)-1])] for i in cofidence_series[cofidence_series > confidence].index:# 置信度筛选
result[i]=0.0
result[i]['confidence']= cofidence_series[i]
result[i]['support']= support_series[ms.join(sorted(i.split(ms)))]
result = result.T.sort_values(['confidence','support'], ascending=False)# 结果整理,输出
print(u'\n结果为:')
print(result)
return result
2.apriori算法
#使⽤Apriori算法挖掘菜品订单关联规则
from __future__ import print_function
import pandas as pd
from apriori1 import*#导⼊⾃⾏编写的apriori函数
inputfile ='E:/未来⽅向/《Python数据分析与挖掘实战》源数据和代码.(1)/Python数据分析与挖掘实战/chapter5/demo/data/menu_orders.xls' outputfile ='E:/未来⽅向/《Python数据分析与挖掘实战》源数据和代码.(1)/Python数据分析与挖掘实战/chapter5/demo/data/apriori_rules.xls'#结果⽂件data = pd.read_excel(inputfile, header =None)
print(u'\n转换原始数据⾄0-1矩阵...')
ct =lambda x : pd.Series(1, index = ull(x)])#转换0-1矩阵的过渡函数
b =map(ct, data.values)#⽤map⽅式执⾏
print(b)
data = pd.DataFrame(list(b)).fillna(0)#实现矩阵转换,空值⽤0填充
print(u'\n转换完毕。')
del b #删除中间变量b,节省内存
support =0.2#最⼩⽀持度
confidence =0.5#最⼩置信度
ms ='---'#连接符,默认'--',⽤来区分不同元素,如A--B。需要保证原始表格中不含有该字符
find_rule(data, support, confidence, ms).to_excel(outputfile)#保存结果
结果展⽰
以第⼀条输出结果解释:客户同时点菜品e的同时点菜品a的概率为30%,先点菜品e,再点菜品a的概率为100%。
参考书⽬:《python数据分析与挖掘实战》 张良均.机械⼯业出版社
补充
该书中代码有些错误,可能是python版本等原因导致,本⽂中代码是本⼈调试后的版本。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。