概述
一、一些概念
关联分析是一种在大规模数据集中寻找有趣关系的任务。这些关系有两种形式:
- 频繁项集:经常出现在一块的物品的集合。
- 关联规则:物品之间存在的关系。
- 支持度:数据集中包含该项集的记录所占的比例。
- 置信度:支持度({尿布、啤酒})/支持度({尿布})。
箭头左边是前件,箭头后面是后件。
二、Apriori
- 发现频繁项集
如果某个项集是频繁的,它的所有子集也是频繁的。如果一个项集是非频繁集,它的所有超集也是非频繁集。分为两步:连接步和剪枝步。- 挖掘关联规则
如果某条规则不满足最小可信度要求,那么该规则的所有子集也不满足。
三、聚类算法和关联规则区别
同:
- 都是无监督学习。
- 都可以把物品聚成一类一类。
异:
- 聚类是把相似的聚在一类,不同类中的不相似。
- 关联规则关注的不是相似度,而是因果关系,关联关系,频繁项集中的物品不是相似,而是总是一起出现。
四、关联规则高级用法
- 穿衣搭配推荐:预测给定商品的搭配商品集合。
- 依据用户轨迹的商户精准营销:对用户推送符合该用户画像的商户位置和其他优惠信息。
- 电子商务搭配购买推荐。
- 基于兴趣的实时新闻推荐:同一个用户浏览的不同新闻的内容之间会存在一定的相似性和关联。
- 银行金融客户交叉销售分析:通过对购买数据分析,发现交叉销售的机会。
- 交通事故成因分析:事故类型、事故人员、事故车辆、事故天气、驾照信息、驾驶人员犯罪记录数据以及其他数据,分析交通事故成因。
五、代码
def createC1(dataSet):
C1 = []
for transaction in dataSet:
for item in transaction:
if not [item] in C1:
C1.append([item])
C1.sort()
return list(map(frozenset, C1))
def scanD(D, Ck, minSupport):
ssCnt = {}
for tid in D:
for can in Ck:
if can.issubset(tid):
if not can in ssCnt:
ssCnt[can]=1
else:
ssCnt[can] += 1
numItems = float(len(D))
retList = []
supportData = {}
for key in ssCnt:
support = ssCnt[key] / numItems
if support >= minSupport:
retList.append(key)
supportData[key] = support
return retList, supportData
def aprioriGen(Lk, k): #creates Ck
retList = []
lenLk = len(Lk)
for i in range(lenLk):
for j in range(i+1, lenLk):
L1 = list(Lk[i])[:k-2]; L2 = list(Lk[j])[:k-2]
L1.sort(); L2.sort()
if L1==L2: #if first k-2 elements are equal
retList.append(Lk[i] | Lk[j]) #set union
return retList
# 获得频繁项集的主函数
def apriori(dataSet, minSupport = 0.001):
C1 = createC1(dataSet) #扫描所有dataSet,找到包含的所有item,放到C1中,每个item都搞成一个frozen set
D = list(map(set, dataSet)) #D中是所有的事务,每一个搞成一个set
L1, supportData = scanD(D, C1, minSupport) #返回C1中所有符合要求的L1,supportData记录了每一项的支持度
L = [L1]
k = 2
while (len(L[-1]) > 0):
print(k)
Ck = aprioriGen(L[-1], k) #返回所有的组合
Lk, supK = scanD(D, Ck, minSupport) #scan DB to get Lk
supportData.update(supK)
L.append(Lk)
k += 1
return L, supportData
# 获得频繁项集的主函数
def apriori(dataSet, minSupport = 0.001):
C1 = createC1(dataSet) #扫描所有dataSet,找到包含的所有item,放到C1中,每个item都搞成一个frozen set
D = list(map(set, dataSet)) #D中是所有的事务,每一个搞成一个set
L1, supportData = scanD(D, C1, minSupport) #返回C1中所有符合要求的L1,supportData记录了每一项的支持度
L = [L1]
k = 2
while (len(L[-1]) > 0):
print(k)
Ck = aprioriGen(L[-1], k) #返回所有的组合
Lk, supK = scanD(D, Ck, minSupport) #scan DB to get Lk
supportData.update(supK)
L.append(Lk)
k += 1
return L, supportData
def generateRules(L, supportData, minConf=0.01): #supportData is a dict coming from scanD
bigRuleList = []
for i in range(1, len(L)):#only get the sets with two or more items
for freqSet in L[i]:
H1 = [frozenset([item]) for item in freqSet]
if (i > 1):
rulesFromConseq(freqSet, H1, supportData, bigRuleList, minConf)
else:
calcConf(freqSet, H1, supportData, bigRuleList, minConf)
return bigRuleList
def calcConf(freqSet, H, supportData, brl, minConf=0.7):
prunedH = [] #create new list to return
for conseq in H:
conf = supportData[freqSet]/supportData[freqSet-conseq] #calc confidence
if conf >= minConf:
print(freqSet-conseq,'-->',conseq,'conf:',conf)
brl.append((freqSet-conseq, conseq, conf))
prunedH.append(conseq)
return prunedH
def rulesFromConseq(freqSet, H, supportData, brl, minConf=0.7):
m = len(H[0])
if (len(freqSet) > (m + 1)): #try further merging
Hmp1 = aprioriGen(H, m+1)#create Hm+1 new candidates
Hmp1 = calcConf(freqSet, Hmp1, supportData, brl, minConf)
if (len(Hmp1) > 1): #need at least two sets to merge
rulesFromConseq(freqSet, Hmp1, supportData, brl, minConf)
def pntRules(ruleList, itemMeaning):
for ruleTup in ruleList:
for item in ruleTup[0]:
print(itemMeaning[item])
print(" -------->")
for item in ruleTup[1]:
print(itemMeaning[item])
print("confidence: %f" % ruleTup[2])
print #print a blank line
最后
以上就是天真纸飞机为你收集整理的关联规则的全部内容,希望文章能够帮你解决关联规则所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复