机器学习算法学习---关联分析算法(二)

FP-growth算法只需要对数据库进行两次扫描,故速度要比Apriori算法快。

发现频繁项集的基本过程:(1)构建FP树;(2)从FP树中挖掘频繁项集。

优点:一般要快于Apriori

缺点:实现比较困难,在某些数据集上性能会下降

适用数据:标称型

1、FP树:用于编码数据集的有效方式

FP代表频繁模式(Frequent Pattern)。FP树看上去与其他树类似,但是它通过链接来连接相似元素,被连起来的元素项可以看成一个链表。一个元素项可以在一棵FP树中出现多次;FP树会存储项集的出现频率,而每个项集会以路径的方式存储在树中。存在相似元素的集合会共享树的一部分;只有当集合之间完全不同时,树才会分叉。树节点上给出集合中的单个元素及其在序列中的出现次数,路径会给出该序列的出现次数。

相似项之间的链接即节点链接,用于快速发现相似项的位置。

算法流程:首先构建FP树,然后利用它来挖掘频繁项集。

构建FP树需要对原始数据集扫描两遍:第一遍对所有元素项的出现次数进行计数,根据Apriori原理,排除非频繁元素项;第二遍只考虑频繁元素构建树。

2、构建FP树

(1)创建存储其的数据结构

利用python类进行定义,具体定义如下:

 

FP树的定义
class treeNode:
def __init__(self, nameValue,numOccur,parentNode):
self.name = nameValue
self.count = numOccur
self.nodeLink = None
self.parent = parentNode
self.children = {}
def inc(self,numOccur):
self.count += numOccur
def disp(self,ind=1):
print(' '*ind,self.name,' ',self.count)
for child in self.children.values():
child.disp(ind+1)

 

(2)构建

除了FP树,还需一个头指针表来指向给定类型的第一个实例。

可以使用字典保存头指针表。除了存放指针,头指针表还可以用来保存FP树中每类元素的总数。

为了使相同项不会重复出现在树中,在将集合添加到树之前,需要对每个集合进行排序。排序基于元素项的绝对出现频率来进行。

基本思想:从空集开始,向其中不断添加频繁项集;过滤、排序后的事物依次添加到树中,如果树中已存在现有元素,则增加现有元素的值;如果现有元素不存在,则向树添加一个分枝。

python实现如下:

 

构建
def createTree(dataSet,minSup=1):
headerTable={}
for trans in dataSet:
for item in trans:
headerTable[item] = headerTable.get(item,0) + dataSet[trans]
for k in headerTable.keys():
if headerTable[k]<minSup:
del headerTable[k]
freqItemSet = set(headerTable.keys())
if len(freqItemSet)==0:
return None,None
for k in headerTable:
headerTable[k] = [headerTable[k],None]
retTree = treeNode('NullSet',1,None)
for tranSet,count in dataSet.items():
localD = {}
for item in tranSet:
if item in freqItemSet:
localD[item] = headerTable[item][0]
if len(localD) > 0:
orderedItems = [v[0] for v in sorted(localD.items(),key=lambda p:p[1],reverse=True)]
updateTree(orderedItems,retTree,headerTable,count)
return retTree,headerTable
def updateTree(items,inTree,headerTable,count):#更新FP树
if items[0] in inTree.children:
inTree.children[items[0]].inc(count)
else:
inTree.children[items[0]] = treeNode(items[0],count,inTree)
if headerTable[items[0]][1]==None:
headerTable[items[0]][1] = inTree.children[items[0]]
else:
updateHeader(headerTable[items[0]][1],inTree.children[items[0]])
if len(items)>1:
updateTree(items[1::],inTree.children[items[0]],headerTable,count)
def updateHeader(nodeToTest,targetNode):#更新头指针表
while nodeToTest.nodeLink != None:
nodeToTest = nodeToTest.nodeLink
nodeToTest.nodeLink = targetNode
#简单数据集及数据包装器
def loadSimpDat():
simpDat = [['r','z','h','j','p'],
['z','y','x','w','v','u','t','s'],
['z'],
['r','x','n','o','s'],
['y','r','x','z','q','t','p'],
['y','z','x','e','q','s','t','m']]
return simpDat
def createInitSet(dataSet):
retDict={}
for trans in dataSet:
retDict[frozenset(trans)] = 1
return retDict

 

3、从一棵FP树中挖掘频繁项集

基本步骤:

(1)从FP树中获得条件模式基;

(2)利用条件模式基,构建一个条件FP树;

(3)迭代重复步骤(1)(2),直到树包含一个元素项为止。

1)抽取条件模式基

条件模式基:以查找元素为结尾的路径集合。(均为前缀路径:介于所查找元素项与树根结点之间的所有内容)

每一条前缀路径都与一个计数值关联。该计数值等与起始元素项的计数值。

python实现如下:

 

发现以给定元素项结尾的所有路径的函数
def ascendTree(leafNode,prefixPath):
if leafNode.parent !=None:
prefixPath.append(leafNode.name)
ascendTree(leafNode.parent,prefixPath)
def findPrefixPath(basePat,treeNode):
condPats={}
while treeNode != None:
prefixPath =[]
ascendTree(treeNode,prefixPath)
if len(prefixPath)>1:
condPats[frozenset(prefixPath[1:])] = treeNode.count
treeNode = treeNode.nodeLink
return condPats

 

2)创建条件FP树

python实现如下:

 

递归查找频繁项集
def mineTree(inTree,headerTable,minSup,preFix,freqItemList):
bigL = [v[0] for v in sorted(headerTable.items(),key=lambda p:p[1])]
for basePat in bigL:
newFreqSet = preFix.copy()
newFreqSet.add(basePat)
freqItemList.append(newFreqSet)
condPattBases = findPrefixPath(basePat.headerTable[basePat][1])
myCondTree,myHead = createTree(condPattBases,minSup)
if myHead != None:
mineTree(myCondTree,myHead,minSup,newFreqSet,freqItemList)
 

 

转载于:https://www.cnblogs.com/zhenpengwang/p/10920604.html

机器学习算法详解▪ 一、线性回归 ◦ 1、代价函数 ◦ 2、梯度下降算法 ◦ 3、均值归一化 ◦ 4、最终运行结果 ◦ 5、使用scikit-learn库中的线性模型实现 ▪ 、逻辑回归 ◦ 1、代价函数 ◦ 2、梯度 ◦ 3、正则化 ◦ 4、S型函数(即) ◦ 5、映射为多项式 ◦ 6、使用的优化方法 ◦ 7、运行结果 ◦ 8、使用scikit-learn库中的逻辑回归模型实现 ▪ 逻辑回归_手写数字识别_OneVsAll ◦ 1、随机显示100个数字 ◦ 2、OneVsAll ◦ 3、手写数字识别 ◦ 4、预测 ◦ 5、运行结果 ◦ 6、使用scikit-learn库中的逻辑回归模型实现 ▪ 三、BP神经网络 ◦ 1、神经网络model ◦ 2、代价函数 ◦ 3、正则化 ◦ 4、反向传播BP ◦ 5、BP可以求梯度的原因 ◦ 6、梯度检查 ◦ 7、权重的随机初始化 ◦ 8、预测 ◦ 9、输出结果 ▪ 四、SVM支持向量机 ◦ 1、代价函数 ◦ 2、Large Margin ◦ 3、SVM Kernel(核函数) ◦ 4、使用中的模型代码 ◦ 5、运行结果 ▪ 五、K-Means聚类算法 ◦ 1、聚类过程 ◦ 2、目标函数 ◦ 3、聚类中心的选择 ◦ 4、聚类个数K的选择 ◦ 5、应用——图片压缩 ◦ 6、使用scikit-learn库中的线性模型实现聚类 ◦ 7、运行结果 ▪ 六、PCA主成分分析(降维) ◦ 1、用处 ◦ 2、2D-->1D,nD-->kD ◦ 3、主成分分析PCA与线性回归的区别 ◦ 4、PCA降维过程 ◦ 5、数据恢复 ◦ 6、主成分个数的选择(即要降的维度) ◦ 7、使用建议 ◦ 8、运行结果 ◦ 9、使用scikit-learn库中的PCA实现降维 ▪ 七、异常检测 Anomaly Detection ◦ 1、高斯分布(正态分布) ◦ 2、异常检测算法 ◦ 3、评价的好坏,以及的选取 ◦ 4、选择使用什么样的feature(单元高斯分布) ◦ 5、多元高斯分布 ◦ 6、单元和多元高斯分布特点 ◦ 7、程序运行结果
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值