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

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

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

编程问答

关联规则Apriori算法

發(fā)布時(shí)間:2023/12/14 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关联规则Apriori算法 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

參考《【機(jī)器學(xué)習(xí)實(shí)戰(zhàn)-python3】使用Apriori算法進(jìn)行關(guān)聯(lián) 分析》,《 使用Apriori進(jìn)行關(guān)聯(lián)分析(一)》,《使用Apriori進(jìn)行關(guān)聯(lián)分析(二)》,《關(guān)于apriori算法中置信度、支持度怎么理解的問(wèn)題》

文章目錄

    • 1. 頻繁項(xiàng)集(frequent item sets)
      • 1.1 頻繁項(xiàng)集的支持度(support)和閾值
      • 1.2 頻繁項(xiàng)集的特點(diǎn)
      • 1.3 頻繁項(xiàng)集支持度計(jì)算方法
    • 2. 關(guān)聯(lián)規(guī)則挖掘(association rules)
      • 2.1 關(guān)聯(lián)規(guī)則的置信度(confidence)
      • 2.2 關(guān)聯(lián)規(guī)則置信度的計(jì)算過(guò)程
    • 3. 為什么需要置信度和支持度同時(shí)確定關(guān)聯(lián)規(guī)則

關(guān)聯(lián)規(guī)則的目的在于分析出經(jīng)常出現(xiàn)在一起的物品的集合之間的關(guān)系。Apriori算法本質(zhì)由兩部分組成,分別是

  • 頻繁項(xiàng)集(frequent item sets)。包括計(jì)算:頻繁項(xiàng)集的支持度(support)
  • 關(guān)聯(lián)規(guī)則(association rules)。包括計(jì)算:關(guān)聯(lián)規(guī)則的置信度(confidence)
  • 接下來(lái)分別對(duì)這幾個(gè)名詞進(jìn)行講解,同時(shí)串通整個(gè)Apriori算法。

    1. 頻繁項(xiàng)集(frequent item sets)

    假設(shè)下表為一個(gè)超市的交易記錄,其中交易ID可以看作每個(gè)前來(lái)購(gòu)物的顧客商品列表就是每個(gè)顧客購(gòu)買(mǎi)的商品。

    交易ID商品列表
    0P1, P2, P5
    1P2, P4
    2P2, P3
    3P1, P2, P4
    4P1, P3
    5P2, P3
    6P1, P3
    7P1, P2, P3, P5
    8P1, P2, P3

    單是肉眼去觀(guān)察的話(huà),似乎顧客經(jīng)常購(gòu)買(mǎi)P1, P2這樣的組合。這種的購(gòu)物中出現(xiàn)的經(jīng)常的組合,就是我們要找的頻繁項(xiàng)集了。項(xiàng)集可以由一個(gè)商品組成,也可以由多個(gè)商品組成。比如{P1}是一個(gè)項(xiàng)集,{P1, P2}也是一個(gè)項(xiàng)集。

    現(xiàn)實(shí)生活中的數(shù)據(jù)肯定比這更加龐大,因此需要使用算法來(lái)幫助我們篩選出來(lái)哪些是頻繁項(xiàng)集。

    1.1 頻繁項(xiàng)集的支持度(support)和閾值

    一個(gè)項(xiàng)集的支持度被定義為數(shù)據(jù)集中包含該項(xiàng)集的記錄所占的比例,比如在上表中,9個(gè)顧客中有4個(gè)購(gòu)買(mǎi)了P1商品和P2商品,項(xiàng)集{P1, P2}的支持度就是4/9=0.444/9=0.444/9=0.44支持項(xiàng)就是4項(xiàng).

    通常來(lái)說(shuō),我們會(huì)手動(dòng)設(shè)置支持度的閾值。比如設(shè)置閾值為50%,這樣支持度小于該閾值的時(shí)候,就認(rèn)為該項(xiàng)集并不頻繁,也就沒(méi)有挖掘關(guān)聯(lián)規(guī)則的意義,因此不會(huì)進(jìn)行后續(xù)的計(jì)算。

    1.2 頻繁項(xiàng)集的特點(diǎn)

    頻繁項(xiàng)集擁有如下特點(diǎn):**如果某個(gè)項(xiàng)集是頻繁的,那么它的所有子集也是頻繁的。**比如項(xiàng)集{P1, P2}是頻繁的,那么項(xiàng)集{P1}和{P2}也是頻繁的。該原理倒過(guò)來(lái)推并不成立,也就是說(shuō)當(dāng)我們 只發(fā)現(xiàn){P1}和{P2}是頻繁的的時(shí)候,是無(wú)法推出項(xiàng)集{P1, P2}是頻繁的,因?yàn)橛锌赡芩麄兊念l繁是依靠和別的商品一起購(gòu)買(mǎi)組合而成的。該原理可以用下圖表示

    已知陰影項(xiàng)集{2,3}是非頻繁的。利用這個(gè)知識(shí),我們就知道項(xiàng)集{0,2,3} ,{1,2,3}以及{0,1,2,3}也是非頻繁的。該特點(diǎn)的最大用處是幫助我們減少計(jì)算,一旦計(jì)算出了{(lán)2,3}的支持度,知道它是非頻繁的之后,就不需要再計(jì)算{0,2,3}、{1,2,3}和{0,1,2,3}的支持度,因?yàn)槲覀冎肋@些集合不會(huì)滿(mǎn)足我們的要求。使用該原理就可以避免項(xiàng)集數(shù)目的指數(shù)增長(zhǎng),從而在合理時(shí)間內(nèi)計(jì)算出頻繁項(xiàng)集。

    1.3 頻繁項(xiàng)集支持度計(jì)算方法

    頻繁項(xiàng)集的計(jì)算方法并不復(fù)雜,主要就是三步的不斷循環(huán)。

  • 計(jì)算當(dāng)前頻繁項(xiàng)的所有并集,得到新的頻繁項(xiàng)候選集
  • 對(duì)得到的所有頻繁項(xiàng)候選集進(jìn)行支持項(xiàng)/支持度的計(jì)算
  • 使用閾值過(guò)濾掉不符合要求的頻繁項(xiàng),最終剩下的成為新的頻繁項(xiàng)
  • 具體代碼如下

    def loadDataSet():return [[1,2,5],[2,4],[2,3],[1,2,4],[1,3],[2,3],[1,3],[1,2,3,5],[1,2,3]] #1.構(gòu)建候選1項(xiàng)集C1 def createC1(dataSet):C1 = []for transaction in dataSet:for item in transaction:if not [item] in C1:C1.append([item])C1.sort()return list(map(frozenset, C1))#將候選集Ck轉(zhuǎn)換為頻繁項(xiàng)集Lk #D:原始數(shù)據(jù)集 #Cn: 候選集項(xiàng)Ck #minSupport:支持度的最小值 def scanD(D, Ck, minSupport):#候選集計(jì)數(shù)ssCnt = {}for tid in D:for can in Ck:if can.issubset(tid):if can not in ssCnt.keys(): ssCnt[can] = 1else: ssCnt[can] += 1numItems = float(len(D))Lk= [] # 候選集項(xiàng)Cn生成的頻繁項(xiàng)集LksupportData = {} #候選集項(xiàng)Cn的支持度字典#計(jì)算候選項(xiàng)集的支持度, supportData key:候選項(xiàng), value:支持度for key in ssCnt:support = ssCnt[key] / numItemsif support >= minSupport:Lk.append(key)supportData[key] = supportreturn Lk, supportData#連接操作,將頻繁Lk-1項(xiàng)集通過(guò)拼接轉(zhuǎn)換為候選k項(xiàng)集 def aprioriGen(Lk_1, k):Ck = []lenLk = len(Lk_1)for i in range(lenLk):L1 = list(Lk_1[i])[:k - 2]L1.sort()for j in range(i + 1, lenLk):#前k-2個(gè)項(xiàng)相同時(shí),將兩個(gè)集合合并L2 = list(Lk_1[j])[:k - 2]L2.sort()if L1 == L2:Ck.append(Lk_1[i] | Lk_1[j])return Ckdef apriori(dataSet, minSupport = 0.5):C1 = createC1(dataSet)L1, supportData = scanD(dataSet, C1, minSupport)L = [L1]k = 2while (len(L[k-2]) > 0):Lk_1 = L[k-2]Ck = aprioriGen(Lk_1, k)print("ck:",Ck)Lk, supK = scanD(dataSet, Ck, minSupport)supportData.update(supK)print("lk:", Lk)L.append(Lk)k += 1return L, supportDatadataset = loadDataSet() L, supportData = apriori(dataset, minSupport=0.2)

    最終輸出如下,其中ck就是頻繁項(xiàng)候選集lk就是經(jīng)過(guò)閾值篩選后得到的新的頻繁項(xiàng)候選集。該結(jié)果與上圖一致。

    ck: [frozenset({1, 2}), frozenset({1, 5}), frozenset({1, 4}), frozenset({1, 3}), frozenset({2, 5}), frozenset({2, 4}), frozenset({2, 3}), frozenset({4, 5}), frozenset({3, 5}), frozenset({3, 4})] lk: [frozenset({1, 2}), frozenset({1, 5}), frozenset({2, 5}), frozenset({2, 4}), frozenset({2, 3}), frozenset({1, 3})] ck: [frozenset({1, 2, 5}), frozenset({1, 2, 3}), frozenset({1, 3, 5}), frozenset({2, 4, 5}), frozenset({2, 3, 5}), frozenset({2, 3, 4})] lk: [frozenset({1, 2, 5}), frozenset({1, 2, 3})] ck: [frozenset({1, 2, 3, 5})] lk: []

    需要注意的是,在上述代碼的aprioriGen方法中,假定購(gòu)買(mǎi)商品是有順序的,可以通過(guò)頻繁2項(xiàng)集{P1,P2},{P1,P3}推導(dǎo)出頻繁項(xiàng){P1,P2,P3},但是不能通過(guò)頻繁2項(xiàng)集{P3,P4},{P1,P3}推導(dǎo)出頻繁項(xiàng){P1,P3,P4}。如果去掉假設(shè),則需要修改aprioriGen的代碼:

    #將頻繁Lk-1項(xiàng)集轉(zhuǎn)換為候選k項(xiàng)集 def aprioriGen(Lk_1, k):Ck = []lenLk = len(Lk_1)for i in range(lenLk):L1 = Lk_1[i]for j in range(i + 1, lenLk):L2 = Lk_1[j]if len(L1 & L2) == k - 2:L1_2 = L1 | L2if L1_2 not in Ck:Ck.append(L1 | L2)return Ck

    2. 關(guān)聯(lián)規(guī)則挖掘(association rules)

    2.1 關(guān)聯(lián)規(guī)則的置信度(confidence)

    我們的目的是根據(jù)頻繁項(xiàng)集挖掘出關(guān)聯(lián)規(guī)則。關(guān)聯(lián)規(guī)則的意思就是通過(guò)某個(gè)項(xiàng)集可以推導(dǎo)出另一個(gè)項(xiàng)集。比如一個(gè)頻繁項(xiàng)集{P1, P2, P3},就可以推導(dǎo)出六個(gè)可能的關(guān)聯(lián)規(guī)則。其中置信度最高的就是最有可能的關(guān)聯(lián)規(guī)則。

    • {P1} → {P2, P3}
    • {P2} → {P1, P3}
    • {P3} → {P1, P2}
    • {P1, P2} → {P3}
    • {P2, P3} → {P1}
    • {P1, P3} → {P2}

    箭頭左邊的集合稱(chēng)為“前件”,右邊集合稱(chēng)為“后件”,根據(jù)前件會(huì)有較大概率推導(dǎo)出后件,這個(gè)概率就是之前提到的置信度(confidence)。需要注意的是,如果A→B成立,B→A不一定成立。

    一個(gè)具有N個(gè)元素的頻繁項(xiàng)集,共有M個(gè)可能的關(guān)聯(lián)規(guī)則:
    M=∑N?1i=1CNiM = \sum_{N-1}^{i=1}C_N^i M=N?1i=1?CNi?
    下圖是一個(gè)頻繁4項(xiàng)集的所有關(guān)聯(lián)規(guī)則網(wǎng)格示意圖
    M=C41+C42+C43=14M = C_4^1+C_4^2+C_4^3=14 M=C41?+C42?+C43?=14

    上圖中深色區(qū)域表示低可信度規(guī)則,如果012→3是一條低可信度規(guī)則,則所有其它3為后件的規(guī)則都是低可信度。這需要從可信度的概念去理解

    • Confidence(012→3) = P(3|0,1,2)
    • Confidence(01→23) = P(2,3|0,1)
    • P(3|0,1,2) >= P(2,3|0,1)

    由此可以對(duì)關(guān)聯(lián)規(guī)則做剪枝處理。

    2.2 關(guān)聯(lián)規(guī)則置信度的計(jì)算過(guò)程

    置信度的計(jì)算公式為
    置信度=頻繁項(xiàng)集的出現(xiàn)數(shù)量某可能規(guī)則的出現(xiàn)數(shù)量置信度 =\frac{頻繁項(xiàng)集的出現(xiàn)數(shù)量}{某可能規(guī)則的出現(xiàn)數(shù)量} =規(guī)現(xiàn)數(shù)項(xiàng)現(xiàn)數(shù)?
    還是以上篇的超市交易數(shù)據(jù)為例,我們發(fā)現(xiàn)了如下的頻繁項(xiàng)集:

    對(duì)于尋找關(guān)聯(lián)規(guī)則來(lái)說(shuō),頻繁1項(xiàng)集L1沒(méi)有用處,因?yàn)長(zhǎng)1中的每個(gè)集合僅有一個(gè)數(shù)據(jù)項(xiàng),至少有兩個(gè)數(shù)據(jù)項(xiàng)才能生成A→B這樣的關(guān)聯(lián)規(guī)則。

    當(dāng)最小置信度取0.5時(shí),L2最終能夠挖掘出9條關(guān)聯(lián)規(guī)則:

    以P2->P1為例,在本文最上面的表格中,P2出現(xiàn)了7次,頻繁項(xiàng)集{P1, P2}的出現(xiàn)次數(shù)為4次,因此P2->P1的支持度就是4/7。同理,P1出現(xiàn)了6次,那么P1->P2的支持度就是4/6.

    從頻繁3項(xiàng)集開(kāi)始,挖掘的過(guò)程就較為復(fù)雜,要計(jì)算如{P1, P2}這樣的復(fù)合頻繁項(xiàng)集后件,并分別計(jì)算置信度。

    假設(shè)有一個(gè)頻繁4項(xiàng)集(這是杜撰的,文中的數(shù)據(jù)不能生成L4),其挖掘過(guò)程如下:

    發(fā)掘關(guān)聯(lián)規(guī)則的代碼如下

    #生成關(guān)聯(lián)規(guī)則 #L: 頻繁項(xiàng)集列表 #supportData: 包含頻繁項(xiàng)集支持?jǐn)?shù)據(jù)的字典 #minConf 最小置信度 def generateRules(L, supportData, minConf=0.7):#包含置信度的規(guī)則列表bigRuleList = []#從頻繁二項(xiàng)集開(kāi)始遍歷for i in range(1, len(L)):for freqSet in L[i]:H1 = [frozenset([item]) for item in freqSet]if (i > 1):rulesFromConseq(freqSet, H1, supportData, bigRuleList, minConf)else:calcConf(freqSet, H1, supportData, bigRuleList, minConf)return bigRuleList# 計(jì)算是否滿(mǎn)足最小可信度 def calcConf(freqSet, H, supportData, brl, minConf=0.7):prunedH = []#用每個(gè)conseq作為后件for conseq in H:# 計(jì)算置信度conf = supportData[freqSet] / supportData[freqSet - conseq]if conf >= minConf:print(freqSet - conseq, '-->', conseq, 'conf:', conf)# 元組中的三個(gè)元素:前件、后件、置信度brl.append((freqSet - conseq, conseq, conf))prunedH.append(conseq)#返回后件列表return prunedH# 對(duì)規(guī)則進(jìn)行評(píng)估 def rulesFromConseq(freqSet, H, supportData, brl, minConf=0.7):m = len(H[0])if (len(freqSet) > (m + 1)):Hmp1 = aprioriGen(H, m + 1)# print(1,H, Hmp1)Hmp1 = calcConf(freqSet, Hmp1, supportData, brl, minConf)if (len(Hmp1) > 0):rulesFromConseq(freqSet, Hmp1, supportData, brl, minConf)generateRules(L, supportData)

    得到的結(jié)果如下所示

    frozenset({5}) --> frozenset({1}) conf: 1.0 frozenset({5}) --> frozenset({2}) conf: 1.0 frozenset({4}) --> frozenset({2}) conf: 1.0 frozenset({5}) --> frozenset({1, 2}) conf: 1.0 [(frozenset({5}), frozenset({1}), 1.0),(frozenset({5}), frozenset({2}), 1.0),(frozenset({4}), frozenset({2}), 1.0),(frozenset({5}), frozenset({1, 2}), 1.0)]

    3. 為什么需要置信度和支持度同時(shí)確定關(guān)聯(lián)規(guī)則

    以超市購(gòu)物為例。

    TIDItems
    1Bread, Milk
    2Break, Diaper, Beer, Eggs
    3Milk, Diaper, Beer, Coke
    4Bread, Milk, Diaper, Beer
    5Bread, Milk, Diaper, Coke

    TID是transaction ID 即交易編號(hào),也就是有五個(gè)人在超市買(mǎi)了這樣的東西(Iteams),現(xiàn)在我們統(tǒng)計(jì)一下,大家買(mǎi)的東西之間有沒(méi)有什么規(guī)律,比如買(mǎi)面包的是不是很可能同時(shí)買(mǎi)牛奶這樣的規(guī)律。

    在這里,支持度的計(jì)算過(guò)程為
    support=σ(Milk,Diaper,Beer)∣T∣=25=0.4support =\frac{\sigma(Milk, Diaper, Beer)}{|T|} = \frac{2}{5}=0.4 support=Tσ(Milk,Diaper,Beer)?=52?=0.4

    支持度越大,說(shuō)明同時(shí)買(mǎi)這三個(gè)東西的人多,說(shuō)明這三者之間有關(guān)系.

    但是當(dāng)交易量特別大的時(shí)候,假如有一萬(wàn)個(gè)人買(mǎi)東西,只有10個(gè)人同時(shí)買(mǎi)了Milk、Diaper、Beer,但其他9990個(gè)人沒(méi)有買(mǎi)這三者中的任何一個(gè),那么此時(shí)S=10/10000=0.001。如果僅從這個(gè)0.001看,這三者之間沒(méi)有任何關(guān)系,但是事實(shí)卻不是這樣,因?yàn)橹挥惺畟€(gè)人這樣買(mǎi),并且同時(shí)買(mǎi)了這三種東西,所以他們之間應(yīng)該是由關(guān)系的,而不是偶然。

    引入置信度的概念后,比如我們想看{Milk, Diaper}→{Beer}的置信度,則計(jì)算過(guò)程為
    confidence=σ(Milk,Diaper,Beer)σ(Milk,Diaper)=23=0.67confidence=\frac{\sigma(Milk, Diaper, Beer)}{\sigma(Milk, Diaper)} = \frac{2}{3}=0.67 confidence=σ(Milk,Diaper)σ(Milk,Diaper,Beer)?=32?=0.67
    和S支持度比較只有分母變了,變成了買(mǎi)了Milk和Diaper兩種東西的人,這個(gè)式子是說(shuō)買(mǎi)了Milk和Diaper兩種東西的人里面又有多少人買(mǎi)了Beer這個(gè)東西!

    在上面支持度為0.001的情況下,此時(shí)置信度=10/10=100%!足以說(shuō)明兩者之間的關(guān)聯(lián)性。

    但是只有置信度也是不可行的,比如10000個(gè)訂單中,只有一個(gè)人同時(shí)購(gòu)買(mǎi)了Milk,Diaper和Bear,那么此時(shí)的置信度為1/1=100%!可是支持度只有0.0001,非常的小。

    所以正確的有關(guān)聯(lián)的判定是:置信度和支持度都應(yīng)該比較大才可以認(rèn)為這些東西之間有關(guān)聯(lián)!

    總結(jié)

    以上是生活随笔為你收集整理的关联规则Apriori算法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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