您的位置:首页 > 编程语言

代码注释:机器学习实战第11章 使用Apriori算法来发现频繁集

2017-04-04 19:52 447 查看
写在开头的话:在学习《机器学习实战》的过程中发现书中很多代码并没有注释,这对新入门的同学是一个挑战,特此贴出我对代码做出的注释,仅供参考,欢迎指正。

1、发现频繁集

#coding:gbk

#作用:导入数据
#输入:无
#输出:数据集
def loadDataSet():
return [[1, 3, 4], [2, 3, 5], [1, 2, 3, 5], [2, 5]]

#作用:构建所有候选项集的集合
#输入:数据集
#输出:所有候选项集的集合
def createC1(dataSet):
C1 = []
for transaction in dataSet:
for item in transaction:
if not [item] in C1:
C1.append([item])
C1.sort()
#对C1中每个项构建一个不变集合,之后可以将这些集合作为字典键值使用
return map(frozenset, C1)#forzenset()是冻结的集合,是不可变的,存在哈希值

#作用:找出满足最低要求的相集
#输入:数据集,候选项集列表,感兴趣项集的最小支持度
#输出:满足最低要求的相集
def scanD(D, Ck, minSupport):
ssCnt = {}
#如果Ck是D的一部分,则增加字典中对应的计数值
for tid in D:
for can in Ck:
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

#作用:创建候选项集Ck
#输入:频繁项集列表Lk,项集元素个数k
#输出:候选项集Ck
def aprioriGen(Lk, k):
retList = []
lenLk = len(Lk)
for i in range(lenLk):
#j从i+1开始,防止出现j小于i的情况,多建立相同候选项集
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]
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

2、挖掘关联规则

#作用:关联规则生成主函数
#输入:频繁项集,项集的支持度值,最小可信度阈值
#输出:包含可信度的规则列表
def generateRules(L, supportData, minConf = 0.7):
bigRuleList = []
for i in range(1, len(L)):#无法从单元素项集中构建关联规则,因此舍弃i=0的情况
for freqSet in L[i]:
H1 = [frozenset([item]) for item in freqSet]#H1将集合freqSet化为集合的列表
if (i > 1):
rulesFromConseq(freqSet, H1, supportData, bigRuleList, minConf)
#只计算i = 1部分
else:
calcConf(freqSet, H1, supportData, bigRuleList, minConf)
return bigRuleList

#作用:计算可信度
#输入:
#输出:
def calcConf(freqSet, H, supportData, br1, minConf = 0.7):
prunedH = []
for conseq in H:
conf = supportData[freqSet] / supportData[freqSet - conseq]
if conf >= minConf:
print freqSet - conseq, '-->', conseq, 'conf:', conf
br1.append((freqSet - conseq, conseq, conf))
prunedH.append(conseq)
return prunedH

#作用:没有看懂这个函数
#输入:
#输出:
def rulesFromConseq(freqSet, H, supportData, br1, minConf = 0.7):
m = len(H[0])#计算频繁集的大小
if (len(freqSet) > (m + 1)):
Hmp1 = aprioriGen(H, m + 1)
Hmp1 = calcConf(freqSet, Hmp1, supportData, br1, minConf)
if (len(Hmp1) > 1):
rulesFromConseq(freqSet, Hmp1, supportData, br1, minConf)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  机器学习 注释
相关文章推荐