apriori演算法是一種用於關聯規則挖掘的代表性演算法,主要任務是用於發現事務之間的內在聯絡。
舉個大家都舉爛的例子,超市購物清單,可以事先收集大量的超市購物資料資訊。
單號購買商品
0001
牛奶、泡麵、火腿腸
0002
啤酒、洗衣粉、尿布、抹布
0003
巧克力,尿布,蔬菜,水果
0004
蛋糕,炸雞,啤酒,饅頭,礦泉水
0005
黃瓜,啤酒,尿布,黃瓜……
資料都是我瞎編的。有了資料以後我們就可以通過apriori演算法來分析商品之間的關聯,比如買泡麵的一般都會買火腿腸,買啤酒的也會考慮買尿布等等。我們可以通過這些雜亂無章的資料中,分析出商品之間的內在聯絡,從而可以合理的規劃他們的擺放位置,獲取更高的利潤。
學習apriori演算法之前有一些基本概念的名詞需要搞清楚,明白它們對之後的學習至關重要。
項:項在上面的表中就是乙個商品,乙個商品對應乙個項
項集:項集就是項的集合,集合中有幾個項就稱為幾項集;就是二項集, 三項集
頻繁項集:自然就是經常出現的項集
關聯規則:關聯規則是形如x→y的蘊涵式,其中, x和y分別稱為關聯規則的先導和後繼,注意他們是有先後順序的。
支援度(support):支援度指的是資料集中包含該項集記錄所佔的比例 ,即:項集出線次數/記錄條數 。比如的支援的就是3/5
置信度(confidence):置信度主要是針對關聯規則的,比如有【泡麵→火腿腸】 這個規則 那麼置信度c=支援度/
此外有一點需要明白apriori演算法是建立在關聯分析的基礎上,使用apriori演算法我們可以達到簡化計算,提高效率的目的。
在實際分析中,十分重要的一步就是找到頻繁項集,頻繁項集有可能有只有一項的,有兩項的,三項的,甚至更多。
那麼在資料量小的時候當然可以用遍歷的方式乙個個的計算他們的頻繁項集,但是一旦資料量達到百萬級,就會十分影響計算效率。因此我們就可以使用apriori演算法,apriori演算法很簡單,內容是:如果某個項集是頻繁的,那麼它的所有子集勢必也是頻繁的。換言之如果某個項集是不頻繁的,那麼它的所有超集也是不頻繁的,那麼就容易想到,如果我們算到了乙個項集不頻繁,那麼它之後的超集也可以不用再計算。
在使用apriori演算法的時候主要是兩個步驟
apriori演算法是用來發現頻繁項集的一種方法。apriori演算法的兩個輸入引數分別是最小支援度和資料集。演算法首先會掃瞄生成單項集的支援度列表,然後將小於最小支援度的項刪除,接著用剩下的項集再組合,重複刪除小於最小支援度的項集,重複該過程直到去掉所有不滿足最小支援度的項集。
# 準備資料
defload_data()
:return[[
'1',
'2',
'5'],[
'2',
'4'],[
'2',
'3'],[
'1',
'2',
'4'],[
'1',
'3'],[
'2',
'3'],[
'1',
'3'],[
'1',
'2',
'3',
'5'],[
'1',
'2',
'3',
'5'],[
'1',
'2',
'3']
]# return [['a','b','c','v','s'],['e','f','t','a','z'],['g','f','h','a','b'],['a','z','b'],['e','f','t','a','z']]
# 需要將乙個list中的資料帶回data中求出項集的支援的
defget_support
(itemsets,datas)
: count=
0for item in datas:
len_items =
0for i in itemsets:
if i in item:
len_items+=
1if len_items ==
len(itemsets)
: count+=
1return count/
len(datas)
defis_splic_legal
(compose,copy,lenth)
:# 刪除不合法的節點 為後期運算節省開支
return
true
# 返回可用於剪枝的合法資料
defsplicing
(data)
: splicing_list=
copy= data.copy(
) jdata=data.copy(
)for i in data:
for j in jdata[1:
]:compose =
list
(j)+
list
(i)# 首先要去重
compose =
list
(set
(compose)
)if is_splic_legal(compose,copy,
len(j)):
jdata.pop(0)
return splicing_list
defcut
(minc,datas,results)
: result_list =
# 結果集合
show_dict =
for item in results:
if check_repeat(result_list,item)
:continue
c = get_support(item,datas)
if c > minc:
show_dict[
str(item)]=c
return result_list,show_dict
defcheck_repeat
(data,item)
:for i in data:
iflen
(set
(item))==
len(
set(i)):
count =
0for j in item:
if j in i:
count+=
1if count ==
len(
set(item)):
return
true
return
false
defapriori
(datas,minc,lenth)
:# 通過迴圈約束頻繁項集
itemsset =
set(
[val for item in datas for val in item]
)# 結果集合 初始時單項集
results =
[list
(val)
for val in itemsset]
show_dict=
for i in
range
(lenth)
:# 第一次不用合併
if i >0:
results=splicing(results)
results,show_dict=cut(minc,datas,results)
print
(show_dict)
支援度最小為0.1 長度為4時 結果:
隨手寫的實現**,bug頗多效能不足,後面會優化的
prior演算法是乙個非常經典的頻繁項集的挖掘演算法,很多演算法都是基於aprior演算法而產生的,包括fp-tree,gsp, cba等。這些演算法利用了aprior演算法的思想,但是對演算法做了改進,資料探勘效率更好一些,因此現在一般很少直接用aprior演算法來挖掘資料了,但是理解aprior演算法是理解其它aprior類演算法的前提。
資料探勘演算法 Apriori演算法
apriori演算法 所以做如下補充 關聯規則 形如x y的蘊涵式,其中,x和y分別稱為關聯規則的先導 antecedent或left hand side,lhs 和後繼 consequent或right hand side,rhs 其中,關聯規則xy,存在支援度和信任度。置信度 在所有的購買了左邊...
資料探勘 Apriori演算法
今日資料探勘課學習了apriori演算法,特意總結下,因為自己是大三弱雞,很多地方參考了下面dalao的博文 非常感謝!apriori演算法是一種挖掘關聯規則的頻繁項集演算法,其核心思想是通過候選集生成和情節的向下封閉檢測兩個階段來挖掘頻繁項集。而且演算法已經被廣泛的應用到商業 網路安全等各個領域。...
資料探勘演算法之 apriori
關聯規則之 apriori演算法 實現 2006年5月 include include typedef struct d node 資料庫d typedef struct c node 候選集 typedef struct l node 頻繁集 c node c 100 100 l node l 1...