最近在學數據挖掘,學完Apriori算法之後就一直想用代碼實現出來,於是學了幾天python之後,進行了實現...
概念介紹轉:https://www.cnblogs.com/llhthinker/p/6719779.html
Python是看廖雪峯網站學的:https://www.liaoxuefeng.com/
直接貼代碼,代碼中有自己的解釋。
'''
# Filename: MyApriori.py
# author: 薄層
# Date: 2018/5/20 0:41
'''
def load_data_set():
data_set = [['e1', 'e2', 'e5'],
['e2', 'e4'],
['e2', 'e3'],
['e1', 'e2', 'e4'],
['e1', 'e3'],
['e2', 'e3'],
['e1', 'e3'],
['e1', 'e2', 'e3', 'e5'],
['e1', 'e2', 'e3']]
return data_set
def Create_C1(data_set):
'''
參數:數據庫事務集
'''
C1 = set()
for t in data_set:
for item in t:
item_set = frozenset([item])
# 爲生成頻繁項目集時掃描數據庫時以提供issubset()功能
C1.add(item_set)
return C1
def is_apriori(Ck_item, Lk_sub_1):
'''
參數:候選頻繁k項集,頻繁k-1項集
'''
for item in Ck_item:
sub_item = Ck_item - frozenset([item])
if sub_item not in Lk_sub_1:
return False
return True
def Create_Ck(Lk_sub_1, k):
'''
# 參數:頻繁k-1項集,當前要生成的候選頻繁幾項集
'''
Ck = set()
len_Lk_sub_1 = len(Lk_sub_1)
list_Lk_sub_1 = list(Lk_sub_1)
for i in range(len_Lk_sub_1): #i: [0, len_Lk_sub_1)
for j in range(i+1, len_Lk_sub_1): #j: [i+1, len_Lk_sub_1)
l1 = list(list_Lk_sub_1[i])
l2 = list(list_Lk_sub_1[j])
l1.sort()
l2.sort()
# 判斷l1的前k-1-1個元素與l2的前k-1-1個元素對應位是否全部相同
# list[s:t]:截取s到t範圍的元素生成一個新list
if l1[0:k-2] == l2[0:k-2]:
Ck_item = list_Lk_sub_1[i] | list_Lk_sub_1[j]
if is_apriori(Ck_item, Lk_sub_1):
Ck.add(Ck_item)
return Ck
def Generate_Lk_By_Ck(data_set, Ck, min_support, support_data):
'''
參數:數據庫事務集,候選頻繁k項集,最小支持度,項目集-支持度dic
'''
Lk = set()
# 通過dic記錄候選頻繁k項集的事務支持個數
item_count = {}
for t in data_set:
for Ck_item in Ck:
if Ck_item.issubset(t):
if Ck_item not in item_count:
item_count[Ck_item] = 1
else:
item_count[Ck_item] += 1
data_num = float(len(data_set))
for item in item_count:
if(item_count[item] / data_num) >= min_support:
Lk.add(item)
support_data[item] = item_count[item] / data_num
return Lk
def Generate_L(data_set, max_k, min_support):
'''
參數:數據庫事務集,求的最高項目集爲k項,最小支持度
'''
# 創建一個頻繁項目集爲key,其支持度爲value的dic
support_data = {}
C1 = Create_C1(data_set)
L1 = Generate_Lk_By_Ck(data_set, C1, min_support, support_data)
Lk_sub_1 = L1.copy() # 對L1進行淺copy
L = []
L.append(Lk_sub_1) # 末尾添加指定元素
for k in range(2, max_k+1):
Ck = Create_Ck(Lk_sub_1, k)
Lk = Generate_Lk_By_Ck(data_set, Ck, min_support, support_data)
Lk_sub_1 = Lk.copy()
L.append(Lk_sub_1)
return L, support_data
def Generate_Rule(L, support_data, min_confidence):
'''
參數:所有的頻繁項目集,項目集-支持度dic,最小置信度
'''
rule_list = []
sub_set_list = []
for i in range(len(L)):
for frequent_set in L[i]:
for sub_set in sub_set_list:
if sub_set.issubset(frequent_set):
conf = support_data[frequent_set] / support_data[sub_set]
# 將rule聲明爲tuple
rule = (sub_set, frequent_set-sub_set, conf)
if conf >= min_confidence and rule not in rule_list:
rule_list.append(rule)
sub_set_list.append(frequent_set)
return rule_list
if __name__ == "__main__":
data_set = load_data_set()
'''
print("Test")
# 數據庫事務打印
for t in data_set:
print(t)
'''
'''
print("Test")
# 候選頻繁1項集打印
C1 = Create_C1(data_set)
for item in C1:
print(item)
'''
'''
# 頻繁1項集打印
print("Test")
L = Generate_L(data_set, 1, 0.2)
for item in L:
print(item)
'''
'''
# 頻繁k項集打印
print("Test")
L, support_data = Generate_L(data_set, 2, 0.2)
for item in L:
print(item)
'''
'''
# 關聯規則測試
print("Test")
L, support_data = Generate_L(data_set, 3, 0.2)
rule_list = Generate_Rule(L, support_data, 0.7)
for item in support_data:
print(item, ": ", support_data[item])
print("-----------------------")
for item in rule_list:
print(item[0], "=>", item[1], "'s conf:", item[2])
'''
L, support_data = Generate_L(data_set, 3, 0.2)
rule_list = Generate_Rule(L, support_data, 0.7)
for Lk in L:
print("="*55)
print("frequent " + str(len(list(Lk)[0])) + "-itemsets\t\tsupport")
print("="*55)
for frequent_set in Lk:
print(frequent_set, support_data[frequent_set])
print()
print("Rules")
for item in rule_list:
print(item[0], "=>", item[1], "'s conf: ", item[2])
命令行執行結果:
自己蛋疼畫的圖,沒看到人家大佬已經畫了...
這些東西最近就不學了,等一些東西塵埃落定之後再說吧...
繼續加油~