代码注释:机器学习实战第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)
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)
相关文章推荐
- 机器学习实战代码详解(12)使用FP-growth算法来高效发现频繁集
- 代码注释:机器学习实战第12章 使用FP-growth算法来高效发现频繁项集
- 机器学习实战:KNN 代码注释(python)
- 读书笔记:机器学习实战(5)——章6的支持向量机代码和个人理解与注释
- 代码注释:机器学习实战第7章 利用AdaBoost元算法提高分类性能
- 代码注释:机器学习实战第5章 Logistic回归
- 机器学习实战 - 读书笔记(12) - 使用FP-growth算法来高效发现频繁项集
- 读书笔记:机器学习实战(3)——章4的朴素贝叶斯分类代码和个人理解与注释
- 代码注释:机器学习实战第6章 支持向量机
- 代码注释:机器学习实战第10章 利用K-均值聚类算法对未标注数据分组
- 代码注释:机器学习实战第8章 预测数值型数据:回归
- 代码注释:机器学习实战第2章 k-近邻算法
- 机器学习实战代码 第三章3-1注释
- 机器学习实战之KNN算法识别手写数字_代码注释
- 读书笔记:机器学习实战(1)——章2的knn代码和个人改进与注释
- 机器学习实战 第二章KNN(1)python代码及注释
- 代码注释:机器学习实战第4章 基于概率论的分类方法:朴素贝叶斯
- 机器学习实战_初识朴素贝叶斯算法_理解其python代码(一)
- 机器学习实战python版第三章决策树代码理解
- 使用注释来显示PDT中的PHP代码助手 -- 郁闷用了6个月才发现这个功能