轉載請註明出處,內容引用和感謝部分將會在文章末尾一併給出!python
1.關聯規則淺談算法
關聯規則(Association Rules)是反映一個事物與其餘事物之間的相互依存性和關聯性,若是兩個或多個事物之間存在必定的關聯關係,那麼,其中一個事物就能經過其餘事物預測到。關聯規則是數據挖掘的一個重要技術,用於從大量數據中挖掘出有價值的數據項之間的相關關係。
關聯規則首先被Agrawal, lmielinski and Swami在1993年的SIGMOD會議上提出。
關聯規則挖掘的最經典的例子就是沃爾瑪的啤酒與尿布的故事,經過對超市購物籃數據進行分析,即顧客放入購物籃中不一樣商品之間的關係來分析顧客的購物習慣,發現美國婦女們常常會叮囑丈夫下班後爲孩子買尿布,30%-40%的丈夫同時會順便購買喜好的啤酒,超市就把尿布和啤酒放在一塊兒銷售增長銷售額。有了這個發現後,超市調整了貨架的設置,把尿布和啤酒擺放在一塊兒銷售,從而大大增長了銷售額。數據庫
2.常見案例
前面講述了關聯規則挖掘對超市購物籃的例子,使用Apriori對數據進行頻繁項集挖掘與關聯規則的產生是一個很是有用的技術,其中咱們衆所周知的例子如:
(1) 沃爾瑪超市的尿布與啤酒
(2) 超市的牛奶與麪包
(3) 百度文庫推薦相關文檔
(4) 淘寶推薦相關書籍
(5) 醫療推薦可能的治療組合
(6) 銀行推薦相關聯業務
這些都是商務智能和關聯規則在實際生活中的運用app
3.關聯規則的3個度量機器學習
支持度(support):說明規則的統計顯著性ide
置信度(confidence):說明規則的強度(最小和最大置信度有公司設定)學習
還有其餘的度量標準,好比:提高度/興趣度(interest),可是前面提出的這兩個較爲經常使用!spa
4. Apriori算法簡介.net
咱們的目標是找出具備足夠高的支持度和置信度的全部規則,而且因爲銷售數據庫通常很是大,全部咱們但願經過少數幾遍數據庫掃描就找出它們。因此這裏就提出了一個有效算法,稱爲Apriori算法(Agrawal等1996)來作這項工做。Apriori算法是一種對有影響的挖掘布爾關聯規則頻繁項集的算法,經過算法的鏈接和剪枝便可挖掘頻繁項集。rest
該算法分爲兩步:
(1)找出頻繁項集,即找出具備足夠支持度的項集;
這裏補充 頻繁項集的概念:
頻繁項集:若是項集的出現頻率大於或等於最小支持度計數閾值,則稱它爲頻繁項集,其中頻繁K-項集的集合一般記做Lk
下圖詳細描述了找出頻繁項集的過程:
具體分析結果:
第一次掃描:對每一個候選商品計數得C1,因爲候選{D}支持度計數爲1<最小支持度計數2,故刪除{D}得頻繁1-項集合L1;
第二次掃描:由L1產生候選C2並對候選計數得C2,比較候選支持度計數與最小支持度計數2得頻繁2-項集合L2;
第三次掃描:用Apriori算法對L2進行鏈接和剪枝產生候選3項集合C3的過程以下:
1.鏈接:
C3=L2(鏈接)L2={{A,C},{B,C},{B,E},{C,E}}{{A,C},{B,C},{B,E},{C,E}}={{A,B,C},{A,C,E},{B,C,E}}
2.剪枝:
{A,B,C}的2項子集{A,B},{A,C}和{B,C},其中{A,B}不是2項子集L2,所以不是頻繁的,從C3中刪除;
{A,C,E}的2項子集{A,C},{A,E}和{C,E},其中{A,E}不是2項子集L2,所以不是頻繁的,從C3中刪除;
{B,C,E}的2項子集{B,C},{B,E}和{C,E},它的全部2項子集都是L2的元素,保留C3中。
通過Apriori算法對L2鏈接和剪枝後產生候選3項集的集合爲C3={B,C,E}. 在對該候選商品計數,因爲等於最小支持度計數2,故得頻繁3-項集合L3,同時因爲4-項集中僅1個,故C4爲空集,算法終止。
(2)經過把頻繁項集劃分紅兩個子集,分別做爲前件和後件,把頻繁項集轉換成具備足夠置信度的規則;
強關聯規:若是規則R:X=>Y知足support(X=>Y)>=supmin(最小支持度,它用於衡量規則須要知足的最低重要性)且confidence(X=>Y)>=confmin(最小置信度,它表示關聯規則須要知足的最低可靠性)稱關聯規則X=>Y爲強關聯規則,不然稱關聯規則X=>Y爲弱關聯規則。
例子:現有A、B、C、D、E五種商品的交易記錄表,找出全部頻繁項集,假設最小支持度>=50%,最小置信度>=50%。
對於關聯規則R:A=>B,則:
支持度(suppport):是交易集中同時包含A和B的交易數與全部交易數之比。
Support(A=>B)=P(A∪B)=count(A∪B)/|D|
置信度(confidence):是包含A和B交易數與包含A的交易數之比。
Confidence(A=>B)=P(B|A)=support(A∪B)/support(A)
計算過程以下,K=1的時候項集{A}在T一、T3中出現2次,共4條交易,故支持度爲2/4=50%,依次計算。其中項集{D}在T1出現,其支持度爲1/4=25%,小於最小支持度50%,故去除,獲得L1。
而後對L1中項集兩兩組合,再分別計算其支持度,其中項集{A, B}在T3中出現1次,其支持度=1/4=25%,小於最小支持度50%,故去除,同理獲得L2項集。
而後以下圖所示,對L2中的項集進行組合,其中超過三項的進行過濾,最後計算獲得L3項集{B,C,E}。
最後對計算置信度,以下圖所示。
Apriori算法弊端:須要屢次掃描數據表。若是頻繁集最多包含10個項,那麼就須要掃描交易數據表10遍,這須要很大的I/O負載。同時,產生大量頻繁集,如有100個項目,可能產生候選項數目。
故:Jiawei Han等人在2000年提出了一種基於FP-樹的關聯規則挖掘算法FP_growth,它採起「分而治之」的策略,將提供頻繁項目集的數據庫壓縮成一棵頻繁模式樹(FP-樹)。
推薦一張圖,詳細分析關聯規則的過程:
原文做者參考文獻:
[1]高明 . 關聯規則挖掘算法的研究及其應用[D].山東師範大學. 2006
[2]李彥偉 . 基於關聯規則的數據挖掘方法研究[D].江南大學. 2011
[3]肖勁橙,林子禹,毛超.關聯規則在零售商業的應用[J].計算機工程.2004,30(3):189-190.
[4]秦亮曦,史忠植.關聯規則研究綜述[J].廣西大學學報.2005,30(4):310-317.
[5]陳志泊,韓慧,王建新,孫俏,聶耿青.數據倉庫與數據挖掘[M].北京:清華大學出版社.2009.
[6]沈良忠.關聯規則中Apriori 算法的C#實現研究[J].電腦知識與技術.2009,5(13):3501-3504.
[7]趙衛東.商務智能(第二版)[M].北京:清華大學出版社.2011.
5. Apriori算法代碼實現(暫時使用引用地址處的代碼,後期會更新我的書寫代碼)
# -*- coding: utf-8 -*- """ Created on Mon Nov 28 03:29:51 2016 地址:http://blog.csdn.net/u010454729/article/details/49078505 @author: 參考CSDN u010454729 """ # coding=utf-8 def loadDataSet(): return [[1,3,4],[2,3,5],[1,2,3,5],[2,5]] def createC1(dataSet): #構建全部候選項集的集合 C1 = [] for transaction in dataSet: for item in transaction: if not [item] in C1: C1.append([item]) #C1添加的是列表,對於每一項進行添加,{1},{3},{4},{2},{5} C1.sort() return map(frozenset, C1) #使用frozenset,被「冰凍」的集合,爲後續創建字典key-value使用。 def scanD(D,Ck,minSupport): #由候選項集生成符合最小支持度的項集L。參數分別爲數據集、候選項集列表,最小支持度 ssCnt = {} for tid in D: #對於數據集裏的每一條記錄 for can in Ck: #每一個候選項集can if can.issubset(tid): #如果候選集can是做爲記錄的子集,那麼其值+1,對其計數 if not ssCnt.has_key(can):#ssCnt[can] = ssCnt.get(can,0)+1一句可破,沒有的時候爲0,加上1,有的時候用get取出,加1 ssCnt[can] = 1 else: ssCnt[can] +=1 numItems = float(len(D)) retList = [] supportData = {} for key in ssCnt: support = ssCnt[key]/numItems #除以總的記錄條數,即爲其支持度 if support >= minSupport: retList.insert(0,key) #超過最小支持度的項集,將其記錄下來。 supportData[key] = support return retList, supportData def aprioriGen(Lk, k): #建立符合置信度的項集Ck, retList = [] lenLk = len(Lk) for i in range(lenLk): for j in range(i+1, lenLk): #k=3時,[:k-2]即取[0],對{0,1},{0,2},{1,2}這三個項集來講,L1=0,L2=0,將其合併得{0,1,2},當L1=0,L2=1不添加, L1 = list(Lk[i])[:k-2] L2 = list(Lk[j])[:k-2] L1.sort() L2.sort() if L1==L2: retList.append(Lk[i]|Lk[j]) return retList def apriori(dataSet, minSupport = 0.5): C1 = createC1(dataSet) D = map(set,dataSet) L1, supportData = scanD(D,C1,minSupport) L = [L1] #L將包含知足最小支持度,即通過篩選的全部頻繁n項集,這裏添加頻繁1項集 k = 2 while (len(L[k-2])>0): #k=2開始,由頻繁1項集生成頻繁2項集,直到下一個打的項集爲空 Ck = aprioriGen(L[k-2], k) Lk, supK = scanD(D, Ck, minSupport) supportData.update(supK) #supportData爲字典,存放每一個項集的支持度,並以更新的方式加入新的supK L.append(Lk) k +=1 return L,supportData dataSet = loadDataSet() C1 = createC1(dataSet) print "全部候選1項集C1:\n",C1 D = map(set, dataSet) print "數據集D:\n",D L1, supportData0 = scanD(D,C1, 0.5) print "符合最小支持度的頻繁1項集L1:\n",L1 L, suppData = apriori(dataSet) print "全部符合最小支持度的項集L:\n",L print "頻繁2項集:\n",aprioriGen(L[0],2) L, suppData = apriori(dataSet, minSupport=0.7) print "全部符合最小支持度爲0.7的項集L:\n",L
運行結果:
全部候選1項集C1: [frozenset([1]), frozenset([2]), frozenset([3]), frozenset([4]), frozenset([5])] 數據集D: [set([1, 3, 4]), set([2, 3, 5]), set([1, 2, 3, 5]), set([2, 5])] 符合最小支持度的頻繁1項集L1: [frozenset([1]), frozenset([3]), frozenset([2]), frozenset([5])] 全部符合最小支持度的項集L: [[frozenset([1]), frozenset([3]), frozenset([2]), frozenset([5])], [frozenset([1, 3]), frozenset([2, 5]), frozenset([2, 3]), frozenset([3, 5])], [frozenset([2, 3, 5])], []] 頻繁2項集: [frozenset([1, 3]), frozenset([1, 2]), frozenset([1, 5]), frozenset([2, 3]), frozenset([3, 5]), frozenset([2, 5])] 全部符合最小支持度爲0.7的項集L: [[frozenset([3]), frozenset([2]), frozenset([5])], [frozenset([2, 5])], []]
引文及參考:
1.本文主要參考地址:https://blog.csdn.net/Eastmount/article/details/53368440
2.本文參考圖書《機器學習導論》
代碼後續會及時補充完善,如需轉載,請尊重做者的辛勤付出,註明文章來源!
記錄生活,分享技術!