前面主要學習了機器學習的兩大塊:分類,回歸,接下來的兩節進入到頻繁項集和關聯規則的分析。
關聯分析中最著名的例子當屬啤酒和尿布了。
為了定義上述的頻繁和關聯我們引入兩個定義:
1、支援度:資料集中包含該集項的記錄所佔的比例
2、置信度:對於關聯規則p–>m,該規則的置信度為:support(p u m) /support( p )
然而,可以通過簡單的計算發現,如果要簡單的重舉各個資料項之間的組合關係是乙個非常龐大的工程,為了解決這一計算的問題,我們引入apriori演算法,即:如果某項集是非頻繁的,那麼該項集的子集也是非頻繁的。
生成候選項集:(支援度)
演算法原理:
佔位符
演算法實現:
def
loaddataset
():return [[1, 3, 4], [2, 3, 5], [1, 2, 3, 5], [2, 5]]
defcreatec1
(dataset):
c1 =
for transaction in dataset:
for item in transaction:
ifnot [item] in c1:
c1.sort()
return map(frozenset, c1)#use frozen set so we
#can use it as a key in a dict
#掃瞄記錄,返回大於最小支援度的資料項集
defscand
(d, ck, minsupport):
sscnt = {}
for tid in d:
for can in ck:
if can.issubset(tid):
ifnot sscnt.has_key(can): 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
apriori實現:演算法原理:
演算法實現:
#從多個子集中構造不重複的超集
#這裡有乙個演算法上的trick,結合下面的函式apriori,思考一下,如果由子集{1,2},{1,3},{2,3}構造超集{1,2,3}.你會怎樣實現,使得所用時間最小呢?
defapriorigen
(lk, k):
#creates ck
retlist =
lenlk = len(lk)
for i in range(lenlk):
for j in range(i+1, lenlk):
l1 = list(lk[i])[:k-2]; l2 = list(lk[j])[:k-2]
l1.sort(); l2.sort()
if l1==l2: #if first k-2 elements are equal
return retlist
defapriori
(dataset, minsupport = 0.5):
c1 = createc1(dataset)
d = map(set, dataset)
l1, supportdata = scand(d, c1, minsupport)
l = [l1]
k = 2
while (len(l[k-2]) > 0):
ck = apriorigen(l[k-2], k)
lk, supk = scand(d, ck, minsupport)#scan db to get lk
supportdata.update(supk)
k += 1
return l, supportdata
從候選集中發現關聯規則(置信度)
def
generaterules
(l, supportdata, minconf=0.7):
#supportdata is a dict coming from scand
bigrulelist =
for i in range(1, len(l)):#only get the sets with two or more items
for freqset in l[i]:
h1 = [frozenset([item]) for item in freqset]
if (i > 1):
rulesfromconseq(freqset, h1, supportdata, bigrulelist, minconf)
else:
calcconf(freqset, h1, supportdata, bigrulelist, minconf)
return bigrulelist
#計算每個規則的置信度並返回置信度》=最小置信度的規則
#h中包含的是所有可能的**項,(弄清楚p,m)
defcalcconf
(freqset, h, supportdata, brl, minconf=0.7):
prunedh = #create new list to return
for conseq in h:
conf = supportdata[freqset]/supportdata[freqset-conseq] #calc confidence
if conf >= minconf:
print freqset-conseq,'-->',conseq,'conf:',conf
return prunedh
#這乙個函式要多理解一下,這是為了從更進一步的找出關聯規則,可以通過將上面的資料帶進去,梳理一下程式的流程。
defrulesfromconseq
(freqset, h, supportdata, brl, minconf=0.7):
m = len(h[0])
if (len(freqset) > (m + 1)): #try further merging
hmp1 = apriorigen(h, m+1)#create hm+1 new candidates
hmp1 = calcconf(freqset, hmp1, supportdata, brl, minconf)
if (len(hmp1) > 1): #need at least two sets to merge
rulesfromconseq(freqset, hmp1, supportdata, brl, minconf)
機器學習實戰 Apriori演算法進行關聯分析
商場的銷售過程,涉及很多機器學習的應用,商品的陳列,購物卷的提供,使用者忠誠度等等,通過對這些大量資料的分析,可以幫組商店了解使用者的購物行為,進而對商品的定價 市場 存貨管理等進行決策幫組。從大規模資料集中尋找物品間的隱含關係被稱作關聯分析 association analysis 或關聯學習 a...
機器學習 演算法 Apriori
參考 很多人都喜歡用 啤酒跟尿布 這個例子來比喻機器學習,主要就是想說明apriori在挖掘物件關聯的重要作用,這個演算法很簡單,沒有涉及複雜的數學知識,一點邏輯而已,還有改進的apriori演算法,有時間我也會實現一下 簡單實現了一下apriori,直接上python 和結果 coding utf...
機器學習複習 Apriori
apriori apriori 是關聯分析中比較早的一種方法,主要用來挖掘那些頻繁項集合。其思想是 1.如果乙個專案集合不是頻繁集合,那麼任何包含它的專案集合也一定不是頻繁集合 2.如果乙個專案集合是頻繁集合,那麼它的任何非空子集也是頻繁集合 aprioir 需要掃瞄專案表多遍,從乙個專案開始掃瞄,...