Apriori 算法-如何進行關聯規則挖掘

公號:碼農充電站pro
主頁:https://codeshellme.github.iohtml

在數據分析領域有一個經典的故事,叫作「尿布與啤酒」。python

聽說,在美國西部的一家連鎖超市發現,不少男人會在週四購買尿布和啤酒。這樣超市就能夠將尿布與啤酒放在一塊兒賣,即可以增長銷售量。git

「尿布與啤酒」這個案例就屬於數據分析中的關聯分析,也就是分析數據集中的內在隱含關係。github

關聯分析能夠被用於發掘商品與商品之間的內在關聯關係,進而經過商品捆綁銷售或者相互推薦,來增長商品銷量。算法

關聯分析除了能夠用於零售行業外,還能夠用於網站流量分析醫藥行業等。shell

Apriori 算法是一種發掘事物內在關聯關係的算法,它能夠加快關聯分析的速度,從而讓咱們更有效的進行關聯分析。ide

1,關聯分析

關聯分析用於發掘大規模數據集中的內在關係。函數

關聯分析通常要分析數據集中的頻繁項集(frequent item sets)和關聯規則(association rules):網站

  • 頻繁項集:是數據集中頻繁項的集合,集合中能夠有一項或多項物品。
  • 關聯規則:暗示了兩種物品之間可能存在很強的內在關係。

假設,咱們收集了一家商店的交易清單:3d

交易編號 購物清單
1 牛奶,麪包
2 牛奶,麪包,火腿
3 麪包,火腿,可樂
4 火腿,可樂,方便麪
5 麪包,火腿,可樂,方便麪

頻繁項集是一些常常出如今一塊兒的物品集合。好比:{牛奶,麪包}{火腿,方便麪,可樂}都是頻繁項集的例子。

項集中的物品,通常不考慮順序關係。

關聯規則意味着有人買了一種物品,還會買另外一種物品。好比方便麪->火腿,就是一種關聯規則,表示若是買了方便麪,還會買火腿。

2,三個重要概念

關聯分析中有三個重要的概念,分別是:

  • 支持度
  • 可信度 / 置信度
  • 提高度

支持度

要進行關聯分析,首先要尋找頻繁項,也就是頻繁出現的物品集。那麼怎樣才叫頻繁呢?咱們能夠用支持度來衡量頻繁。

支持度是針對項集來講的,一個項集的支持度就是該項集的記錄佔總記錄的比例。一般能夠定義一個最小支持度,從而只保留知足最小支持度的項集。

一個項集{A} 的支持度的定義以下:

在這裏插入圖片描述

好比,在上面表格中的5 項記錄中,{牛奶} 出如今了兩條記錄中,因此{牛奶} 的支持度爲 2/5;而{麪包,火腿} 出如今了三條記錄中,因此{麪包,火腿}的支持度爲3/5

可信度

可信度又叫置信度,它是針對關聯規則來講的,好比{火腿}->{可樂}

一個關聯規則{A}->{B} 表示,若是購買了物品A,會有多大的機率購買物品B?它的可信度的定義以下:

在這裏插入圖片描述

因此,在上面的表格中,{火腿,可樂} 的支持度是 3/5{火腿} 的支持度是 4/5,因此{可樂}->{火腿} 的可信度爲 3/5 除以 4/5,等於 0.75。這意味着,若是購買了火腿,有 75% 的可能性會購買可樂。

提高度

提高度也是針對關聯規則來講的,它表示的是「若是購買物品A,會對購買物品B 的機率提高多少」。

一個關聯規則{A}->{B} 的提高度的定義以下:

在這裏插入圖片描述

提高度會有三種狀況:

  • 提高度{A}->{B} > 1:表示購買物品A 對購買物品B 的機率有提高。
  • 提高度{A}->{B} = 1:表示購買物品A 對購買物品B 的機率沒有提高,也沒有降低。
  • 提高度{A}->{B} < 1:表示購買物品A 對購買物品B 的機率有降低。

3,如何尋找頻繁項

尋找頻繁項的一個簡單粗暴的方法是,對全部的物品進行排列組合,而後計算全部組合的支持度,這種算法也能夠叫作窮舉法

窮舉法

窮舉法就是列出全部物品的組合,而後計算每種組合的支持度。

好比,咱們有一個物品集{0,1,2,3},其中有四個物品,那麼全部的物品組合以下:

在這裏插入圖片描述

從圖中能夠看到一共有15 種組合,計算每一種組合的支持度都須要遍歷一遍全部的記錄,檢查每一個記錄中是否包含該組合。所以有多少種組合,就須要遍歷多少遍記錄,時間複雜度則會很大。

能夠總結出:包含N 種物品的數據集,共有 2N - 1 種組合。爲了計算每種組合的支持度,則須要遍歷 2N - 1 次記錄。

若是一個商店中有100 款商品,將會有1.26*1030 種組合,這是一個很是龐大的數字。而普通商店通常都會有成千上萬的商品,那麼組合數將大到沒法計算。

4,Apriori 算法

爲了下降計算所需的時間,1994 年 Agrawal 提出了著名的 Apriori 算法,該算法能夠有效減小須要計算的組合的數量,避免組合數量的指數增加,從而在合理的時間內計算出頻繁項集。

Apriori 原理是說:若是一個項集是非頻繁集,那麼它的全部超集也是非頻繁的

好比下圖中的項集{1,3} 是非頻繁集,那麼{0,1,3}{1,2,3}{0,1,2,3} 就都是非頻繁項集。這就大大減小了須要計算的項集的數量。

在這裏插入圖片描述

5,Apriori 算法的實現

這裏,咱們使用Apriori 算法來尋找上文表格中的購物清單的頻繁項集(爲了方便查看,我把表格放在這裏)。

交易編號 購物清單
1 牛奶,麪包
2 牛奶,麪包,火腿
3 麪包,火腿,可樂
4 火腿,可樂,方便麪
5 麪包,火腿,可樂,方便麪

efficient_apriori 模塊

Efficient-Apriori 包是Apriori 算法的穩定高效的實現,該模塊適用於 Python 3.6+

使用Apriori 算法要先安裝:pip install efficient-apriori

efficient_apriori 包中有一個 apriori 函數,原型以下(這裏只列出了經常使用參數):

apriori(data, 
  min_support = 0.5, 
  min_confidence = 0.5)

參數的含義:

  • data:表示數據集,是一個列表。列表中的元素能夠是元組,也能夠是列表。
  • min_support:表示最小支持度,小於最小支持度的項集將被捨去。
    • 該參數的取值範圍是 [0, 1],表示一個百分比,好比0.3 表示30%,那麼支持度小於30% 的項集將被捨去。
    • 該參數的默認值爲0.5,常見的取值有0.5,0.1,0.05
  • min_confidence:表示最小可信度。
    • 該參數的取值範圍也是 [0, 1]
    • 該參數的默認值爲0.5,常見的取值有1.0,0.9,0.8

使用 apriori 函數

首先,將表格中的購物清單轉化成 Python 列表,以下:

data = [
    ('牛奶', '麪包'), 
    ('牛奶', '麪包', '火腿'),
    ('麪包', '火腿', '可樂'),
    ('火腿', '可樂', '方便麪'),
    ('麪包', '火腿', '可樂', '方便麪')
]

挖掘頻繁項集和頻繁規則:

# 該函數的使用很簡單,就一行代碼
# 最小支持度爲 0.5
# 最小可信度爲 1
itemsets, rules = apriori(data, min_support=0.5,  min_confidence=1)

查看頻繁項集和頻繁規則:

>>> itemsets # 頻繁項集
{1: { # 只有一個元素的項集
    ('麪包',): 4, # 4 表示記錄數
    ('火腿',): 4, 
    ('可樂',): 3
    }, 
 2: { # 有兩個元素的項集
    ('火腿', '麪包'): 3, 
    ('可樂', '火腿'): 3
    }
}
>>> rules # 頻繁規則
[{可樂} -> {火腿}]

6,總結

本篇文章主要介紹了什麼是關聯分析,關聯分析中三個重要的概念,以及 Apriori 算法。

Apriori 算法用於加快關聯分析的速度,但它也須要屢次掃描數據集。其實除了Apriori 算法,還有其它算法也能夠加快尋找頻繁項集的速度。

2000 年提出的FP-Growth 算法,對 Apriori 算法進行了改進。FP-Growth 經過建立一棵 FP樹來存儲頻繁項集。對不知足最小支持度的項不會建立節點,減小了存儲空間。並且整個生成過程只遍歷數據集 2 次,大大減小了計算量。

另外,還有CBA 算法,GSP 算法等,都對Apriori算法進行了改進,這裏再也不詳細介紹。

(本節完。)


推薦閱讀:

數據變換-歸一化與標準化

如何使用Python 進行數據可視化

KNN 算法-實戰篇-如何識別手寫數字

K 均值算法-如何讓數據自動分組

PageRank 算法-Google 如何給網頁排名


歡迎關注做者公衆號,獲取更多技術乾貨。

碼農充電站pro

相關文章
相關標籤/搜索