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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

关联分析之Apriori学习笔记

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

關(guān)聯(lián)分析(Association analysis)

簡介

大量數(shù)據(jù)中隱藏的關(guān)系可以以‘關(guān)聯(lián)規(guī)則’和‘頻繁項(xiàng)集’的形式表示。rules:{Diapers}–>{Beer}說明兩者之間有很強(qiáng)的關(guān)系,購買Diapers的消費(fèi)者通常會(huì)購買Beer。
除了應(yīng)用在市場籃子數(shù)據(jù)(market basket data)中,關(guān)聯(lián)分析(association analysis)也可以應(yīng)用在其他領(lǐng)域像bioinfomatic(分析復(fù)雜生物知識的學(xué)科)、medical diagnosis、Web mining和scientific data analysis。
在關(guān)聯(lián)分析中有兩個(gè)問題需要解決:1,從大量交易數(shù)據(jù)中發(fā)現(xiàn)隱藏的模式需要大量運(yùn)算;2,有些模式可能只是剛好發(fā)生,因此這些模式是虛假的。所以以下內(nèi)容包括兩點(diǎn):1,利用某種算法高效的挖掘這種模式;2,通過評估這些模式避免產(chǎn)生虛假結(jié)果。1
下面以market basket data分析為例:

幾個(gè)概念:

  • Itemset
    I=i1,i2,?,id是所有項(xiàng)的集合。在association analysis中,0或更多項(xiàng)的集合稱為itemset,具有k項(xiàng)的itemset稱為k-itemset。
  • support count
    包含某個(gè)特定的Itemset的交易數(shù)目。在表6.1中2-itemset{Bread,Milk}的support count:σ({Bread,Milk})=3(1)
  • rule
    規(guī)則,不難理解,XY(XY=?),箭頭左邊稱為先決條件(antecedent),箭頭右邊稱為結(jié)果(consequent)
  • support
    某一項(xiàng)集或規(guī)則發(fā)生次數(shù)占總交易次數(shù)的百分比。s(XY)=s({X,Y})=σ(XY)N(2)
    例如:項(xiàng)集{Bread,Milk}的support為35
  • confidence
    X發(fā)生時(shí)Y發(fā)生的概率,也即條件概率。
    Confidence,c(XY)=σ(XY)σ(X)(3)

尋找關(guān)聯(lián)規(guī)則的兩個(gè)步驟

給定一個(gè)交易集合T,尋找所有的滿足supportminsup,并且confidenceminconf的規(guī)則,minsup和minconf是相應(yīng)的support和confidence的閾值。
一種尋找關(guān)聯(lián)規(guī)則的方法是計(jì)算每一條可能規(guī)則的support和confidence,也就是我們說的蠻力法。這種方法需要大量的運(yùn)算,因?yàn)橐?guī)則的個(gè)數(shù)是呈指數(shù)增長的。一個(gè)包含d個(gè)項(xiàng)的數(shù)據(jù)集可以提取出的規(guī)則的數(shù)目是R=3d?2d+1+1()
既然我們不想使用蠻力法,那么應(yīng)該使用什么方法來尋找關(guān)聯(lián)規(guī)則呢?從上式(1)可以看出規(guī)則XY的support僅僅依賴于相應(yīng)的項(xiàng)集XY的support。例如,下面的規(guī)則的support完全相同,因?yàn)樗麄冇邢嗤捻?xiàng)集{Beer,Diapers,Milk}:
{Beer,Diapers}{Milk},{Beer,Milk}{Diapers},{Diapers,Milk}{Beer},{Beer}{Diapers,Milk},{Milk}{Beer,Diapers},{Diapers}{Beer,Milk}
如果項(xiàng)集{Beer,Diapers,Milk}不是頻繁的,那么可以直接裁剪掉以上所有6個(gè)候選規(guī)則。
因此,許多關(guān)聯(lián)規(guī)則挖掘算法將這個(gè)問題分解成兩個(gè)主要子任務(wù):
- 產(chǎn)生頻繁項(xiàng)集:尋找所有達(dá)到support閾值的項(xiàng)集。
- 產(chǎn)生規(guī)則:從頻繁項(xiàng)集中提取具有高置信度的規(guī)則,這些規(guī)則稱為強(qiáng)規(guī)則。2

產(chǎn)生頻繁項(xiàng)集

Apriori原理

我們可以使用枚舉法列舉出所有可能的k-itemset,然后計(jì)算每個(gè)項(xiàng)集的support。一個(gè)具有m項(xiàng)的數(shù)據(jù)集可以產(chǎn)生2m?1個(gè)項(xiàng)集,而其中滿足support閾值的項(xiàng)集可能很少。顯然,當(dāng)數(shù)據(jù)集很大時(shí),枚舉法并不是個(gè)高效的方法。從下圖可以看出,有4個(gè)項(xiàng)的數(shù)據(jù)集,共有15個(gè)項(xiàng)集。

為了提高尋找頻繁項(xiàng)集的效率,我們應(yīng)該把那些不可能滿足support閾值的項(xiàng)集裁剪掉。
Apriori原理:如果一個(gè)項(xiàng)集是頻繁的,那么它的子項(xiàng)集也一定是頻繁的
反過來說,如果一個(gè)項(xiàng)集不是頻繁的,那么它的父項(xiàng)集也一定不是頻繁的。下圖加了陰影的項(xiàng)集被裁剪掉。

來自 機(jī)器學(xué)習(xí)實(shí)戰(zhàn)
根據(jù)以上原理,我們可以從上往下尋找頻繁項(xiàng)集。也就是,首先尋找頻繁項(xiàng)集:1-itemset,然后再由1-itemset組合成2-itemset…..(其實(shí)上圖的例子并沒有減少需要計(jì)算support的項(xiàng)集個(gè)數(shù)(這個(gè)是不是程序需要改進(jìn)??怎么只有1-itemset是infrequent的時(shí)候才能減少需要計(jì)算的項(xiàng)集數(shù)),如果 3 是infrequent的,那么以下包含3的項(xiàng)集可以全部忽略)
偽代碼
1. 計(jì)算得到頻繁項(xiàng)集1-itemset的集合:Iii=1
2. k=2
當(dāng) kle項(xiàng)的個(gè)數(shù)N時(shí):
Ik=generateIk(D,Ii) …從I_i中產(chǎn)生頻繁項(xiàng)集的集合Ii+1
i=k,k++

其中,generateIk函數(shù)是從k-itemset產(chǎn)生(k+1)-itemset
這個(gè)函數(shù)包含兩個(gè)過程:連接和篩選。
- 連接
當(dāng)確定了一個(gè)頻繁項(xiàng)集k-itemset的全部集合后,它需要和自身連接,生成k+1-itemset。所謂連接,就是兩個(gè)不同的頻繁項(xiàng)集k-itemset,當(dāng)它們的前(k-1)項(xiàng)都相同時(shí),就進(jìn)行合并。
- 篩選
從上面的定理我們得知,當(dāng)子項(xiàng)不是頻繁項(xiàng)集時(shí),父項(xiàng)也一定不是頻繁項(xiàng)集。但當(dāng)子項(xiàng)都是頻繁項(xiàng)集時(shí),其父項(xiàng)卻不一定是頻繁項(xiàng)集。因此,在連接得到(k+1)-itemset后,還需要計(jì)算它的support,如果不滿足support的閾值,那么就刪去。

python程序

下面的程序和 機(jī)器學(xué)習(xí)實(shí)戰(zhàn) 中的程序思想基本相同,但我個(gè)人感覺書中的程序有些難以理解,因此自己寫了一個(gè)。 感謝 機(jī)器學(xué)習(xí)實(shí)戰(zhàn) 作者

'''產(chǎn)生頻繁項(xiàng)集''' def genFreqItemset(dataSet,minSupp=0.5):'''input:dataSet:training data,type:listoutput:freqSet:a list of all the k-itemset.each element is frozensetsupport:a dict,the support of frequent itemset'''unique_value={}I1=[]support={}freqSet=[]m=len(dataSet)for tran in dataSet:for item in tran:if item not in unique_value.keys():unique_value[item]=0unique_value[item]+=1for item in unique_value.keys():supp=float(unique_value[item])/mif supp>=minSupp:I1.append(frozenset([item])) #frozeset can serve as a key to dictionarysupport[frozenset([item])]=supp #only record the support of frequent itemsetI1.sort();freqSet.append(I1)k=2Lk=[]while k<=m:Lk=generateLk(freqSet[k-2],k)Lk,LkSupp=filterLk(dataSet,Lk,minSupp)freqSet.append(Lk)support.update(LkSupp)k+=1return freqSet,supportdef generateLk(freq,k):'''input:freq: the itemset in freq is k-1 itemsetk: create k-itemset from k-1_itemsetoutput:Lk:a list of k-itemset,frequent and infrequent'''Lk=[]for i in range(0,len(freq)-1):for j in range(i+1,len(freq)):if list(freq[i])[0:k-2]==list(freq[j])[0:k-2]:#fore k-1 item is identityLk.append(frozenset(freq[i]|freq[j]))return Lkdef filterLk(dataSet,Lk,minSupp=0.5):'''input: Lk: all the k-itemset that need to be prunedoutput:filteredLk: frequent k-itemset which satisfy the minimum supportLkSupp: the support of frequent k-itemset'''LkSupp={}filteredLk=[]for itemset in Lk:supp=calcSupport(dataSet,itemset)if supp>=minSupp:LkSupp[frozenset(itemset)]=suppfilteredLk.append(frozenset(itemset))return filteredLk,LkSuppdef calcSupport(dataSet,Lk):'''calculate the support of Lk,Lk is a frozenset'''# Lk=list(Lk)[0]dataSet=map(set,dataSet)m=len(dataSet)num=0for tran in dataSet:if Lk.issubset(tran):num+=1return float(num)/m

測試

>>> dataSet [[1, 3, 4], [2, 3, 5], [1, 2, 3, 5], [2, 5]] >>> Lk,support=apriori_f.genFreqItemset(dataSet,0.5) >>> Lk[0] [frozenset([1]), frozenset([2]), frozenset([3]), frozenset([5])] >>> Lk[1] [frozenset([1, 3]), frozenset([2, 3]), frozenset([2, 5]), frozenset([3, 5])] >>> Lk[2] [frozenset([2, 3, 5])] >>> Lk[3] [] >>> support {frozenset([5]): 0.75, frozenset([3]): 0.75, frozenset([2, 3, 5]): 0.5, frozenset([3, 5]): 0.5, frozenset([2, 3]): 0.5, frozenset([2, 5]): 0.75, frozenset([1]): 0.5, frozenset([1, 3]): 0.5, frozenset([2]): 0.75}

從頻繁項(xiàng)集中提取強(qiáng)規(guī)則

修剪

從頻繁項(xiàng)集中提取規(guī)則保證了這些規(guī)則的support一定滿足minsupport,接下來就是置信度的計(jì)算。同樣,我們可以使用蠻力列舉所有可能的規(guī)則,并計(jì)算其置信度,但這樣我們會(huì)做許多無用功。一個(gè)包含n項(xiàng)的頻繁項(xiàng)集,可能產(chǎn)生的規(guī)則數(shù)是2n?1
為了提高效率,我們采用同前面Apriori算法類似的裁剪方法:
如果XY?X不滿足最小置信度,那么XY?X(X?X)也一定不滿足最小置信度。
證明:c(XY?X)=support(Y)support(X)<minConfidence
c(XY?X)=support(Y)support(X),其中,support(X)support(X),所以有c(XY?X)<minConfidence
如下圖:

圖中添加陰影的規(guī)則全部被裁剪掉。

python程序

def getBigRule(freq,support,minConf=0.5):'''input: freq : the frequent k-itemset,k=1,2,...nsupport: corresponding support outpur:bigRuleList: a list of all the rule that satisfy min confidence'''bigRuleList=[]m=len(freq)for i in range(1,m):genRules(freq[i],support,bigRuleList,minConf)return bigRuleListdef genRules(freq,support,brl,minConf=0.5):'''extract rules that satisfy min confidence from a list of k-itemset(k>1)put the eligible rules in the brl'''if len(freq)==0:returnif len(freq[0])==2: #handle 2-itemsetfor itemset in freq:for conseq in itemset:conseq=frozenset([conseq])conf=support[itemset]/support[itemset-conseq]if conf>=minConf:print itemset-conseq, '-->',conseq,'conf:',confbrl.append((itemset-conseq,conseq,conf))elif len(freq[0])>2:H=[]for itemset in freq:# first generate 1-consequence listfor conseq in itemset:conseq=frozenset([conseq])conf=support[itemset]/support[itemset-conseq]if conf>=minConf:print itemset-conseq, '-->',conseq,'conf:',confbrl.append((itemset-conseq,conseq,conf))H.append(conseq)m=2# generate 2,...,k-1 consequencewhile m<len(freq[0]):H=generateLk(H,m)for conseq in H:conf=support[itemset]/support[itemset-conseq]if conf>=minConf:print itemset-conseq, '-->',conseq,'conf:',confbrl.append((itemset-conseq,conseq,conf))m+=1

利用以上得到的頻繁項(xiàng)集測試:

>>> brl=apriori_f.getBigRule(freqSet,support,0.7) frozenset([1]) --> frozenset([3]) conf: 1.0 frozenset([5]) --> frozenset([2]) conf: 1.0 frozenset([2]) --> frozenset([5]) conf: 1.0 frozenset([3, 5]) --> frozenset([2]) conf: 1.0 frozenset([2, 3]) --> frozenset([5]) conf: 1.0 >>> brl [(frozenset([1]), frozenset([3]), 1.0), (frozenset([5]), frozenset([2]), 1.0), (frozenset([2]), frozenset([5]), 1.0), (frozenset([3, 5]), frozenset([2]), 1.0), (frozenset([2, 3]), frozenset([5]), 1.0)]

參考資料:

[1] 機(jī)器學(xué)習(xí)實(shí)戰(zhàn)
[2] 使用Apriori算法和FP-growth算法進(jìn)行關(guān)聯(lián)分析


  • Introduction to data mining Ch6 ?
  • Introduction to data mining Ch6 ?
  • 總結(jié)

    以上是生活随笔為你收集整理的关联分析之Apriori学习笔记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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