《數據挖掘導論》實驗課——實驗6、數據挖掘之關聯分析

實驗6、數據挖掘之關聯分析

1、實驗目的

1. 理解Apriori算法的基本原理

2. 理解FP增加算法的基本原理

3. 學會用python實現Apriori算法

4. 學會用python實現FP增加算法

2、實驗工具

1. Anaconda

2. sklearn

3. Pandas

3、實驗簡介

Apriori算法在發現關聯規則領域具備很大影響力。算法命名源於算法使用了頻繁項集性質的先驗(prior)知識。在具體實驗時,Apriori算法將發現關聯規則的過程分爲兩個步驟:第一步經過迭代,檢索出事務數據庫中的全部頻繁項集,即支持度不低於用戶設定的閾值的項集;第二步利用頻繁項集構造出知足用戶最小信任度的規則。其中,挖掘或識別出全部頻繁項集是該算法的核心,佔整個計算量的大部分。python

在對深度優先數據挖掘算法的研究工做中,Han等人沒有采用潛在頻繁項集的方法求解頻繁項集,而是提出了稱爲頻率模式增加(FP_growth)的算法。該算法經過掃描數據庫建立FP_tree的根節點並標示爲null,對數據庫D中的每個事務Tran,按L中的次序對Tran中的頻繁項排序,設Tran中排序後的頻繁項列表[p|P],這裏p是第一個元素,P是保留列表。接着調用函數insert_tree([p|P],T),若是樹T有一個子節點N且N.item_name=p.item_name,就將N節點計數加1;不然就建立一個新節點N,設計數爲1,它的父節點鏈接到T,節點鏈接到同名的節點鏈接結構上。若是P是非空的,就遞歸調用insert_tree(P,N)。因爲壓縮了數據庫內容,而且在將頻繁項寫入FP_tree結構時,保留了項集間的相連信息。求解頻繁項集的問題,就轉化爲遞歸地找出最短頻繁模式並鏈接其後綴構成長頻繁模式的問題。算法

4、實驗內容

1. 利用python語言編寫Apriori算法,挖掘出下表中數據集的頻繁項集,最小支持度爲30%。

image.png
python實現Apriori算法的具體代碼數據庫

def load_data_set(): data_set = [['a','b','d','e'], ['b', 'c', 'd'], ['a','b','d','e'], ['a','b','d','e'], ['a','b','d','e'], ['b', 'd', 'e'], ['c', 'd'], ['a', 'b', 'c'], ['a', 'd', 'e'], ['b', 'd']] 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() L, support_data = Generate_L(data_set, 4, 0.3)#最小支持度是30% 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])

頻繁項集:
image.png編程

2. (選作)利用python語言編寫FP增加算法,挖掘出上表中數據集的頻繁項集,最小支持度爲30%。

5、實驗總結(寫出本次實驗的收穫,遇到的問題等)

經過本次實驗的學習和編程,初步理解了Apriori算法的基本原理是使用頻繁項集性質的先驗性質,即頻繁項集的全部非空子集也必定是頻繁的。Apriori算法使用一種稱爲逐層搜索的迭代方法,其中k項集用於探索(k+1)項集。首先,經過掃描數據庫,累計每一個項的計數,並收集知足最小支持度的項,找出頻繁1項集的集合。該集合記爲L1。而後,使用L1找出頻繁2項集的集合L2,使用L2找出L3,如此下去,直到不能再找到頻繁k項集。每找出一個Lk須要一次數據庫的完整掃描。Apriori算法使用頻繁項集的先驗性質來壓縮搜索空間。
可是python編程能力薄弱,須要增強編程語言的學習才能更好的把算法真正實現出來,並進行頻繁項集的輸出。app

相關文章
相關標籤/搜索