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

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

    之前費心費力寫了一篇,結果沒有儲存。這一篇主要放上書本上的程式分析及執行結果。

    關聯分析主要分為:頻繁項集生成關聯規則生成

1.頻繁項集生成——Apriori演算法

程式碼:

def createC1(dataSet):
    '''
    構建大小為1的所有候選項的集合,儲存不重複的項值
    map(function,data)對映函式,在python3中返回一個迭代器,智慧迴圈一次,故改為list
    frozenset() 返回一個凍結的集合,凍結後集合不能再新增或刪除任何元素,不可改變
                可用做字典鍵值使用
    '''
    C1=[]
    for transcation in dataSet:
        for item in transcation:
            if not [item] in C1:
                C1.append([item])
    C1.sort()
    return list(map(frozenset,C1))    
    
def scanD(D,Ck,minSupport):
    '''
    D:資料集  Ck:候選項集列表 minSupport:最小支援度
    '''
    ssCnt={}                      #建立空字典
    for tid in D:        
        for can in Ck:            
            if can.issubset(tid):
                if not ssCnt. __contains__(can): #與課本不同,python3沒有has_key()
                    ssCnt[can]=1
                else:
                    ssCnt[can]+=1
                                
    numItems=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):
    '''
    建立候選項集   Lk:頻繁項集列表   k:項集元素個數,期望得到的是含有k個元素的集合
    '''
    retList=[]
    lenLk=len(Lk)
    for i in range(lenLk):
        for j in range(i+1,lenLk):
            L1=list(Lk[i])[:k-2]    #取兩個集合前k-2個數
            L2=list(Lk[j])[:k-2]
            L1.sort()
            L2.sort()
            if L1==L2:           
                retList.append(Lk[i]|Lk[j])   #如果兩個集合前k-2個元素都相等,那這兩個集合合成一個集合,並操作
    return retList


def apriori(dataSet,minSupport=0.5):
    '''
    apriori演算法主函式
    '''
    #前3條語句是對計算查詢單個元素中的頻繁項集
    C1=createC1(dataSet)
    D=list(map(set,dataSet))
    L1,supportData=scanD(D,C1,minSupport)
    L=[L1]
    k=2    
    #L[k-1]中集合有k個元素,迴圈更新頻繁項集
    while(len(L[k-2])>0):    #是否還有候選集        
        Ck=aprioriGen(L[k-2],k)
        Lk,supK=scanD(D,Ck,minSupport)
        supportData.update(supK)  #把supk的鍵值對新增到supportData裡
        L.append(Lk)
        k+=1
    return L,supportData

對給定的簡單資料集:

#建立資料集
def loadDataSet():
    return [[1,3,4],[2,3,5],[1,2,3,5],[2,5]]
if __name__=='__main__':    
    dataSet=loadDataSet()
    L,support=apriori(dataSet,0.5)
    
    for k in support:
        print(k,support[k])
    print()
    print(L)

得到結果:


2.關聯規則生成

    我認為書本上的generateRules()函式有錯誤。當頻繁項元素大於2(程式裡 i>1)時,應該先計算規則右部元素個數為1時的可信度,而不是直接跳過。程式碼修改為:

def generateRules(L,supportData,minConf=0.7):
    '''
    關聯規則生成主函式
    L:頻繁集項列表   supportData:包含頻繁項集支援資料的字典  minConf:最小可信度閾值
    構建關聯規則需有大於等於兩個的元素
    '''
    bigRuleList=[]
    for i in range(1,len(L)):
        for freqSet in L[i]:
            H1=[frozenset([item]) for item in freqSet] #記錄freqSet裡的單個元素
            H1=calcConf(freqSet,H1,supportData,bigRuleList,minConf)
            if (i>1):
                #考慮進行進一步合併,這裡與課本不同
                #如果只有兩個元素,即只包含關於A->B形式的集合,無需對supportData進行更新                
                rulesFromConseq(freqSet,H1,supportData,bigRuleList,minConf)
            
    return bigRuleList

def calcConf(freqSet,H,supportData,br1,minConf=0.7):
    '''
    計算規則可信度以及找到滿足最小可信度要求的規則    
    freqSet是H的超集
    具體是計算freqSet-conseq'-->'conseq的可信度
    '''
    prunedH=[]
    for conseq in H:
        conf=supportData[freqSet]/support[freqSet-conseq]
        if conf>=minConf:
            print( freqSet-conseq,'-->',conseq,'conf:',conf)
            br1.append((freqSet-conseq,conseq,conf))
            prunedH.append(conseq)
    return prunedH

def rulesFromConseq(freqSet,H,supportData,br1,minConf=0.7):
    '''
    這裡H相當於freqSet子集
    在這個函式裡面,迴圈是從子集元素個數由2一直增大到freqSet的元素個數減1
    '''
    m=len(H[0])
    if(len(freqSet)>(m+1)):
        Hmp1=aprioriGen(H,m+1)    #將H中各集合(元素個數為m)合併成有m+1個元素的集合
        Hmp1=calcConf(freqSet,Hmp1,supportData,br1,minConf)        
        if(len(Hmp1)>1):        #表示至少還有兩個子集,可以合併,相當於迴圈操作
            rulesFromConseq(freqSet,Hmp1,supportData,br1,minConf)

對給定簡單資料集:

if __name__=='__main__':
       
    dataSet=loadDataSet()
    L,support=apriori(dataSet,0.5)    
    rules=generateRules(L,support,0.5)

得到結果:


圖中用紅筆標識的部分在書本所寫程式碼中是無法得到的。

相關推薦

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

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

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

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

機器學習實戰FP-growth演算法詳解

Here is code 背景 apriori演算法 需要多次掃描資料,I/O 大大降低了時間效率 1. fp-tree資料結構 1> 項頭表 記錄所有的1項頻繁集出現的次數,並降序排列 2> fp tree 根據項頭表,構建fp樹 3>

機器學習實戰—KNN分類演算法

一、KNN演算法概述 kNN分類演算法本身簡單有效,既可以分類又可以進行迴歸。 核心原理:已知樣本資料集的每一個數據的特徵和所屬的分類,將新資料的特徵與樣本資料進行比較,找到最相似(最近鄰)的K(k

機器學習實戰(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 演算法進行關聯分析

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

機器學習實戰knn演算法手寫

首先初始化資料 def createDataSet(): group = np.array([[1.0, 1.1], [1.0, 1.0], [0.0,0.0], [0.0,0.1]]) labels = ['A', 'A', 'B', 'B']

機器學習實戰第2章 K-近鄰演算法(k-NearestNeighbor,KNN)

第2章 k-近鄰演算法 <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=default"></script>

機器學習實戰第10章 K-Means(K-均值)聚類演算法

第 10章K-Means(K-均值)聚類演算法 K-Means 演算法 聚類是一種無監督的學習, 它將相似的物件歸到一個簇中, 將不相似物件歸到不同簇中. 相似這一概念取決於所選擇的相似度計算方法. K-Means 是發現給定資料集的 K 個簇的聚類演算法, 之

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

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

機器學習實戰第13章 利用 PCA 來簡化數據

light nan 文本 com axis 均值 ... cati 二維空間 第13章 利用 PCA 來簡化數據 降維技術 場景 我們正通過電視觀看體育比賽,在電視的顯示器上有一個球。 顯示器大概包含了100萬像素點,而球則可能是由較少的像素點組成,例如說一千個像素

機器學習實戰樸素貝葉斯

一.概述 二.理論基礎 三.文件分類 四.垃圾郵件過濾 五.從個人廣告中獲取區域傾向 六.程式碼問題總結 七.總結   一、概述 貝葉斯分類是一類分類演算法的總稱,這類演算法均以貝葉斯定理為基礎,故統稱為貝葉斯分類。本章首先介紹貝葉斯分類演算法的基礎——

機器學習實戰支援向量機----分類庫和簡單訓練mnist

前面已經對mnist資料集進行了讀取,現在我們可以直接使用sklearn.svm模組中的演算法庫對mnist資料集進行訓練。 【svm模組】 演算法庫: sklearn.svm模組中提供了這些庫: 大概分成這幾類(除了svm_l1_min_c

機器學習實戰》使用Apriori演算法和FP-growth演算法進行關聯分析(Python版)

===================================================================== 《機器學習實戰》系列部落格是博主閱讀《機器學

機器學習實戰網格搜尋--貝葉斯新聞文字分類器調優

#對文字分類的樸素貝葉斯模型的超引數組合進行網格搜尋 #從sklearn.datasets中匯入20類新聞文字抓取器 from sklearn.datasets import fetch_20newsgroups import numpy as np #抓取新

機器學習實戰Logistic迴歸 總結與思考

【機器學習實戰】Logistic迴歸 全部程式均是依照《機器學習實戰》書寫,然後進行了一些修改(順便鞏固python) Logistic原理簡單解釋 作者在書中這樣描述Logistic迴歸 根據現有資料對分類邊界線建立迴歸公式,以此進行分類 --《機器學習實戰》P73 這本書對於理論的東

機器學習實戰第6章 支援向量機(Support Vector Machine / SVM)

第6章 支援向量機 <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=default"></script>

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

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

機器學習實戰第3章 決策樹

第3章 決策樹 <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=default"></script> 決策

機器學習實戰第1章 機器學習基礎

第1章 機器學習基礎機器學習 概述機器學習就是把無序的資料轉換成有用的資訊。獲取海量的資料從海量資料中獲取有用的資訊我們會利用計算機來彰顯資料背後的真實含義,這才是機器學習的意義。機器學習 場景例如: