频繁项集--同时出现频率较高的特征集合
关联规则--不同特征间关系较强
支持度--项集在数据集中所占比例
置信度--关联规则的支持度与单个特征支持度的比值
举个例子,假设NBA全明星连续五日的观众投票最佳阵容如下:
Date | PG | SG | SF | PF | C |
2.1 | 库里 | 哈登 | 詹姆斯 | 字母哥 | 约基奇 |
2.2 | 欧文 | 哈登 | 杜兰特 | 浓眉 | 约基奇 |
2.3 | 库里 | 东契奇 | 杜兰特 | 浓眉 | 恩比德 |
2.4 | 欧文 | 哈登 | 詹姆斯 | 字母哥 | 恩比德 |
2.5 | 欧文 | 哈登 | 杜兰特 | 字母哥 | 约基奇 |
哈登的支持度=4/5;杜兰特的支持度=3/5
频繁项集{欧文、哈登}的支持度=3/5
那么有哈登,则有欧文这条关联规则的置信度=(3/5)/(4/5)=3/4
Apriori原理:如果某个项集是频繁的,那么他的子集也是频繁的;如果某个项集是非频繁的,那么他的超集也是非频繁的。例如{哈登、欧文}是频繁的,那么哈登、欧文都是频繁的;而浓眉是非频繁的,那么浓眉和所有人的搭配都是非频繁的。
Apriori算法的代码实现如下:
#合并小项集,生成k元素项集
def aprioriGen(Lk, k):
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:
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]
k = 2
while (len(L[k-2]) > 0):
Ck = aprioriGen(L[k-2], k)
Lk, supK = scanD(D, Ck, minSupport)
supportData.update(supK)
L.append(Lk)
k += 1
return L, supportData