Apriori关联规则算法实现及其原理(基础篇)
概念
定義一:設I={i1,i2,…,im},是m個不同的項目的集合,每個ik稱為一個項目。項目的集合I稱為項集。其元素的個數稱為項集的長度,長度為k的項集稱為k-項集。引例中每個商品就是一個項目,項集為I={bread, beer, cake,cream, milk, tea},I的長度為6。
定義二:每筆交易T是項集I的一個子集。對應每一個交易有一個唯一標識交易號,記作TID。交易全體構成了交易數據庫D,|D|等于D中交易的個數。引例中包含10筆交易,因此|D|=10。
定義三:對于項集X,設定count(X?T)為交易集D中包含X的交易的數量,則項集X的支持度為:
support(X)=count(X?T)/|D|
引例中X={bread, milk}出現在T1,T2,T5,T9和T10中,所以支持度為0.5。
定義四:最小支持度是項集的最小支持閥值,記為SUPmin,代表了用戶關心的關聯規則的最低重要性。支持度不小于SUPmin 的項集稱為頻繁集,長度為k的頻繁集稱為k-頻繁集。如果設定SUPmin為0.3,引例中{bread, milk}的支持度是0.5,所以是2-頻繁集。
定義五:關聯規則是一個蘊含式:
R:X?Y
其中X?I,Y?I,并且X∩Y=?。表示項集X在某一交易中出現,則導致Y以某一概率也會出現。用戶關心的關聯規則,可以用兩個標準來衡量:支持度和可信度。
定義六:關聯規則R的支持度是交易集同時包含X和Y的交易數與|D|之比。即:
support(X?Y)=count(X?Y)/|D|
支持度反映了X、Y同時出現的概率。關聯規則的支持度等于頻繁集的支持度。
定義七:對于關聯規則R,可信度是指包含X和Y的交易數與包含X的交易數之比。即:
confidence(X?Y)=support(X?Y)/support(X)
可信度反映了如果交易中包含X,則交易包含Y的概率。一般來說,只有支持度和可信度較高的關聯規則才是用戶感興趣的。
定義八:設定關聯規則的最小支持度和最小可信度為SUPmin和CONFmin。規則R的支持度和可信度均不小于SUPmin和CONFmin ,則稱為強關聯規則。關聯規則挖掘的目的就是找出強關聯規則,從而指導商家的決策。
這八個定義包含了關聯規則相關的幾個重要基本概念,關聯規則挖掘主要有兩個問題:
找出交易數據庫中所有大于或等于用戶指定的最小支持度的頻繁項集。 利用頻繁項集生成所需要的關聯規則,根據用戶設定的最小可信度篩選出強關聯規則。目前研究人員主要針對第一個問題進行研究,找出頻繁集是比較困難的,而有了頻繁集再生成強關聯規則就相對容易了。
理論基礎
首先來看一個頻繁集的性質。
定理:如果項目集X是頻繁集,那么它的非空子集都是頻繁集。
根據定理,已知一個k-頻繁集的項集X,X的所有k-1階子集都肯定是頻繁集,也就肯定可以找到兩個k-1頻繁集的項集,它們只有一項不同,且連接后等于X。這證明了通過連接k-1頻繁集產生的k-候選集覆蓋了k-頻繁集。同時,如果k-候選集中的項集Y,包含有某個k-1階子集不屬于k-1頻繁集,那么Y就不可能是頻繁集,應該從候選集中裁剪掉。Apriori算法就是利用了頻繁集的這個性質。
算法實現過程
代碼實現
def local_data(file_path):import pandas as pddt = pd.read_excel(file_path)data = dt['con']locdata = []for i in data:locdata.append(str(i).split(","))# print(locdata) # change to [[1,2,3],[1,2,3]]length = []for i in locdata:length.append(len(i)) # 計算長度并存儲# print(length)ki = length[length.index(max(length))]# print(length[length.index(max(length))]) # length.index(max(length)讀取最大值的位置,然后再定位取出最大值return locdata,kidef create_C1(data_set):"""Create frequent candidate 1-itemset C1 by scaning data set.Args:data_set: A list of transactions. Each transaction contains several items.Returns:C1: A set which contains all frequent candidate 1-itemsets"""C1 = set()for t in data_set:for item in t:item_set = frozenset([item])C1.add(item_set)return C1def is_apriori(Ck_item, Lksub1):"""Judge whether a frequent candidate k-itemset satisfy Apriori property.Args:Ck_item: a frequent candidate k-itemset in Ck which contains all frequentcandidate k-itemsets.Lksub1: Lk-1, a set which contains all frequent candidate (k-1)-itemsets.Returns:True: satisfying Apriori property.False: Not satisfying Apriori property."""for item in Ck_item:sub_Ck = Ck_item - frozenset([item])if sub_Ck not in Lksub1:return Falsereturn Truedef create_Ck(Lksub1, k):"""Create Ck, a set which contains all all frequent candidate k-itemsetsby Lk-1's own connection operation.Args:Lksub1: Lk-1, a set which contains all frequent candidate (k-1)-itemsets.k: the item number of a frequent itemset.Return:Ck: a set which contains all all frequent candidate k-itemsets."""Ck = set()len_Lksub1 = len(Lksub1)list_Lksub1 = list(Lksub1)for i in range(len_Lksub1):for j in range(1, len_Lksub1):l1 = list(list_Lksub1[i])l2 = list(list_Lksub1[j])l1.sort()l2.sort()if l1[0:k-2] == l2[0:k-2]:Ck_item = list_Lksub1[i] | list_Lksub1[j]# pruningif is_apriori(Ck_item, Lksub1):Ck.add(Ck_item)return Ckdef generate_Lk_by_Ck(data_set, Ck, min_support, support_data):"""Generate Lk by executing a delete policy from Ck.Args:data_set: A list of transactions. Each transaction contains several items.Ck: A set which contains all all frequent candidate k-itemsets.min_support: The minimum support.support_data: A dictionary. The key is frequent itemset and the value is support.Returns:Lk: A set which contains all all frequent k-itemsets."""Lk = set()item_count = {}for t in data_set:for item in Ck:if item.issubset(t):if item not in item_count:item_count[item] = 1else:item_count[item] += 1t_num = float(len(data_set))for item in item_count:if (item_count[item] / t_num) >= min_support:Lk.add(item)support_data[item] = item_count[item] / t_numreturn Lkdef generate_L(data_set, k, min_support):"""Generate all frequent itemsets.Args:data_set: A list of transactions. Each transaction contains several items.k: Maximum number of items for all frequent itemsets.min_support: The minimum support.Returns:L: The list of Lk.support_data: A dictionary. The key is frequent itemset and the value is support."""support_data = {}C1 = create_C1(data_set)L1 = generate_Lk_by_Ck(data_set, C1, min_support, support_data)Lksub1 = L1.copy()L = []L.append(Lksub1)for i in range(2, k+1):Ci = create_Ck(Lksub1, i)Li = generate_Lk_by_Ck(data_set, Ci, min_support, support_data)Lksub1 = Li.copy()L.append(Lksub1)return L, support_datadef generate_big_rules(L, support_data, min_conf):"""Generate big rules from frequent itemsets.Args:L: The list of Lk.support_data: A dictionary. The key is frequent itemset and the value is support.min_conf: Minimal confidence.Returns:big_rule_list: A list which contains all big rules. Each big rule is representedas a 3-tuple."""big_rule_list = []sub_set_list = []for i in range(0, len(L)):for freq_set in L[i]:for sub_set in sub_set_list:if sub_set.issubset(freq_set):conf = support_data[freq_set] / support_data[freq_set - sub_set]big_rule = (freq_set - sub_set, sub_set, conf)if conf >= min_conf and big_rule not in big_rule_list:# print freq_set-sub_set, " => ", sub_set, "conf: ", confbig_rule_list.append(big_rule)sub_set_list.append(freq_set)return big_rule_listif __name__ == "__main__":"""Test"""file_path = "test_aa.xlsx"data_set,k = local_data(file_path)L, support_data = generate_L(data_set, k, min_support=0.2)big_rules_list = generate_big_rules(L, support_data, min_conf=0.4)print(L)for Lk in L:if len(list(Lk)) == 0:breakprint("="*50)print("frequent " + str(len(list(Lk)[0])) + "-itemsets\t\tsupport")print("="*50)for freq_set in Lk:print(freq_set, support_data[freq_set])print()print("Big Rules")for item in big_rules_list:print(item[0], "=>", item[1], "conf: ", item[2])本文原博客鏈接
https://www.cnblogs.com/shizhenqiang/p/8251213.html
總結
以上是生活随笔為你收集整理的Apriori关联规则算法实现及其原理(基础篇)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 暗到深处,看到了光
- 下一篇: 外国小哥,把整个 CNN 都给可视化了,