前面介紹的機器學習演算法均為監督學習方法,即「對於輸入資料x能**變數y」,下面學習幾個非監督學習演算法,即回答「從資料x中能發現什麼」問題,這裡需要回答的x方面的問題可能是「構成x的最佳5個資料簇有哪些」或者「x中哪三個特徵最頻繁地一起出現」等。簡單的聚類方法(包括k均值聚類)就不贅述了,直接介紹兩個關係分析演算法:apriori演算法,fp-growth演算法。
從大規模資料中尋找物品間的隱含關係被稱為關聯分析,或者關聯規則學習。這些關係可以有兩種形式:頻繁項集,關聯規則。
顯然,暴力搜尋法是不可行的,下面介紹一種高效的演算法 —— apriori演算法。
apriori原理是說如果某個相集是頻繁的,那麼它的所有子集也是頻繁的。
關鍵是其逆否命題:如果乙個相集是非頻繁集,那麼它的所有超集也是非頻繁的。
顯然,此原理可以避免相集數目的指數增長,減少在資料集上進行檢查的集合的數目。
演算法流程可以概括為
根據資料集構建初始集合c_1
當集合中項的個數k大於0時:
對c_k以最小支援度進行過濾,生成頻繁項集集合l_k
對l_k中元素相互組合,生成候選項集集合c_k+1
我們在來看步驟「對l_k中元素相互組合,生成候選項集集合c_k+1」,假設共有m個長度為k的項集,機器學習實戰中採用下述方法將項集兩兩組合:滿足兩兩中前k-1個元素相同,隻後乙個元素要求前一條記錄的商品名稱小於後一條記錄的商品名稱,這樣是為了避免重複組合,求它們的並集得到長度為k+1的準頻繁項集。可見,這個過程最多共有c(m,2)中組合,這對於m很大的情況顯然並不理想。其實,可以採用apriori原理先對l_k進行預處理,再進行元素組合得到c_k+1。具體說來,對l_k中的每個項集,觀察該項集的任意k-1長度的子項集是否包含在l_k-1中,如果沒有,說明該子項集為非頻繁項集,那麼根據apriori原理,其超項集必然也不是頻繁項集,因此,l-k中的該項集應該被刪除。
可見apriori演算法有個最大的問題就是要產生大量準頻繁項集或者說候選集,效率不高,並且要多次掃瞄資料庫,在後面的fp-growth演算法將避免了這兩個個問題。
前面給出了頻繁項集的量化定義,即它滿足最小支援度要求。對於關聯規則,這種量化指標成為可信度。apriori原理應用到關聯規則的結論是:假設規則到不滿足最小可信度要求,那麼任何前件(左部)為的自己的規則都不會滿足最小可信度要求。
可以看到,apriori演算法在每次增加頻繁集項的大小時,都要重新掃瞄整個資料集,當資料集很大時,這會顯著降低頻繁項集發現的速度。後面較少的fp-growth演算法則只需要對資料集進行兩次遍歷,能夠顯著加快頻繁項集的速度
### helper functions
def loaddataset():
return [[1,3,4], [2,3,5], [1,2,3,5], [2,5]]
# create the initial itemset c1
def createc1(dataset):
c1 =
for tran in dataset:
for item in tran:
if not [item] in c1:
c1.sort()
return map(frozenset, c1)
# scan the dataset to filter c_k into l_k
def scand(d, ck, minsupport):
sscnt = {}
for tran in d:
for can in ck:
if can.issubset(tran):
if not sscnt.has_key(can):
sscnt[can] = 1
else:
sscnt[can] += 1
numitems = float(len(d))
# l_k
retlist =
# a dict combine c_k with its support
supportdata = {}
for key in sscnt:
support = sscnt[key]/numitems
if support >= minsupport:
retlist.insert(0,key)
supportdata[key] = support
return retlist, supportdata
### apriori algorithm to find the frequent item sets
# create the c_k
# actually the lk in function denotes l_k-1
def apriorigen(lk,k):
retlist =
lenlk = len(lk)
for ii in range(lenlk):
for jj in range(ii+1, lenlk):
l1 = list(lk[ii])[:k-2]
l1.sort()
l2 = list(lk[jj])[:k-2]
l2.sort()
if l1 == l2 :
return retlist
def apriori(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)
supportdata.update(supk)
k += 1
return l, supportdata
### explore the association rules
Apriori演算法 關聯分析
apriori演算法是資料探勘演算法中的重要一員,它是通過對資料集進行關聯分析,從而分析出資料集裡項與項之間的關聯關係。演算法最簡單直接的應用,當屬對超市裡被購買的物品的關聯分析,從而挖掘出顧客購買產品及其附屬產品的關係,例如經典的尿布與啤酒,或者現在各大電商 上,當入手一樣物品後,會給推送來各種很...
關聯分析演算法Apriori介紹
apriori 演算法其名字是因為演算法基於先驗知識 prior knowledge 根據前一次找到的頻繁項來生成本次的頻繁項。apriori 是關聯分析中核心的演算法。apriori 演算法的特點 只能處理分類變數,無法處理數值型變數 資料儲存可以是交易資料格式 事務表 或者是事實表方式 資料 演...
關聯分析(一) Apriori演算法
關聯分析分為非時序關聯分析和時序關聯分析,其中非時序關聯分析採用apriori演算法,利用先驗知識產生頻繁項集以及關聯規則,而時序關聯分析採用gsp演算法。apriori演算法 其名字是因為演算法基於先驗知識 prior knowledge 根據前一次找到的頻繁項來生成本次的頻繁項。apriori是...