1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
|
#FP-growth算法用于发现“频繁项集”,其性能要比Apriori好两个数量级以上。FP-growth只要扫描数据集两次,
#便可发现频繁项,其基本过程如下:
#(1)构建FP树
#扫描数据集,记录各个元素出现的次数,计算各个元素的频率,去除频率低于阈值的元素,根据保留元素构建一棵
#FP树;
#(2)从FP树中挖掘频繁项集
#创建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):#对count变量增加给定值
self.count += numOccur
def disp(self,ind=1):#将树以文本形式表示
print(" "*ind,self.name," ",self.count)
for child in self.children.values():#???
child.disp(ind+1)
#构建FP树的步骤
#第一次遍历数据集,给出各个元素的出现次数,并且根据minSup筛选出“频繁项集”
#创建初始FP tree
#第二次遍历数据集,每遍历一条数据链,更新一次FP tree
# 如果数据链遍历时,下一个元素为当前元素的子节点,则更新节点count
# 否则,为下一个元素创建一个结点,并将其列入当前元素结点的子节点中,
# 同时,如果下一个元素头指针为Null,则将头指针指向该元素结点
# 如果,头指针不为Null,则遍历其nodeLink,将第一个为空的NodeLink指向该元素结点(这样可以使每个单独的元素实例相连)
# 如果该条数据链的长度>1,则递归运用UpdateTree函数,将数据链的其他元素也更新到树中
#FP树构建函数
def createTree(dataSet,minSup=1):#dataSet是字典{数据集:出现次数}
headerTable = {}
#第一次遍历数据集,给出每个元素的出现次数
for trans in dataSet:
for item in trans:
headerTable[item] = headerTable.get(item,0) + dataSet[trans]#键Item的值+数据的出现次数
#将元素出现次数
for k in headerTable.keys():
if headerTable[k] < minSup:#如果头指针表中的元素出现次数小于minSup
del(headerTable[k])#删除该元素
freqItemSet = set(headerTable.keys())#将剩下的元素放入集合freqItemSet
if len(freqItemSet) == 0:#如果没有频繁项集,返回none
return None,None
for k in headerTable:
|