1. 程式人生 > >關聯規則方法之apriori演算法

關聯規則方法之apriori演算法

        Apriori algorithm是關聯規則裡一項基本演算法,是由Rakesh Agrawal和Ramakrishnan Srikant兩位博士在1994年提出的關聯規則挖掘演算法。關聯規則的目的就是在一個數據集中找出項與項之間的關係,也被稱為購物藍分析 (Market Basket analysis),因為“購物藍分析”很貼切的表達了適用該演算法情景中的一個場景。 

        先上一下apriori的python實現的程式碼:

#! -*- coding:utf-8 -*-
#code write by guohao

import itertools

class Apriori(object):
    
    def __init__(self,min_sup=0.2,dataDic={}):
        self.data = dataDic      #構建資料記錄詞典
        self.size = len(dataDic) #統計事務個數
        self.min_sup = min_sup   #最小支援度閾值
        self.min_sup_val = min_sup * self.size  #最小支援度計數

    def find_frequent_1_itemsets(self):
        FreqDic = {}   #用於統計物品的支援度計數
        for event in self.data:    #event為每一條記錄
            for item in self.data[event]:   #item為項
                if item in FreqDic:
                    FreqDic[item] += 1
                else:
                    FreqDic[item] = 1

        L1 = []
        for itemset in FreqDic:
            if FreqDic[itemset] >=self.min_sup_val:  #過濾掉小於最小支援度計數的1-項集
                L1.append([itemset])
        return L1

    def has_infrequent_subset(self,c,L_last,k):
        #c為當前集合,L_last為上一個頻繁項集的集合,k為當前頻繁項集內的元素個數
        #該函式用於檢查當前子集是否都為頻繁項集
        subsets = list(itertools.combinations(c,k-1))
        for each in subsets:
            each = list(each)
            if each not in L_last:
                return True
        return False

    def apriori_gen(self,L_last):  #連線步實現
        k = len(L_last[0]) + 1
        Ck = []
        for itemset1 in L_last:
            for itemset2 in L_last:
                flag = 0
                for i in range(k-2):
                    if itemset1[i] != itemset2[i]:    #如果前k-2項中有一項不相等,則合併的項集必定不為頻繁項集
                        flag = 1
                        break
                if flag == 1:continue
                if itemset1[k-2] < itemset2[k-2]:
                    c = itemset1 + [itemset2[k-2]]    #合成待定k項集
                else:
                    continue

                if self.has_infrequent_subset(c,L_last,k):  #判斷是否為1-項集
                    continue
                else:
                    Ck.append(c)
        return Ck

    def do(self):
        L_last = self.find_frequent_1_itemsets()   #找到頻繁一項集
        L = L_last
        i = 0
        while L_last != []:
            Ck = self.apriori_gen(L_last)      #合併形成新的待定頻繁項集
            FreqDic = {}         #項集的頻數集合
            for event in self.data:
                for c in Ck:    
                    if set(c) <= set(self.data[event]): #判斷新合成的頻繁集是否是事務記錄的子集
                        if tuple(c) in FreqDic:
                            FreqDic[tuple(c)] += 1
                        else:
                            FreqDic[tuple(c)] = 1
            Lk = []
            for c in FreqDic:
                if FreqDic[c] > self.min_sup_val: #判斷新形成的待定頻繁項集是否為為真正的頻繁項集
                    Lk.append(list(c))
            L_last = Lk
            L += Lk
        return L



#*****************************Test*****************************
print('======================Test===================')
Data = {'T100':['I1','I2','I5'],
        'T200':['I2','I4'],
        'T300':['I2','I3'],
        'T400':['I1','I2','I4'],
        'T500':['I1','I3'],
        'T600':['I2','I3'],
        'T700':['I1','I3'],
        'T800':['I1','I2','I3','I5'],
        'T900':['I1','I2','I3']}

a = Apriori(dataDic = Data)
print(a.do())

        apriori演算法的核心是連線步與剪下步,要想了解具體的演算法思想以及連線步剪下步原理的話,可以看一下這篇文章

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

        這裡解釋一下程式碼中比較難理解的一段程式碼:

for itemset1 in L_last:
            for itemset2 in L_last:
                flag = 0
                for i in range(k-2):
                    if itemset1[i] != itemset2[i]:    #如果前k-2項中有一項不相等,則合併的項集必定不為頻繁項集
                        flag = 1
                        break
                if flag == 1:continue
                if itemset1[k-2] < itemset2[k-2]:
                    c = itemset1 + [itemset2[k-2]]    #合成待定k項集
                else:
                    continue

        對於項集L_last中包含k-1個項的任意兩個頻繁項集itemset1,itemset2,要使其合成為包含k個項的待定頻繁項集,要完成這樣的事,即就是給itemset1新增itemset2中其不存在的項;但為什麼要在合成的時候保證itemset1和itemset2中的前k-2個項相同呢?

       我們這樣來思考,合成的待定頻繁項集Lk可以看做為Lk-1與L1連線而成,這裡連線的時候保證連線時的L1的項要大於Lk-1的項,因為如果不大於的話,可能會出現這樣的無序項集['I1','I2','I5','I3'],由於頻繁項集的子集也是頻繁項集,故而['I1','I2','I3']是頻繁項集,故而其與L1連線可生成['I1','I2','I3','I5'],它與['I1','I2','I5','I3']是等價的,故而我們不妨將項集的格式都設為有序的,其並不影響我們的頻繁項集的合成過程。新頻繁項集Lk是建立在Lk-1上的,直接用Lk-1與L1連線有時在我們看來有點大材小用,因為對於一些L1中的元素,其與Lk-1連線後形成的Lk的子集,有可能不在Lk-1中,L1的範圍有點大,為簡化期間,我們可以直接讓Lk-1中的項集與Lk-1中其他項集中該項集不具備的項連線,這樣就簡化了問題,在廣度上降低演算法的複雜度。

參考資料:

《大資料探勘》  卓金武 周英 卞月青著

《python資料分析與挖掘實戰》  張良均 王路 譚立雲 蘇劍林著

相關推薦

HAWQ + MADlib 玩轉資料探勘(七)——關聯規則方法Apriori演算法

一、關聯規則簡介        關聯規則挖掘的目標是發現數據項集之間的關聯關係,是資料挖據中一個重要的課題。關聯規則最初是針對購物籃分析(Market Basket Analysis)問題提出的。假設超市經理想更多地瞭解顧客的購物習慣,特別是想知道,哪些商品顧客可能會在一次購

關聯規則方法apriori演算法

        Apriori algorithm是關聯規則裡一項基本演算法,是由Rakesh Agrawal和Ramakrishnan Srikant兩位博士在1994年提出的關聯規則挖掘演算法。關聯規則的目的就是在一個數據集中找出項與項之間的關係,也被稱為購物藍分析 (M

資料探勘關聯規則挖掘Apriori演算法實現

演算法細節見論文:Fast Algorithm for Mining Association Rules 控制檯版本C++程式碼如下: #include <iostream> #include <sstream> #include <fs

資料探勘關聯規則挖掘(Apriori演算法

一、概述本篇博文主要闡述資料探勘相關的關聯規則挖掘的演算法(Apriori演算法)。主要介紹關聯規則的基本概念、Apriori演算法原理和Apriori演算法例項,文章末尾處附加Apriori演算法源程式。二、關聯規則挖掘的基本概念關聯規則挖掘發現大量資料中項集之間有趣的關聯

挖掘關聯規則Apriori演算法詳解

1. 挖掘關聯規則 1.1   什麼是關聯規則 一言蔽之,關聯規則是形如X→Y的蘊涵式,表示通過X可以推導“得到”Y,其中X和Y分別稱為關聯規則的先導(antecedent或left-hand-side, LHS)和後繼(consequent或right-hand-side

資料菜鳥的挖掘旅(二)關聯規則Apriori演算法

一、介紹 假如,我們手中有一個顧客在商場中購買物品交易記錄的資料庫。我們如何通過這個資料庫,找出一些規則,再通過一些方法,讓這些規則被顧客接受,促使他們在商場中購買更多的商品?、 就像很早以前所說的——啤酒與尿布 二、幾個基本概念 2.1項集(I

機器學習 (十五) 關聯分析Apriori演算法

前言        目前隨著資料量迅速增多,從海量資料中尋找有價值的資訊帶來的成本也在不斷增加,傳統的搜尋資料方式已經不能滿足我們的需要,我們先來通過一個演算法看一下演算法時間複雜度快慢帶來的影響,通過計算耗時我們會有個感性

關聯分析Apriori演算法

1.資料探勘與關聯分析 資料探勘是一個比較龐大的領域,它包括資料預處理(清洗去噪)、資料倉庫、分類聚類、關聯分析等。關聯分析可以算是資料探勘最貼近我們生活的一部分了,開啟卓越亞馬遜,當挑選一本《Android4高階程式設計》時,它會不失時機的列出你可能還會感興趣的書籍,比如

機器學習Apriori演算法和FP-growth演算法

1 關聯分析 無監督機器學習方法中的關聯分析問題。關聯分析可以用於回答"哪些商品經常被同時購買?"之類的問題。 2 Apriori演算法   頻繁項集即出現次數多的資料集   支援度就是幾個關聯的資料在資料集中出現的次數佔總資料集的比重。或者說幾個資料關聯出現的概率。   置信度體現了一個數據出現後,另

關聯分析概述1——Apriori 演算法簡介

關聯分析概述 “關聯分析”就是分析在眾多的歷史交易記錄中,出現很多的組合項有哪些,並且得出“購買了 A 物品的顧客還很有可能會一起購買 B 物品”這樣的結論。 那麼,“分析一起出現的組合項”有什麼用呢? 1、我們可以發現哪些商品的組合銷量高,例如,我們知道周志華的《機器學習》和李航的

資料倉庫與資料探勘Apriori演算法例項

最近剛上了資料探勘這門課,老師講了兩個演算法,即Apriori演算法和FP-growth演算法,然後佈置了上機作業,挖掘一個有8萬行的記錄的retail.dat,需要從中找出強規則,即同時滿足最小支援度和最小置信度的規則。 Apriori演算法 在這裡給出一個實現找出所有頻繁模式集的

資料探勘Apriori演算法

python3程式碼如下: #coding = utf-8 import numpy #from python_util import fileread """ 程式所需部分: 建立初始的候選集 根據Lk產生Lk+1

資料探勘領域十大經典演算法Apriori演算法

簡介 先驗演算法(Apriori Algorithm)是關聯規則學習的經典演算法之一。先驗演算法的設計目的是為了處理包含交易資訊內容的資料庫(例如,顧客購買的商品清單,或者網頁常訪清單。)而其他的演算法則是設計用來尋找無交易資訊(如Winepi演算法和Mi

【Python資料探勘課程】八.關聯規則挖掘及Apriori實現購物推薦

        這篇文章主要介紹三個知識點,也是我《資料探勘與分析》課程講課的內容。        1.關聯規則挖掘概念及實現過程;        2.Apriori演算法挖掘頻繁項集;        3.Python實現關聯規則挖掘及置信度、支援度計算。一. 關聯規則挖掘概

LBS地理位置距離計算方法geohash演算法

隨著移動終端的普及,很多應用都基於LBS功能,附近的某某(餐館、銀行、妹紙等等)。基礎資料中,一般儲存了目標位置的經緯度;利用使用者提供的經緯度,進行對比,從而獲得是否在附近。這裡需要在設定出一個欄位,是關於編碼的欄位,一會看下文哈…… 地理位置距離實現目標:查詢附近多少公里內的人或者商家 比如:微信、陌

CBA演算法---基於關聯規則進行分類的演算法

介紹 CBA演算法全稱是Classification base of Association,就是基於關聯規則進行分類的演算法,說到關聯規則,我們就會想到Apriori和FP-Tree演算法都是關聯規則挖掘演算法,而CBA演算法正是利用了Apriori挖掘出的關聯規則,然

資料探勘入門系列教程(四點五)Apriori演算法

[TOC] ## 資料探勘入門系列教程(四點五)之Apriori演算法 Apriori(先驗)演算法**關聯規則**學習的經典演算法之一,用來尋找出資料集中頻繁出現的資料集合。如果看過以前的部落格,是不是想到了這個跟[資料探勘入門系列教程(一)之親和性分析](https://www.cnblogs.com

資料探勘入門系列教程(五)Apriori演算法Python實現

資料探勘入門系列教程(五)之Apriori演算法Python實現載入資料集獲得訓練集頻繁項的生成生成規則獲得support獲得confidence獲得Lift進行驗證總結參考 資料探勘入門系列教程(五)之Apriori演算法Python實現 在上一篇部落格中,我們介紹了Apriori演算法的演算法流

資料探勘關聯規則Apriori演算法

一、Aoriori原始演算法: 頻繁挖掘模式與關聯規則 關聯規則兩個基本的指標(假設有事務A和事務B)   1、支援度(suport):計算公式如下        2、置信度(confidence):    關聯規則的挖掘過程:   1、設定最小支援度閾值,找出所有的頻繁項集且每個出現的次數要

機器學習演算法(一)——關聯規則Apriori演算法及R語言實現方法

關聯規則演算法算是一種十分常用的機器學習演算法,無論是面試還是日後工作中都會經常出現,那麼本篇小博就記錄一下自己學習關聯規則經典演算法Apriori的筆記。 1、概述 Apriori演算法是用一種稱為逐層搜尋的迭代方法,從項集長度k=1開始,選出頻繁的k=1項集,根據先驗性