基於Apriori的數據關聯分析 | 工業數據分析
08-28
基於Apriori的數據關聯分析 | 工業數據分析
推薦閱讀:
來自專欄九三智能控
點擊上方藍色字體,關註:九三智能控
背景 工業數據中的相關性分析是開展工業數據分析的基礎性分析,決定數據分析的優先順序,通過支持度和可信度來定義發現數據之間存在的關係。在狀態參數列表中,可能存在單一參數組成的頻繁項集,當然也存在兩個以及兩個以上的參數組成的頻繁項集。而在計算一個頻繁項集的支持度時,通常需要遍歷所有的參數列表求得,對於列表數目 較少的情況該方法無疑是沒問題的,但當列表數目成千上萬時,計算量過大,這種方法勢必是不適用的。 那麼如何解決上述問題呢,Apriori 原理可以解決。Apriori 原理是說如果某個項集是頻繁的,那麼它的所有子集勢必也是頻繁的。這個原理從表面上看沒什麼大用,但是反過來,如果一個項集是非頻繁項集,那麼它所對應的超集就全都是非頻繁項集。這樣在確定了一個項 集是非頻繁項集了之後,它所對應的超集的支持度我們就可以不去計算了,這在很大程度上 避免了項集數目的指數增長,可以更加合理的計算頻繁項集。Apriori 演算法Apriori 演算法是用來發現頻繁項集的一種方法。Apriori 演算法的兩個輸入參數分別是最小支持度和數據集。該演算法首先生成所有單個物品的項集列表,遍歷之後去掉不滿足最小支持度要求的項集;接下來對剩下的集合進行組合生成包含兩個元素的項集,去掉不滿足最小支 持度的項集;重複該過程直到去掉所有不滿足最小支持度的項集。
首先採用 python 生成所有的單個物品所對應的項集,並構建一個得到頻繁項集的函數, 代碼如下: 1 # -*- coding: cp936 -*- Apriori 演算法 Ben 2015.09.28 #coding:utf-8 from numpy import * 2 3def loadData(): 4 5return[[1,3,4],[2,3,5],[1,2,3,5],[2,5]] 6 7 89def createC1(dataSet):
10 11 c1 = [] 12 13 for transaction in dataSet: 14 15 for item in transaction: 16 17if not [item] in c1: 1819 c1.append([item]) c1.sort()
20 21return map(frozenset,c1) 22 23 24 25def scanD(D,Ck,minSupport): 26 27ssCnt = {} for tid in D: 2829for can in Ck:
30 31 if can.issubset(tid):#判斷 tid 是否在 can 中 32 33if not ssCnt.has_key(can): 34 35ssCnt[can] = 1 36 37else: 3839ssCnt[can] += 1
40 41 numItems = float(len(D)) 42 43retList = [] 44 45supportData = {} 46 47for key in ssCnt: 4849 support = ssCnt[key] / numItems
50 51if support >= minSupport: 52 53retList.insert(0,key) 54 55supportData[key] = support 56 57 return retList,supportData 5859對上述代碼進行測試:
60 61#test dataSet = loadData() 62 63c1 = createC1(dataSet) 64 65D = map(set,dataSet) L1,supportData = scanD(D,c1,0.5) 66 67print L1 print supportData 6869
70 71 結合構建的單個參數項集判斷上述代碼是可用的。據此結合之前的分析構建完整的演算法, 代碼如下: 72 73#構建多個參數對應的項集 74 75def aprioriGen(Lk,k): 76 77retList = [] 7879lenLk = len(Lk)
80 81 for i in range(lenLk): 82 83 for j in range(i+1,lenLk): 84 85 L1 = list(Lk[i])[:k-2] 86 87 L2 = list(Lk[j])[:k-2] 88 89 L1.sort() 90 91 L2.sort() 92 93 if L1 == L2: 94 95 retList.append(Lk[i]|Lk[j]) return retList 96 97 98 99def apriori(dataSet,minSupport = 0.5): 100101C1 = createC1(dataSet) 102103D = map(set,dataSet)104105L1,supportData = scanD(D,C1,minSupport) 106107 L = [L1] k = 2 108109while (len(L[k-2]) > 0): 110111 Ck = aprioriGen(L[k-2],k) 112113 Lk,supK = scanD(D,Ck,minSupport) supportData.update(supK) 114115 L.append(Lk) k += 1 116117return L,supportData 這樣就對得到頻繁項集的思想進行了實現,下面驗證: dataSet = loadData() minSupport = 0.5 a,b = apriori(dataSet,minSupport) print a print b 結果為所有頻繁項集以及其所對應的支持度,符合預期。 頻繁項集可以使用 Apriori 演算法尋找,當然下來就是要找出關聯規則了。我們知道,假 設有一個頻繁項集,它們之間就有可能有一條關聯規則,即可以表示為:"...—>...",但反過 來並不一定成立(其中箭頭左邊對應的集合為前件,箭頭右邊對應的集合為後件)。可信度 在上一節,我們使用最小支持度來量化頻繁項集,對應的,採用可信度來量化關聯規則。 其中一條規則 p—>H 的可信度定義為: support(P|H)/support(P),為找到其中的關聯規則,我 們可以先生成一個可能的規則列表,然後測試每條規則的可信度,結合可信度的最小要求, 得到關聯規則。同尋找頻繁項集類似,我們可以為每個頻繁項集產生許多關聯規則,這樣就 會有很多的關聯規則產生。 結合 Apriori 原理,如果某條規則不滿足最小可信度要求,那麼 該規則的所有子集也就不滿足最小可信度要求,據此我們可以減少需要測試的規則數目,簡化問題。 尋找關聯規則的思想是:從一個頻繁項集開始,創建一個規則列表,首先將規則的右邊 限定為一個元素,對這些規則進行測試,接下來合併剩下的規則來創建一個新的規則列表, 規則的右邊限定為兩個元素,就這樣一步一步實現,代碼如下: 1#使用關聯規則生成函數 2 3def generateRules(L,supportData,minConf = 0.7): 4 5 bigRuleList = [] 6 7for i in range(1,len(L)): 8 9 for freqSet in L[i]: 1011 H1 = [frozenset([item]) for item in freqSet] 12131415 if (i > 1): rulesFromConseq(freqSet,H1,supportData,bigRuleList,minConf)1617 else: 1819 calcConf(freqSet,H1,supportData,bigRuleList,minConf) 2021return bigRuleList22232425#集合右邊一個元素2627def calcConf(freqSet,H,supportData,brl,minConf = 0.7): prunedH = [] for conseq in H: 2829 conf = supportData[freqSet]/supportData[freqSet - conseq] if conf >= minConf: 3031print freqSet - conseq,-->,conseq,conf:,conf brl.append((freqSet-conseq,conseq,conf)) prunedH.append(conseq) return prunedH32333435#生成更多的關聯規則3637def rulesFromConseq(freqSet,H,supportData,br1,minConf = 0.7): m = len(H[0]) 3839if (len(freqSet)>(m + 1)): 4041 Hmp1 = aprioriGen(H,m+1) 4243 Hmp1 = calcConf(freqSet,Hmp1,supportData,br1,minConf) if (len(Hmp1) > 1): rulesFromConseq(freqSet,Hmp1,supportData,br1,minConf) 4445接下來對上述的程序進行測試: 4647#test dataSet = loadData() minSupport = 0.5 L,suppData = apriori(dataSet,minSupport)4849rules = generateRules(L,suppData,minConf = 0.5) print rules 上述程序的結果表明該演算法在小數據集中可以實現,其中更換可信度閾值 minConf 可以 獲得不同的關聯規則。微信群&交流合作- 加入微信群:不定期分享資料,拓展行業人脈請在公眾號留言:「微信號+名字+研究領域/專業/學校/公司」,我們將很快與您聯繫。
- 投稿、交流合作請留言聯繫。
http://weixin.qq.com/r/AC91bd-EloLprZsO93oS (二維碼自動識別)
推薦閱讀:
※數據分析師之路開始啟程
※第四關—複雜數據分析
※「作為數據分析師,我的價值在哪裡?」
※3分鐘掌握一個有數小技能:回頭客分析
※python分析信用卡反欺詐(下)——兩種採樣方法解決數據不平衡及效果分析、模型調參示例