日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Apriori关联规则算法实现及其原理(基础篇)

發(fā)布時間:2025/3/15 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Apriori关联规则算法实现及其原理(基础篇) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

概念

定義一:設(shè)I={i1,i2,…,im},是m個不同的項目的集合,每個ik稱為一個項目。項目的集合I稱為項集。其元素的個數(shù)稱為項集的長度,長度為k的項集稱為k-項集。引例中每個商品就是一個項目,項集為I={bread, beer, cake,cream, milk, tea},I的長度為6。
定義二:每筆交易T是項集I的一個子集。對應(yīng)每一個交易有一個唯一標(biāo)識交易號,記作TID。交易全體構(gòu)成了交易數(shù)據(jù)庫D,|D|等于D中交易的個數(shù)。引例中包含10筆交易,因此|D|=10。

定義三:對于項集X,設(shè)定count(X?T)為交易集D中包含X的交易的數(shù)量,則項集X的支持度為:

support(X)=count(X?T)/|D|

引例中X={bread, milk}出現(xiàn)在T1,T2,T5,T9和T10中,所以支持度為0.5。

定義四:最小支持度是項集的最小支持閥值,記為SUPmin,代表了用戶關(guān)心的關(guān)聯(lián)規(guī)則的最低重要性。支持度不小于SUPmin 的項集稱為頻繁集,長度為k的頻繁集稱為k-頻繁集。如果設(shè)定SUPmin為0.3,引例中{bread, milk}的支持度是0.5,所以是2-頻繁集。

定義五:關(guān)聯(lián)規(guī)則是一個蘊含式:

R:X?Y

其中X?I,Y?I,并且X∩Y=?。表示項集X在某一交易中出現(xiàn),則導(dǎo)致Y以某一概率也會出現(xiàn)。用戶關(guān)心的關(guān)聯(lián)規(guī)則,可以用兩個標(biāo)準(zhǔn)來衡量:支持度和可信度。

定義六:關(guān)聯(lián)規(guī)則R的支持度是交易集同時包含X和Y的交易數(shù)與|D|之比。即:

support(X?Y)=count(X?Y)/|D|

支持度反映了X、Y同時出現(xiàn)的概率。關(guān)聯(lián)規(guī)則的支持度等于頻繁集的支持度。

定義七:對于關(guān)聯(lián)規(guī)則R,可信度是指包含X和Y的交易數(shù)與包含X的交易數(shù)之比。即:

confidence(X?Y)=support(X?Y)/support(X)

可信度反映了如果交易中包含X,則交易包含Y的概率。一般來說,只有支持度和可信度較高的關(guān)聯(lián)規(guī)則才是用戶感興趣的。

定義八:設(shè)定關(guān)聯(lián)規(guī)則的最小支持度和最小可信度為SUPmin和CONFmin。規(guī)則R的支持度和可信度均不小于SUPmin和CONFmin ,則稱為強(qiáng)關(guān)聯(lián)規(guī)則。關(guān)聯(lián)規(guī)則挖掘的目的就是找出強(qiáng)關(guān)聯(lián)規(guī)則,從而指導(dǎo)商家的決策。

這八個定義包含了關(guān)聯(lián)規(guī)則相關(guān)的幾個重要基本概念,關(guān)聯(lián)規(guī)則挖掘主要有兩個問題:

找出交易數(shù)據(jù)庫中所有大于或等于用戶指定的最小支持度的頻繁項集。 利用頻繁項集生成所需要的關(guān)聯(lián)規(guī)則,根據(jù)用戶設(shè)定的最小可信度篩選出強(qiáng)關(guān)聯(lián)規(guī)則。

目前研究人員主要針對第一個問題進(jìn)行研究,找出頻繁集是比較困難的,而有了頻繁集再生成強(qiáng)關(guān)聯(lián)規(guī)則就相對容易了。

理論基礎(chǔ)

首先來看一個頻繁集的性質(zhì)。

定理:如果項目集X是頻繁集,那么它的非空子集都是頻繁集。

根據(jù)定理,已知一個k-頻繁集的項集X,X的所有k-1階子集都肯定是頻繁集,也就肯定可以找到兩個k-1頻繁集的項集,它們只有一項不同,且連接后等于X。這證明了通過連接k-1頻繁集產(chǎn)生的k-候選集覆蓋了k-頻繁集。同時,如果k-候選集中的項集Y,包含有某個k-1階子集不屬于k-1頻繁集,那么Y就不可能是頻繁集,應(yīng)該從候選集中裁剪掉。Apriori算法就是利用了頻繁集的這個性質(zhì)。

算法實現(xiàn)過程

代碼實現(xiàn)

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

總結(jié)

以上是生活随笔為你收集整理的Apriori关联规则算法实现及其原理(基础篇)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。