1. 程式人生 > >《機器學習實戰》筆記之十一——使用Apriori演算法進行關聯分析

《機器學習實戰》筆記之十一——使用Apriori演算法進行關聯分析

第十一章 使用Apriori演算法進行關聯分析

  • Apriori演算法
  • 頻繁項集生成
  • 關聯規則生成

從大規模資料集中尋找物品間的隱含關係被稱作為關聯分析(association analysis)和關聯規則學習(association rule learning)。

11.1 關聯分析

關聯分析有兩種形式:頻繁項集、關聯規則。頻繁項集(frequent item sets)是經常出現在一塊的物品的集合,關聯規則(association rules)暗示兩種物品之間可能存在很強的關係。使用頻繁項集和關聯規則,商家可以更好地理解他們的顧客。

當尋找頻繁項集時,有兩個概念比較重要:支援度和可信度。

一個項集的支援度(support)被定義為資料集中包含該項集的記錄所佔的比例。由上圖可以看出項集{豆奶}的支援度為4/5,項集{豆奶,尿布}的支援度為3/5。支援度是針對項集來說,因此可以定義一個最小支援度過濾較小支援度的項集。

可信度或置信度(confidence)是針對關聯規則來定義的。可被定義為conf(B) = support({A,B})/support({A})。

支援度和置信度是用來量化關聯分析是否成功的方法。

11.2 Apriori原理


上圖顯示了4種商品所有可能的組合。對給定的集合項集{0,3},需要遍歷每條記錄並檢查是否同時包含0和3,掃描完後除以記錄總數即可得支援度。對於包含N種物品的資料集共有2的N次方-1種項集組合,即使100種,也會有1.26×10的30次方種可能的項集組成。

為降低計算時間,可用Apriori原理:如果某個項集是頻繁的,那麼它的所有子集也是頻繁的。逆反:如果一個項集是非頻繁集,那麼它的所有超集也是非頻繁的。

11.3 使用Apriori演算法來發現頻繁集

Apriori演算法的兩個輸入引數分別是最小支援度和資料集。首先生成所有單個物品的項集列表,得到滿足最小支援度的項集,將其進行組合生成包含兩個元素的項集,繼續剔除不滿足最小支援度的項集,重複直到所有項集都被去掉。

資料集掃描的虛擬碼:

對資料集中的每條交易記錄tran

每個候選集can

檢查can是否是tran的子集

如果是,則增加can的計數值

對每個候選項集

如果其支援度不低於最小值,則保留該項集

返回所有頻繁項集列表

整個Apriori演算法的虛擬碼:

當集合中項集的個數大於0時

構建一個k個項集組成的候選項集列表

檢查資料以確認每個項集都是頻繁的

保留頻繁項集並構建k+1項組成的候選項集的列表

coding:

<span style="font-size:18px;">#!/usr/bin/env python
# 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
</span>

效果:


Figure 11-4: apriori演算法發現頻繁項集的執行效果

11.4 從頻繁項集中挖掘關聯規則

要找關聯規則,從頻繁項集開始,根據置信度算出頻繁項集中出現的哪些商品必然可以推到出當中的另外一些商品,即找出頻繁項集中各商品之間的關聯規則。

每個頻繁項集可以產生多個關聯規則。如果某條規則並不滿足最小可信度要求,那麼該規則的所有子集也不會滿足最小可信度要求。apriori演算法,可以首先從一個頻繁項集開始,接著建立一個規則列表,其中規則右部只包含一個元素,然後對這些規則進行測試,合併所有剩餘規則來建立一個新的規則列表。

coding:

<span style="font-size:18px;">#===============關聯規則生成函式==================
def generateRules(L, supportData, minConf = 0.7):
    bigRuleList = []                                                            #規則存放在bigRuleList列表中
    for i in range(1, len(L)):
        for freqSet in L[i]:                                                    #L0是頻繁1項集,沒關聯規則
            H1 = [frozenset([item]) for item in freqSet]                        #H1存放頻繁i項集的某個頻繁項集的單個元素集合,頻繁3項集的{0,1,2}的{{0},{1},{2}
            if i>1:
                rulesFromConseq(freqSet, H1, supportData, bigRuleList, minConf) #從頻繁3項集開始,從置信度算出關聯規則
            else:
                calcConf(freqSet, H1, supportData, bigRuleList, minConf)        #對頻繁2項集,計算置信度
    return bigRuleList

def calcConf(freqSet, H, supportData, br1, minConf = 0.7):                      #計算置信度函式,
    prunedH = []
    for conseq in H:
        conf = supportData[freqSet]/supportData[freqSet - conseq]               #conf({2}) = s({{0},{1},{2}})/s({{0},{1},{2}}-{2})
        if conf >= minConf:
            print freqSet-conseq,"——>",conseq, "conf:",conf                     #那麼有{{0},{1}}——>{{2}}
            br1.append((freqSet-conseq, conseq, conf))
            prunedH.append(conseq)
    return prunedH

def rulesFromConseq(freqSet, H, supportData, br1, minConf=0.7):
    m = len(H[0])                                                               #m,頻繁m項集
    if (len(freqSet)) > (m+1):
        Hmp1 = aprioriGen(H, m+1)                                               #由H,建立m+1項集 
        Hmp1 = calcConf(freqSet, Hmp1, supportData, br1, minConf)               #保留符合置信度的m+1項集,Hmp1 = prunedH
        if (len(Hmp1)>1):
            rulesFromConseq(freqSet, Hmp1, supportData, br1, minConf)

L,suppData = apriori(dataSet, minSupport=0.5)
rules      = generateRules(L,suppData, minConf=0.7)
print rules

rules      = generateRules(L,suppData, minConf=0.5)
print rules</span>

效果:


Figure 11-6: apriori演算法發現關聯規則的執行效果

顯然的,降低可信度閾值,獲得更多的規則。

11.5 示例:發現毒蘑菇的相似特徵

資料:

Figure 11-7: mushroom.dat
第一個特徵表示有毒或者可食用,1為可食用,2為有毒。第二列為整數3-8的6種可能的蘑菇傘的形狀。對所有頻繁項集並不是那麼感興趣,而是對特定是否有毒這個元素項的項集感興趣。可通過apriori找出所有跟是否有毒這個特徵相關的項集。 coding:
mushDatSet  = [line.split() for line in open("mushroom.dat").readlines()]
L, suppData = apriori(mushDatSet, minSupport=0.3)
for item in L[1]:
    if item.intersection("2"):
        print item

for item in L[3]:
    if item.intersection("2"):
        print item
效果:
Figure 11-8: 毒蘑菇相關的頻繁項集

11.6 小結

關聯分析是用於發現大資料集中元素間有趣關係的agiel工具集,可用頻繁項集和關聯規則這兩種方式度量。發現元素間的不同組合比較耗時,apriori演算法顯得比較高效。如果一個元素項是不頻繁的,那麼包含該元素的超集也是不頻繁的。

每次增加頻繁項集的大小,apriori演算法都會重新掃描整個資料集,當資料集很大時,會降低頻繁項集發現的速度。

python有資料探勘的工具包pymining,裡面實現了分詞,聚類,關聯分析等功能,可以參考

相關推薦

機器學習實戰第11章——使用 Apriori 演算法進行關聯分析

從大規模資料集中尋找物品間的隱含關係被稱作關聯分析(association analysis)或者關聯規則學習(association rule learning)。   優點:簡單 缺點:對大資料集比較慢 使用資料型別:數值型或者標稱型  

機器學習實戰》chapter 11 使用apriori演算法進行關聯分析

使用apriori演算法進行關聯分析apriori原理:1、一個項集是非頻繁的,那麼它的所有超集也是非頻繁的2、一個項集是頻繁的,那麼它的所有子集也是頻繁的一、支援度(support)-使用apriori發現頻繁項集對於資料集(包含M個項集)1、求單個元素組成項集的集合C1(

機器學習實戰筆記——使用Apriori演算法進行關聯分析

第十一章 使用Apriori演算法進行關聯分析 Apriori演算法頻繁項集生成關聯規則生成 從大規模資料集中尋找物品間的隱含關係被稱作為關聯分析(association analysis)和關聯規則學習(association rule learning)。 11.

機器學習實戰Apriori演算法關聯分析

目錄 0. 前言 1. Apriori 演算法尋找頻繁項集 2. 從頻繁項集中挖掘關聯規則 3. 實戰案例 3.1. apriori演算法發現頻繁項集和關聯規則 學習完機器學習實戰的Apriori,簡單的做個筆記。文中部分描述屬於

機器學習實戰(Machine Learning in Action)學習筆記————07.使用Apriori演算法進行關聯分析

機器學習實戰(Machine Learning in Action)學習筆記————07.使用Apriori演算法進行關聯分析關鍵字:Apriori、關聯規則挖掘、頻繁項集作者:米倉山下時間:2018-11-2機器學習實戰(Machine Learning in Action,@author: Peter H

機器學習實戰】11.使用Apriori演算法進行關聯分析——python3程式

    之前費心費力寫了一篇,結果沒有儲存。這一篇主要放上書本上的程式分析及執行結果。    關聯分析主要分為:頻繁項集生成和關聯規則生成1.頻繁項集生成——Apriori演算法程式碼:def createC1(dataSet): ''' 構建大小為1的所有候

NetAnalyzer筆記 打造自己的協議分析語言(1)初衷與語法構想

回頭看看NetAnalyzer開發系文件上次一篇竟然是2016年,老臉一紅。不過這幾年墨雲成功過的討到一個溫柔賢淑的老婆,有了一個幸福的家庭,去年9月又有了一個大胖兒子,想想也就釋然了^_^ 其實這幾年NetAnalyzer的開發一直也沒有中斷過,上一篇的NetAnalyzer還是3.x系列的版本,現在最新的

機器學習(三)——Apriori演算法進行關聯分析

一. 關聯分析 關聯分析是一種在大規模資料集上尋找有趣關係的任務。這些關係可以有兩種形式:頻繁項集與關聯規則。頻繁項集是經常出現在一塊的物品的集合;關聯規則暗示兩種物品之間可能存在很強的關係。如何量化的評價頻繁項集和關聯規則呢?由此引出了支援度(support)和置信度(confidence)。

第11章:使用Apriori演算法進行關聯分析(從頻繁項集中挖掘關聯規則)

原理: 根據頻繁項集找關聯規則,如有一個頻繁項集{豆奶,萵苣},那麼可能有一條關聯規則是豆奶->萵苣,即一個人購買了豆奶,則大可能他會購買萵苣,但反過來一個人購買了萵苣,不一定他會購買豆奶,頻繁項集使用支援度量化,關聯規則使用可信度或置信度量化。一條規則P->H的可信度定義為支援

第11章:使用Apriori演算法進行關聯分析(計算頻繁項集)

目的:找到資料集中事務的關係,如超市中經常一起出現的物品集合,想找到支援度超過0.8的所有項集 概念: 頻繁項集:指經常出現在一起的物品集合; 關聯規則:指兩個物品之間可能存在很強的關係,如一個人買了什麼之後很大可能會買另一種東西; 支援度:資料集中包含該項集的記錄所佔的比例;保

Apriori演算法進行關聯分析(2)

頻繁項集及關聯規則的應用中,購物、搜尋引擎中的查詢詞等,下面看一個美國國會議員投票的例子。 1. 示例:發現國會投票中的模式 這個例子雖然在資料的獲取過程中有點複雜,但我覺得還是很有必要分析下整個過程。 1. 收集資料:構建美國國會投票記錄的事務資料集

機器學習實戰學習筆記使用Apriori演算法進行關聯

轉載請註明作者和出處:http://blog.csdn.net/john_bh/ 執行平臺: Windows Python版本: Python3.6 IDE: Sublime text3 背景 一、關聯分析 二、Apriori原理

機器學習筆記——整合學習Boosting及AdaBoosting

   上一篇記述了Bagging的思維與應用 : https://blog.csdn.net/qq_35946969/article/details/85045432    本篇記錄Boosting的思想與應用:AdaBoosting、GDBT(

《SAS編程與數據挖掘商業案例》學習筆記

ror otto -c ace mov 得到 replace 讀書筆記 集中 繼續讀書筆記,本文重點側重sas觀測值的操作方面, 主要包含:輸出觀測值、更新觀測值、刪除觀測值、停止輸出觀測值等

【慕課網實戰】Spark Streaming實時流處理項目實戰筆記銘文升級版

win7 小時 其他 har safari 北京 web 連接 rim 銘文一級: DataV功能說明1)點擊量分省排名/運營商訪問占比 Spark SQL項目實戰課程: 通過IP就能解析到省份、城市、運營商 2)瀏覽器訪問占比/操作系統占比 Hadoop項目:userAg

機器學習實戰筆記:K-近鄰演算法在約會網站上的應用

K-近鄰演算法概述 簡單的說,K-近鄰演算法採用不同特徵值之間的距離方法進行分類  K-近鄰演算法 優點:精度高、對異常值不敏感、無資料輸入假定。 缺點:計算複雜度高、空間複雜度高。 適用範圍:數值型和標稱型。   k-近鄰演算法的一般流程 收集資料:可使用任何方法

kubernetes學習筆記:kubernetes dashboard認證及分級授權

第一章、部署dashboard 作為Kubernetes的Web使用者介面,使用者可以通過Dashboard在Kubernetes叢集中部署容器化的應用,對應用進行問題處理和管理,並對叢集本身進行管理。通過Dashboard,使用者可以檢視叢集中應用的執行情況,同時也能夠基於Dashboard建立或修

機器學習實戰筆記)- 使用SciKit-Learn做回歸分析

err 皮爾遜 練習 using flow 相關 一個數 ocean 針對 一、簡介 這次學習的書籍主要是Hands-on Machine Learning with Scikit-Learn and TensorFlow(豆瓣:https://book.douban.co

機器學習技法筆記總結()SVM系列總結及實戰

機器學技法筆記總結(一)SVM系列總結及實戰 1、原理總結 在機器學習課程的第1-6課,主要學習了SVM支援向量機。 SVM是一種二類分類模型。它的基本模型是在特徵空間中尋找間隔最大化的分離超平面的線性分類器。 (1)當訓練樣本線性可分時,通過硬間隔最大化,學習

機器學習實戰教程(二):線性迴歸提高篇樂高玩具套件二手價預測

一、前言 本篇文章講解線性迴歸的縮減方法,嶺迴歸以及逐步線性迴歸,同時熟悉sklearn的嶺迴歸使用方法,對樂高玩具套件的二手價格做出預測。 二、嶺迴歸 如果資料的特徵比樣本點還多應該怎麼辦?很顯然,此時我們不能再使用上文的方法進行計算了,因為矩陣X不是滿秩矩陣,非