1. 程式人生 > >Apriori演算法-關聯規則演算法

Apriori演算法-關聯規則演算法

Apriori 演算法的示意圖:

交易ID

商品ID列表

T100

I1I2I5

T200

I2I4

T300

I2I3

T400

I1I2I4

T500

I1I3

T600

I2I3

T700

I1I3

T800

I1I2I3I5

T900

I1I2I3


Apriori演算法較為簡單:只需要明白兩個概念就好:

  1)支援度:

   每次交易的所有商品為一個集合設位Y={.....},X為二元集合,計算X的支援度,則需遍歷每個集合Y,查詢Y中是否含有與X相同的子集,如果有,則其支援度計數加1,直到得到其最後的支援度F(Xn);在所有X集合的基礎上建立集合Z,Z為三元集合,含有3個商品元素,同樣遍歷所有商品記錄,計算Z所對應的支援度、

 2)置信度:我們需要為候選集的選擇建立個條件,即為它的閾值,支援度閾值或置信度的閾值,可由支援度計算得出,計算出某商品會在某個商品子集的概率分佈。

程式碼實現如下:

"""
Description     : Simple Python implementation of the Apriori Algorithm


使用方法;


    $python apriori.py -f DATASET.csv -s minSupport  -c minConfidence
說明:-f 對應的是資料檔案  -s 對應的是最小支援度  -c 對應的是最小置信度
    $python apriori.py -f DATASET.csv -s 0.15 -c 0.6
"""


import sys


from itertools import chain, combinations
from collections import defaultdict
from optparse import OptionParser




def subsets(arr):
    """ Returns non empty subsets of arr"""
    return chain(*[combinations(arr, i + 1) for i, a in enumerate(arr)])




def returnItemsWithMinSupport(itemSet, transactionList, minSupport, freqSet):
        """calculates the support for items in the itemSet and returns a subset
       of the itemSet each of whose elements satisfies the minimum support"""
        _itemSet = set()
        localSet = defaultdict(int)


        for item in itemSet:
                for transaction in transactionList:
                        if item.issubset(transaction):
                                freqSet[item] += 1
                                localSet[item] += 1


        for item, count in localSet.items():
                support = float(count)/len(transactionList)


                if support >= minSupport:
                        _itemSet.add(item)


        return _itemSet




def joinSet(itemSet, length):
        """Join a set with itself and returns the n-element itemsets"""
        return set([i.union(j) for i in itemSet for j in itemSet if len(i.union(j)) == length])




def getItemSetTransactionList(data_iterator):
    transactionList = list()
    itemSet = set()
    for record in data_iterator:
        transaction = frozenset(record)
        transactionList.append(transaction)
        for item in transaction:
            itemSet.add(frozenset([item]))              # Generate 1-itemSets
    return itemSet, transactionList




def runApriori(data_iter, minSupport, minConfidence):
    """
    run the apriori algorithm. data_iter is a record iterator
    Return both:
     - items (tuple, support)
     - rules ((pretuple, posttuple), confidence)
    """
    itemSet, transactionList = getItemSetTransactionList(data_iter)


    freqSet = defaultdict(int)
    largeSet = dict()
    # Global dictionary which stores (key=n-itemSets,value=support)
    # which satisfy minSupport


    assocRules = dict()
    # Dictionary which stores Association Rules


    oneCSet = returnItemsWithMinSupport(itemSet,
                                        transactionList,
                                        minSupport,
                                        freqSet)


    currentLSet = oneCSet
    k = 2
    while(currentLSet != set([])):
        largeSet[k-1] = currentLSet
        currentLSet = joinSet(currentLSet, k)
        currentCSet = returnItemsWithMinSupport(currentLSet,
                                                transactionList,
                                                minSupport,
                                                freqSet)
        currentLSet = currentCSet
        k = k + 1


    def getSupport(item):
            """local function which Returns the support of an item"""
            return float(freqSet[item])/len(transactionList)


    toRetItems = []
    for key, value in largeSet.items():
        toRetItems.extend([(tuple(item), getSupport(item))
                           for item in value])


    toRetRules = []
    for key, value in largeSet.items()[1:]:
        for item in value:
            _subsets = map(frozenset, [x for x in subsets(item)])
            for element in _subsets:
                remain = item.difference(element)
                if len(remain) > 0:
                    confidence = getSupport(item)/getSupport(element)
                    if confidence >= minConfidence:
                        toRetRules.append(((tuple(element), tuple(remain)),
                                           confidence))
    return toRetItems, toRetRules




def printResults(items, rules):
    """prints the generated itemsets sorted by support and the confidence rules sorted by confidence"""
    for item, support in sorted(items, key=lambda (item, support): support):
        print "item: %s , %.3f" % (str(item), support)
    print "\n------------------------ RULES:"
    for rule, confidence in sorted(rules, key=lambda (rule, confidence): confidence):
        pre, post = rule
        print "Rule: %s ==> %s , %.3f" % (str(pre), str(post), confidence)




def dataFromFile(fname):
        """Function which reads from the file and yields a generator"""
        file_iter = open(fname, 'rU')
        for line in file_iter:
                line = line.strip().rstrip(',')                         # Remove trailing comma
                record = frozenset(line.split(','))
                yield record




if __name__ == "__main__":


    optparser = OptionParser()
    optparser.add_option('-f', '--inputFile',
                         dest='input',
                         help='filename containing csv',
                         default=None)
    optparser.add_option('-s', '--minSupport',
                         dest='minS',
                         help='minimum support value',
                         default=0.15,
                         type='float')
    optparser.add_option('-c', '--minConfidence',
                         dest='minC',
                         help='minimum confidence value',
                         default=0.6,
                         type='float')


    (options, args) = optparser.parse_args()


    inFile = None
    if options.input is None:
            inFile = sys.stdin
    elif options.input is not None:
            inFile = dataFromFile(options.input)
    else:
            print 'No dataset filename specified, system with exit\n'
            sys.exit('System will exit')


    minSupport = options.minS
    minConfidence = options.minC


    items, rules = runApriori(inFile, minSupport, minConfidence)


    printResults(items, rules)

參考文章:

https://blog.csdn.net/androidlushangderen/article/details/43059211

https://github.com/asaini/Apriori/edit/master

相關推薦

apriori關聯規則演算法

問題的背景:     超市的會員卡記錄了大量的使用者購買資料,通過分析這些資料可以幫助商店分析使用者的購買行為。從大規模資料集中尋找物品間的隱含關係被稱為關聯規則分析(association analysis)或關聯規則學習(association rule learnin

Apriori演算法-關聯規則演算法

Apriori 演算法的示意圖:交易ID商品ID列表T100I1,I2,I5T200I2,I4T300I2,I3T400I1,I2,I4T500I1,I3T600I2,I3T700I1,I3T800I1,I2,I3,I5T900I1,I2,I3Apriori演算法較為簡單:只

關聯規則演算法Apriori以及FP-growth學習

關聯規則演算法Apriori以及FP-growth學習   最近選擇了關聯規則演算法進行學習,目標是先學習Apriori演算法,再轉FP-growth演算法,因為Spark-mllib庫支援的關聯演算法是FP,隨筆用於邊學邊記錄,完成後再進行整理 一、概述   關聯規則是一種常見的推薦演算法,用於從發現

sparkmllib關聯規則演算法(FPGrowth,Apriori

關聯規則演算法的思想就是找頻繁項集,通過頻繁項集找強關聯。 介紹下基本概念: 對於A->B 1、置信度:P(B|A),在A發生的事件中同時發生B的概率 p(AB)/P(A)

Apriori演算法--關聯規則挖掘

介紹 Apriori演算法是一個經典的資料探勘演算法,Apriori的單詞的意思是"先驗的",說明這個演算法是具有先驗性質的,就是說要通過上一次的結果推匯出下一次的結果,這個如何體現將會在下面的分析中會慢慢的體現出來。Apriori演算法的用處是挖掘頻繁項集的,頻繁項集粗

Apriori、FP-Tree 關聯規則演算法學習

Apriori演算法性質頻繁項集的所有非空子集必須是頻繁項集。支援度項集A、B同時發生的概率稱為關聯規則的支援度,也稱相對支援度。置信度項集A發生,則項集B發生的概率稱為關聯規則的置信度。演算法過程該演算法根據最小支援度找出最大k項頻繁集,再根據最小置信度,在頻繁集中產生關聯

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

本文轉自:http://blog.csdn.net/haosijia929/article/details/5596939 一、Apriori演算法引數含義 本次共進行了9組實驗,使用了weka安裝目錄data資料夾下的contact-lenses.arff資料。

關聯規則演算法Apriori)在Python上的實現

定義        關聯分析又稱關聯挖掘,就是在交易資料、關係資料或其他資訊載體中,查詢存在於專案集合或物件集合之間的頻繁模式、關聯、相關性或因果結構。可從資料庫中關聯分析出形如“由於某些事件的發生而引起另外一些事件的發生”之類的規則。如“67%的顧客在購買啤酒的同時也會購

Apriori演算法關聯規則學習

關聯分析是在大規模資料中發現有趣關係的演算法。這種關係包括: 1)頻繁項集:經常出現在一起的物品組合。 2)關聯規則:暗示兩種物品之間存在很強的關係。 1. 頻繁項集 怎麼定義一個組合是不是頻繁,有多頻繁? 交易號碼 商品 0 豆奶 萵苣 1 萵苣 尿布 葡萄酒 甜菜 2

【機器學習】資料探勘演算法——關聯規則(一),相關概念,評價指標

綜述:        資料探勘是指以某種方式分析資料來源,從中發現一些潛在的有用的資訊,所以資料探勘又稱作知識發現,而關聯規則挖掘則是資料探勘中的一個很重要的課題,顧名思義,它是從資料背後發現事物之間可能存在的關聯或者聯絡。 關聯規則的目的在於在一個數據集中找出項之間的關

【機器學習】資料探勘演算法——關聯規則(二),挖掘過程,Aprioir演算法

關聯規則挖掘的原理和過程 從關聯規則(一)的分析中可知,關聯規則挖掘是從事務集合中挖掘出這樣的關聯規則:它的支援度和置信度大於最低閾值(minsup,minconf),這個閾值是由使用者指定的。根據 support=(X,Y).count/T.countsupp

推薦演算法-關聯規則|R

推薦演算法-關聯規則 1 概念 關聯規則是常見的推薦演算法,從發現大量使用者行為資料中發現有強關聯的規則。 關聯規則是一種無監督的機器學習方法,用於知識發現。優點是能夠從大量行為資料中挖掘出無法直接感受到的規則,往往能給出意想不到的規則組合。缺點是難

R語言實戰k-means聚類和關聯規則演算法

1、R語言關於k-means聚類 資料集格式如下所示: ,河東路與嶴東路&河東路與聚賢橋路,河東路與嶴東路&新悅路與嶴東路,河東路與嶴東路&火炬路與聚賢橋路,河東路與嶴東路&

python資料分析與挖掘學習筆記(6)-電商網站資料分析及商品自動推薦實戰與關聯規則演算法

這一節主要涉及到的資料探勘演算法是關聯規則及Apriori演算法。 由此展開電商網站資料分析模型的構建和電商網站商品自動推薦的實現,並擴充套件到協同過濾演算法。 關聯規則最有名的故事就是啤酒與尿布的故事,非常有效地說明了關聯規則在知識發現和資料探勘中起的作用和意義。 其中有

基於Spark的FPGrowth(關聯規則演算法

在推薦中,關聯規則推薦使用的比較頻繁,畢竟是通過概率來預測的,易於理解且準確度比較高,不過有一個缺點為,想要覆蓋推薦物品的數量,就要降低支援度與置信度。過高的支援度與置信度會導致物品覆蓋不過,這裡需要其他的推薦方法合作,建議使用基於Spark的模型推薦演算法(矩

Fp關聯規則演算法計算置信度及MapReduce實現思路

說明:參考Mahout FP演算法相關相關原始碼。演算法工程可以在FP關聯規則計算置信度下載:(只是單機版的實現,並沒有MapReduce的程式碼)使用FP關聯規則演算法計算置信度基於下面的思路:1. 首先使用原始的FP樹關聯規則挖掘出所有的頻繁項集及其支援度;這裡需要注意,

HotSpot關聯規則演算法(1)-- 挖掘離散型資料

     提到關聯規則演算法,一般會想到Apriori或者FP,一般很少有想到HotSpot的,這個演算法不知道是應用少還是我查資料的手段太low了,在網上只找到很少的內容,這篇http://wiki.pentaho.com/display/DATAMINING/HotSpo

GIS資訊關聯規則挖掘——Apriori演算法的實現(下)

上篇說明了原理,這篇就直接上核心程式碼了~ 程式碼比較長,所以理解可能有點麻煩,核心思路就是計算選擇的維度後遍歷資料,逐步進行迴圈計算置信度,並淘汰每次迴圈後的最低值。 這裡有一點要注意的,我一開始想用arraylist構造一個堆疊結構進行資料遍歷的儲存跟計算,因為這樣效率比較高。

GIS資訊關聯規則挖掘——Apriori演算法的實現(上)

最近閒著無聊沒啥課,幫讀master的朋友做了一個桌面端的GIS系統,主要功能是景區管理。 其中有個核心功能挺有意思的,就是統計所有景區受損設施的所有致損型別和每個型別具體包含的致損因子後,計算致損因子之間的關聯規則,然後可以根據使用者選定的致損型別組合計算出其景區設施造成損害的概率。(有點

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

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