关联分析:从大规模数据中寻找物品间的隐含关系
优点:易编码实现
缺点:在大数据集上可能较慢
适用数据类型:数值型或者标称型数据
频繁项集:经常出现在一起的物品集合
关联规则:暗示两种物品之间可能存在很强的关系
支持度(support):数据集中包含该项集的记录所占的比例
可信度(confidence):置信度相除
Apriori原理:某个项集是频繁的,则其所有子集也是频繁的。——如果一个项集是非频繁的,则他的所有超集也是非频繁的。
一、寻找频繁项集
def loadDataSet():
''' 用于测试的简单数据集 '''
return [[1, 3, 4], [2, 3, 5], [1, 2, 3, 5], [2, 5]]
def createC1(dataSet):
''' 创建集合C1,C1是大小为1的所有候选项集的集合 '''
C1 = []
for transaction in dataSet:
for item in transaction:
if not [item] in C1:
C1.append([item]) #添加的是列表,python不能生成有一个元素的集合,所以先用列表替代
C1.sort()
return map(frozenset, C1) #frozenset类型,元素不可变
def scanD(D, Ck, minSupport):
''' 生成频繁项集 '''
ssCnt = {}
for tid in D: #数据集中所有交易记录
for can in Ck: #C1中所有候选集
if can.issubset(tid):
if not ssCnt.has_key(can):
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.insert(0, key)
supportData[key] = support #最频繁项集的支持度
return retList, supportData
def aprioriGen(Lk, k):
''' 输入:频繁项集列表Lk,项集元素个数L 输出:Ck '''
retList = []
lenLk = len(Lk)
for i in range(lenLk):
for j in range(i + 1, lenLk): #前 k-2个项相同的时候,将两个集合合并
L1 = list(Lk[i])[: k-2]
L2 = list(Lk[j])[: k-2]
L1.sort()
L2.sort()
if L1 == L2:
retList.append(Lk[i] | Lk[j])
return retList
def apriori(dataSet, minSupport = 0.5):
''' 输入:一个数据集,一个支持度 输出:一个候选集列表 '''
C1 = createC1(dataSet) #首先生成候选集列表
D = map(set, dataSet)
L1, supportData = scanD(D, C1, minSupport)
L = [L1] #将L1放入列表L
k = 2
while len(L[k-2]) > 0:
Ck = aprioriGen(L[k-2], k)
Lk, supX = scanD(D, Ck, minSupport)
supportData.update(supX)
L.append(Lk)
k += 1
return L, supportData
dataSet = map(set, loadDataSet())
L, supportData = apriori(dataSet)
print L
print supportData
二、从频繁项集中挖掘关联规则
如果某条规则并不满足最小可信度要求,则该规则的所有子集也不会满足最小可信度要求。
def generateRules(L, supportData, minConf = 0.7):
''' 输入:频繁项集列表,包含频繁项集支持数据的字典,最小可信度阈值 输出:包含可信度的规则列表 '''
bigRuleList = []
for i in range(1, len(L)):
for freqSet in L[i]:
H1 = [frozenset([item]) for item in freqSet]
if(i > 1):
rulesFromConseq(freqSet, H1, supportData, bigRuleList, minConf)
else:
calConf(freqSet, H1, supportData, bigRuleList, minConf)
return bigRuleList
def calConf(freqSet, H, supportData, brl, minConf = 0.7):
''' 对规则进行评价 输出:满足最小可信度要求的规则列表 '''
prunedH = []
for conseq in H: #遍历H中的所有项集并计算它们的可信度值
conf = supportData[freqSet] / supportData[freqSet - conseq]
if conf >= minConf:
print freqSet - conseq, '-->', conseq, 'conf:', conf
brl.append((freqSet - conseq, conseq, conf))
prunedH.append(conseq)
return prunedH
def rulesFromConseq(freqSet, H, suppportData, brl, minConf = 0.7):
''' 生成候选规则集 '''
m = len(H[0]) #计算H中频繁集的大小m
if len(freqSet) > (m + 1):
Hmp1 = aprioriGen(H, m + 1) #生成H 中元素的无重复组合
Hmp1 = calConf(freqSet, Hmp1, supportData, brl, minConf)
if len(Hmp1) > 1:
rulesFromConseq(freqSet, Hmp1, suppportData, brl, minConf)
bigRulesList = generateRules(L, supportData)
print bigRulesList
总结一下:关联分析是用于发现大数据集中元素间有趣关系的一个工具集,可以采用两种方式来量化这些有趣的关系。
第一种方式是使用频繁项集,它会给出经常一起出现的元素项。
第二种方式是关联规则,每条关联规则意味着元素间的“如果。。。那么。。。”的关系。