基於Apriori的數據關聯分析 | 工業數據分析

基於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

8

9def createC1(dataSet):

10

11 c1 = []

12

13 for transaction in dataSet:

14

15 for item in transaction:

16

17if not [item] in c1:

18

19 c1.append([item]) c1.sort()

20

21return map(frozenset,c1)

22

23

24

25def scanD(D,Ck,minSupport):

26

27ssCnt = {} for tid in D:

28

29for can in Ck:

30

31 if can.issubset(tid):#判斷 tid 是否在 can 中

32

33if not ssCnt.has_key(can):

34

35ssCnt[can] = 1

36

37else:

38

39ssCnt[can] += 1

40

41 numItems = float(len(D))

42

43retList = []

44

45supportData = {}

46

47for key in ssCnt:

48

49 support = ssCnt[key] / numItems

50

51if support >= minSupport:

52

53retList.insert(0,key)

54

55supportData[key] = support

56

57 return retList,supportData

58

59對上述代碼進行測試:

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

68

69

70

71 結合構建的單個參數項集判斷上述代碼是可用的。據此結合之前的分析構建完整的演算法, 代碼如下:

72

73#構建多個參數對應的項集

74

75def aprioriGen(Lk,k):

76

77retList = []

78

79lenLk = 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):

100

101C1 = createC1(dataSet)

102

103D = map(set,dataSet)

104

105L1,supportData = scanD(D,C1,minSupport)

106

107 L = [L1] k = 2

108

109while (len(L[k-2]) > 0):

110

111 Ck = aprioriGen(L[k-2],k)

112

113 Lk,supK = scanD(D,Ck,minSupport) supportData.update(supK)

114

115 L.append(Lk) k += 1

116

117return 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]:

10

11 H1 = [frozenset([item]) for item in freqSet]

12

13

14

15 if (i > 1): rulesFromConseq(freqSet,H1,supportData,bigRuleList,minConf)

16

17 else:

18

19 calcConf(freqSet,H1,supportData,bigRuleList,minConf)

20

21return bigRuleList

22

23

24

25#集合右邊一個元素

26

27def calcConf(freqSet,H,supportData,brl,minConf = 0.7): prunedH = [] for conseq in H:

28

29 conf = supportData[freqSet]/supportData[freqSet - conseq] if conf >= minConf:

30

31print freqSet - conseq,-->,conseq,conf:,conf brl.append((freqSet-conseq,conseq,conf)) prunedH.append(conseq) return prunedH

32

33

34

35#生成更多的關聯規則

36

37def rulesFromConseq(freqSet,H,supportData,br1,minConf = 0.7): m = len(H[0])

38

39if (len(freqSet)>(m + 1)):

40

41 Hmp1 = aprioriGen(H,m+1)

42

43 Hmp1 = calcConf(freqSet,Hmp1,supportData,br1,minConf) if (len(Hmp1) > 1): rulesFromConseq(freqSet,Hmp1,supportData,br1,minConf)

44

45接下來對上述的程序進行測試:

46

47#test dataSet = loadData() minSupport = 0.5 L,suppData = apriori(dataSet,minSupport)

48

49rules = generateRules(L,suppData,minConf = 0.5) print rules

上述程序的結果表明該演算法在小數據集中可以實現,其中更換可信度閾值 minConf 可以 獲得不同的關聯規則。

微信群&交流合作

  • 加入微信群:不定期分享資料,拓展行業人脈請在公眾號留言:「微信號+名字+研究領域/專業/學校/公司」,我們將很快與您聯繫。
  • 投稿、交流合作請留言聯繫。

weixin.qq.com/r/AC91bd- (二維碼自動識別)


推薦閱讀:

數據分析師之路開始啟程
第四關—複雜數據分析
「作為數據分析師,我的價值在哪裡?」
3分鐘掌握一個有數小技能:回頭客分析
python分析信用卡反欺詐(下)——兩種採樣方法解決數據不平衡及效果分析、模型調參示例

TAG:數據挖掘 | 大數據 | 數據分析 |