import sys
db =[[
1,3,
4],[
2,3,
5],[
1,2,
3,5]
,[2,
5]]db1 =[[
'l1'
,'l2'
,'l5'],
['l2'
,'l4'],
['l2'
,'l3'],
['l1'
,'l2'
,'l4'],
['l1'
,'l3'],
['l2'
,'l3'],
['l1'
,'l3'],
['l1'
,'l2'
,'l3'
,'l5'],
['l1'
,'l2'
,'l3']]
def convert_db
(db)
:return
list
(map
(frozenset, db)
) # 此時返回的是迭代器,需要加乙個list作用於map
def generate_c1
(db):''
'計算候選1項集:取出資料中所有的項 儲存成的字典格式'''i
=[]for items in db:i.
extend
(items)i=
set(i)
return
dict([
(frozenset
([item]),
0)for item ini]
) # ):
0,frozenset()
:0,frozenset()
:0,frozenset()
:0,frozenset()
:0}def count_ck_in_db
(candidates, db):''
' 候選集統計出現次數'
''for cset in candidates:
for transaction in db:
if cset.
issubset
(transaction)
: # issubset
()方法用於判斷集合的所有元素是否都包含在指定集合中,如果是則返回 true,否則返回 false。
candidates[cset]+=1
return candidates # ):
2,frozenset()
:3,frozenset()
:3,frozenset()
:1,frozenset()
:3}def filter_ck_to_lk
(candidates, minsup_count):''
'候選集次數 過濾, 注意要將項集排序'
''return[(
sorted
(list
(k))
, v)
for k,v in candidates.
items()
if v >= minsup_count] # [([
1],2
),([
2],3
),([
3],3
),([
5],3
)]def apriori_gen
(lk, k)
: len_lk =
len(lk)
lks =
[items[0]
for items in lk]
lk_db =
set(
convert_db
(lks)
) # 將lk當做乙個庫
ck_news =
lk_list =
list
(lk_db)
# 即將進行兩兩連線
for i in
range
(len_lk)
:for j in
range
(i+1
, len_lk):l1
=list
(lk_list[i])[
0:k-
2] # 取出前k-
1項 l2
=list
(lk_list[j])[
0:k-
2] # 取出前k-
1項 if
l1==l2:
ck_new = lk_list[i]
| lk_list[j] # 連線
lk_db.
add(ck_new)
ifhas_infrequent_subset
(lk_db, ck_new)
: pass
else
: ck_news[
frozenset
(ck_new)]=
0return ck_news
def has_infrequent_subset
(lk_db, ck_new)
:# ck_new是乙個k+
1項集,lk_db是所有large的k項集,需要把ck_new所有的k項集放進lk_db檢測是否存在。
for item in lk_db:
sub_ck = lk_db -
frozenset
([item]
)if sub_ck not in ck_new:
return false
return true
def apriori
(db, min_sup)
: minsup_count =
int(
len(db)
* min_sup)
db =
convert_db
(db)
lks =
# large-
set 格式
k =1 c0 =
generate_c1
(db) # ):
0,frozenset()
:0,frozenset()
:0,frozenset()
:0,frozenset()
:0} ck =
count_ck_in_db
(c0, db) # ):
2,frozenset()
:3,frozenset()
:3,frozenset()
:1,frozenset()
:3} lk =
filter_ck_to_lk
(ck, minsup_count) # [([
1],2
),([
2],3
),([
3],3
),([
5],3
)]lks[k]
= lk # [([
1],2
),([
2],3
),([
3],3
),([
5],3
)]k +=
1while lk:
ck =
apriori_gen
(lk, k)
ck =
count_ck_in_db
(ck, db)
lk =
filter_ck_to_lk
(ck, minsup_count)
if lk:
lks[k]
= lk
k +=
1return lks
if __name__ ==
'__main__'
: lks =
apriori
(db,
0.5)
for k, v in lks.
items()
: sys.stdout.
write
("%s\t%s\n"
%(k, v)
)
關聯規則Apriori
首先介紹的是啤酒和尿布的故事 上網自查 這是學習關聯規則必須知道的乙個故事。頻繁項集,關聯規則,支援度,置信度這四個概念貫穿apriori演算法的始終。如果乙個集合不是頻繁相集,那它的超集比然也不是頻繁相集。機器學習實戰例子 coding utf 8 from numpy import def lo...
關聯規則方法之apriori演算法
apriori algorithm是關聯規則裡一項基本演算法,是由rakesh agrawal和ramakrishnan srikant兩位博士在1994年提出的關聯規則挖掘演算法。關聯規則的目的就是在乙個資料集中找出項與項之間的關係,也被稱為購物藍分析 market basket analysis...
Apriori 關聯規則演算法
關聯規則通過量化的數字描述物品甲的出現對物品乙的出現有多大的影響。它的模式屬於描述型模式,發現關聯規則的演算法屬於無監督學習的方法。其實是一種事物相關性的 通過對比支援度,進行剪枝,將支援度高的分支留下,繼續探尋關聯,直到再沒有高於最小支援度為止。應用場景比較廣泛,購物籃資料,醫療診斷,科學資料分析...