根據給定的資料集,遞迴計算從0維到最大維的元組出現次數,若大於等於min_sup,則加入結果,若小於min_sup,則剪枝。
舉個例子:
資料集如下:
a1,b1
a1,b2
a2,b1
a1,b2
min_sup取2。
0維到1維:
從0-1維有a1,a2,b1,b2,四個元組。出現次數分別為a1:3,a2:1,b1:2,b2:2。因為a2不滿足min_sup,就進行了剪枝,將其它元組加入結果。
1維到2維:
由剛才0維到1維的結果可知:a1:3,b1:2,b2:2。所以我們在這三個元組的基礎上進行拓展,使其變為從1維到2維,就會有:(a1,b1),(a1,b2)這兩個,其中(a1,b1):1,(a1,b2):2,所以我們要對(a1,b1)進行剪枝,(a1,b2)放入結果。
所以最終結果是:a1,b1,b2,(a1,b2)
資料集:
a1,b1,c1,d1
a1,b2,c2,d2
a1,b3,c2,d1
a1,b4,c1,d2
a1,b1,c2,d2
a2,b1,c1,d1
a2,b2,c2,d2
a2,b1,c1,d2
a2,b2,c2,d2
a3,b3,c2,d1
a3,b4,c1,d2
a4,b1,c1,d1
a4,b2,c2,d2
a4,b3,c1,d2
a4,b4,c2,d1
**:
import csv
import copy
dimension =
["a"
,"b"
,"c"
,"d"
]# 一共有哪幾個維度
min_sup =
4# 最小支援度
output =
# 輸出結果
# 讀取csv中的資料
defload_data
(file_name)
: data_output =
with
open
(file_name,
"r", newline='')
asfile
: reader = csv.reader(
file
)for row in reader:
return data_output
# 工具函式:判斷a是否包含b
defcontain
(a, b)
: flag =
true
for item in b:
if item not
in a:
flag =
false
break
return flag
# 工具函式:根據輸入的item,獲取其在data_set中的出現次數
defget_times
(input_item, data_set)
: times =
0for data in data_set:
if contain(data, input_item)
: times = times +
1return times
# 工具函式:判斷某個元組是否在某個list裡
defitem_in_list
(item, input_list)
:for
input
in input_list:
ifset
(item)
==set
(input):
return
true
return
false
# 工具函式:去掉每一層中的重複元素
defcheck_data
(level_output)
: set_output =
for item in level_output:
ifnot item_in_list(item, set_output)
:return set_output
# 根據input_data,獲取包含a,維度為(a的維度+1)的元組
defget_data_by_input
(data_set_item, a)
:# 深拷貝引數
data_set_item = copy.deepcopy(data_set_item)
a = copy.deepcopy(a)
output_data =
if contain(data_set_item, a)
:# 從input_data中刪去a的資料
for item in a:
data_set_item.remove(item)
# 刪去後為a增加乙個維度
for data in data_set_item:
output_item = copy.deepcopy(a)
return output_data
# 獲取維度為dim,並且支援度大於min_sup的所有元組,即維度為dim的一層元素
defget_next_data_layer_by_min_sup
(data_set, input_data, dim, min_sup)
: final_level_output = copy.deepcopy(input_data)
iflen
(input_data)==0
and dim ==1:
# 處理從0維度到1維度,即為首先根據data_set對應的值,獲取維度+1的元組,然後計算其出現的次數,大於min_sup就加入output
for b in
range
(len
(data_set)):
layer_data = get_data_by_input(data_set[b],[
])for c in
range
(len
(layer_data)):
if get_times(layer_data[c]
, data_set)
>= min_sup:
)else
:# 處理從n維度到(n+1)維度,即為首先根據data_set對應的值,獲取維度+1的元組,然後計算其出現的次數,大於min_sup就加入output
for a in
range
(len
(input_data)):
for b in
range
(len
(data_set)):
iflen
(input_data[a]
)== dim -1:
layer_data = get_data_by_input(data_set[b]
, input_data[a]
)for c in
range
(len
(layer_data)):
if get_times(layer_data[c]
, data_set)
>= min_sup:
)# 這裡進行去重操作
final_level_output = check_data(final_level_output)
return final_level_output
# buc演算法
defbuc
(data_set, input_list, dim, min_sup)
:if dim <
len(dimension)
: dim = dim +
1 level_output = get_next_data_layer_by_min_sup(data_set, input_list, dim, min_sup)
return buc(data_set, level_output, dim, min_sup)
else
:return input_list
# 程式入口
buc_data_set = load_data(
"buc資料集.csv"
)buc_output = buc(buc_data_set,
,0, min_sup)
for item in buc_output:
print
(str
(","
.join(item))+
": "
+str
(get_times(item, buc_data_set)
))
結果:
a1: 5
b1: 5
c1: 7
d1: 6
b2: 4
c2: 8
d2: 9
a2: 4
a4: 4
b1,c1: 4
c1,d2: 4
b2,c2: 4
b2,d2: 4
c2,d2: 5
b2,c2,d2: 4
BUC冰川演算法的python實現
生成資料的方法 def datainit a a1 a2 a3 a4 a5 b b1 b2 b3 b4 c c1 c2 c3 d d1 d2 datalist for i in range 21 ax random.randint 0,4 bx random.randint 0,3 cx rando...
資料探勘演算法
apriori演算法學習資料的關聯規則 association rules 適用於包含大量事務 transcation 的資料庫。關聯規則學習是學習資料庫中不同變數中的相互關係的一種資料探勘技術。你可能會對 apriori 演算法如何工作有疑問,在進入演算法本質和細節之前,得先明確3件事情 第一是你...
資料探勘演算法
include include define d 9 d數事務的個數 define minsupcount 2 最小事務支援度數 void main char b 20 d 100 t,b2 100 10 b21 100 10 int i,j,k,x 0,flag 1,c 20 x1 0,i1 0,...