1. 程式人生 > >關聯分析概述1——Apriori 演算法簡介

關聯分析概述1——Apriori 演算法簡介

關聯分析概述

“關聯分析”就是分析在眾多的歷史交易記錄中,出現很多的組合項有哪些,並且得出“購買了 A 物品的顧客還很有可能會一起購買 B 物品”這樣的結論。

那麼,“分析一起出現的組合項”有什麼用呢?
1、我們可以發現哪些商品的組合銷量高,例如,我們知道周志華的《機器學習》和李航的《統計學習方法》這兩本書通常都是被人們口耳相傳一起被推薦給想入門機器學習的朋友,然後顧客一起購買的。作為商家,其實我們並不知道這件事,但是通過關聯分析,分析交易記錄,我們就可以在眾多歷史交易記錄中發現這個事實,如果我們單獨統計《機器學習》的購買次數和《統計學習方法》是不能得出這個結論的;
2、得到“《機器學習》和《統計學習方法》會被一起購買”這個事實有什麼用呢?如果一個人他只是來買《機器學習》這本書的,它並不知道《統計學習方法》,我們通過得到“《機器學習》和《統計學習方法》會被一起購買”這個事實,就可以把《統計學習方法》推薦給他。或者我們就把《機器學習》和《統計學習方法》作為套餐一起銷售(兩本書一起買比分別單獨買要便宜),以達到促銷的目的。
分析出《機器學習》和《統計學習方法》這兩件商品之間的關聯性,這就是關聯分析能達到的目標之一。

另外,關聯分析還能夠幫我們得到一些諸如“購買了《機器學習實戰》的讀者絕大多數還會同時購買了《機器學習》和《統計學習方法》”、“購買了薯條和漢堡的顧客還會購買可樂”這樣的結論。當顧客欲購買《機器學習實戰》的時候,我們把《機器學習》和《統計學習方法》推薦給他,想購買薯條和漢堡的顧客,我們把可樂推薦給他。即通過關聯分析,把以往顧客覺得“一起購買,食用更加”的商品組合挖掘出來,我們就可以推薦給更多有相似購買慾望的顧客,以達到促銷的目的。

上面基本說清楚了“關聯分析”在做什麼,再總結一下,就是通過關聯分析演算法,通過歷史資料,挖掘出歷史顧客的購買習慣,發現哪些商品組合會一起被購買。通過事實挖掘出更深層次的事物之間的關聯性。

歷史上最有名的關聯分析的案例就是“啤酒與尿布”的例子了,我最早聽到“啤酒與尿布”的案例是看一則關於介紹大資料的案例。下面是一段摘抄(有修改):

通過關聯分析演算法,我們發現尿布和啤酒的銷售是有關聯關係的。進一步我們得出了這樣的原因:當家裡面有了小孩子之後,買尿布的任務往往是讓年輕的爸爸去幹的。其實爸爸對孩子的出生貢獻並不大,但是他覺得自己做出了很大的成績。所以他買完尿布的時候,會想順便買一瓶啤酒犒勞自己。因此後來沃爾瑪就把啤酒和尿布放在一塊兒,啤酒的銷售量一下子就增加了。可以說在大資料時代,原來找不到的關聯關係現在找得到了。

通過這則經典的案例,我們知道,資料很重要,演算法也很重要。沒有資料就像“巧婦難為無米之炊”,沒有演算法,即使有很多資料,也只是佔用地方,不能變成價值。

分解關聯分析演算法

通過上面的例子,我們可以分析出,其實我們做關聯分析的一達目的是要做推薦,被推薦的商品或者商品組合要滿足的特性之一就是,有很多交易記錄都有它。這件事情就叫做發現“頻繁項集”。

下面會陸續介紹一些重要的概念,這些概念就是比較多,但一點都不難理解。如果遇到概念不清楚的地方,請結合例子多看幾遍,就會很清晰了。

例1:以下是一個簡短的交易歷史記錄,我們給每次交易一個編號,一次交易中購買的商品以列表的形式呈現。

交易號碼 商品
001 漢堡,薯條,可樂,雞翅
002 漢堡,薯條,可樂
003 可樂,雞塊
004 可樂

說明:每一條交易記錄,我們只關心單個商品是否被購買,被購買的數量並不重要。並且這些商品之間沒有順序關係。

下面介紹一些概念:

事務

每一條交易就是一個事務。例 1 中,就包含 4 個事務。所以事務在購物這個場景下,可以被理解為一個訂單。

事務中的每一個物品,數量為 1,區別與項集(馬上就介紹項集是什麼)。上表中 {可樂} 、{漢堡} 、 {薯條} 等就是項。但其實,更重要、更廣泛的使用的概念叫做項集

項集

包含零個或者多個項的集合稱為項集。上表中的項集有:{可樂}、{漢堡}、{薯條}、{漢堡,薯條}、{可樂,雞塊}、{漢堡,可樂},所以項也是項集。
為什麼說項集更普遍呢?因為關聯分析其實我們不僅僅關心單個商品之間的關係,我們還關心“商品的組合”與“商品的組合”、“商品的組合”與單個商品之間的關聯關係。例如我們前面舉的例子:“購買了《機器學習實戰》的讀者絕大多數還會同時購買了《機器學習》和《統計學習方法》”,這裡商品的組合“《機器學習》和《統計學習方法》”就是我們關係的物件之一,它就是項集。
那麼我們說商品的組合有很多呀,我們都要拿出來分析嗎?事實上的確是這樣的,思路沒有問題。這不是很麻煩嗎?彆著急,有一些高效的演算法會幫助我們快速得到我們想要的項集。

項集的支援度計數

整個資料集中包含該項集的個數。例如,項集 {漢堡,薯條} 出現在事務 001、002 中,因此,項集 {漢堡,薯條} 的支援度計數為 2。

項集的支援度

支援度計數除以總的事務數。例 1 中,總的事務數為 4,項集 {漢堡,薯條} 的支援度計數為 2,項集 {漢堡,薯條} 的支援度為 2 4 = 50 % \cfrac{2}{4} = 50\% ,說明有 50 % 50\% 的人同時購買了啤酒和尿布。
所以支援度其實就是一個頻率,我們用 support 這個記號表示, s u p p o r t ( ) = 0.5 {\rm support}({漢堡,薯條} ) = 0.5 就表示項集 {漢堡,薯條} 的支援度為 0.5 0.5

在一些資料介紹“項集的支援度計數”和“項集的支援度度”的資料和書籍中,往往對“支援度計數”和“支援度”不加以區分,但其實它們表示的是一回事,通過上下文就很容易區分開來。值介於 0 和 1 之間的就是支援度,值是整數值的就是支援度計數。

頻繁項集

支援度大於或者等於某個閾值的項集稱為頻繁項集。
其實就是給“頻繁”出現的項集一個定義,出現次數高的項集才能稱之為“頻繁”,那麼這個“頻繁”如何刻畫呢?用一個比例係數來規定。就像我們規定一次百分制的考試中,大於等於 60 分為通過,這個閾值 60 就是人為規定的,完全可以定義 70 分以上為通過,同樣,我們會規定一個閾值,不同的閾值就對應有不同的頻繁項集。

規則

也叫關聯規則,這是一個十分重要的概念,從頻繁項集中找出各個頻繁項集之間的關係。
開篇舉出的例子:“購買了《機器學習實戰》的讀者絕大多數還會同時購買了《機器學習》和《統計學習方法》”、“購買了薯條和漢堡的顧客還會購買可樂”這樣的結論就是兩個關聯規則。我們可以分別用:{《機器學習實戰》} → {《機器學習》、《統計學習方法》} 和 {漢堡,薯條} → {可樂} 這兩個記號來表示。
對這個記號的說明:
1、用花括號表示項集,集合表示的事物組合是無序的,因此用花括號表示;
2、箭頭 → 是表示先後順序的,對於規則 {《機器學習實戰》} → {《機器學習》、《統計學習方法》} 而言,項集 {《機器學習實戰》} 是顧客期望項集,也稱之為前件,項集 {《機器學習》、《統計學習方法》} 是被推薦項集,也稱之為後件,我比較習慣稱之為右邊列表,因為它在箭頭的右邊。右邊列表是我們挖掘出來的關聯規則中,新的顧客並不知道的商品的組合,是我們要推薦給新顧客的商品組合

置信度

置信度是針對關聯規則而言的,描述關聯規則強弱的度量就是置信度,置信度通常用 confidence 表示,對於關聯規則 {《機器學習實戰》} → {《機器學習》、《統計學習方法》} 而言,置信度的定義是:

c o n f i d e n c e ( ) = s u p p o r t ( ) s u p p o r t ( ) {\rm confidence}({《機器學習實戰》} → {《機器學習》、《統計學習方法》} ) = \cfrac{{\rm support}({《機器學習》、《統計學習方法》、《機器學習實戰》})}{{\rm support}({《機器學習實戰》})}

這樣寫,一開始看可能還不太習慣,我們看等式的右邊,其實就是條件概率,因此可以這樣理解:

c o n f i d e n c e ( ) = s u p p o r t ( ) s u p p o r t ( ) {\rm confidence}( {《機器學習》、《統計學習方法》} | {《機器學習實戰》} ) = \cfrac{{\rm support}({《機器學習》、《統計學習方法》、《機器學習實戰》})}{{\rm support}({《機器學習實戰》})}

因此,置信度就是一個條件概率,對於這個例子而言,就是“購買了《機器學習實戰》的顧客,還一起購買了《機器學習》和《統計學習方法》”的概率。說得再直白一些就是,“一個顧客,在購買了《機器學習實戰》的前提下,還一起購買了《機器學習》和《統計學習方法》”的概率。

所以,對於一條關聯規則的置信度的計算,分子和分母都是項集的支援度,我們不妨都把它理解成支援度計數,分母項集是分子項集的子集,分母子集是關聯規則的前件,分子項集與分母項集的差集是被推薦列表,也就是我們前面說的右邊列表

這些都是定義、符合和記號,在理解上沒有任何難度。

強關聯規則

大於或者等於最小置信度閾值的規則稱為強關聯規則。

例如:如果我們得出了一個強關聯規則 {漢堡,薯條} → {可樂} ,這條強關聯規則表示購買了 {漢堡,薯條} 這個組合的顧客,在很大程度上會購買 {可樂} 。用條件概率的說法就是,在購買了 {漢堡,薯條} 這個組合的前提下,有很大概率還會一起購買 {可樂}。

總結一下,這裡介紹了很多概念,有兩個“度”:“支援度”和“置信度”,“支援度”是一個頻率(理解成概率也沒問題),“置信度”是一個條件概率。“項集”是單個商品的組合,“頻繁項集”表示出現很多次的“物品的組合”,是我們關心的。關聯規則描述了“項集和項集”之間的關係,說得更具體一點是“頻繁項集和頻繁項集之間的關係”(具體原因請見後面 Apriori 原理),關聯規則的強弱,用置信度來衡量。

  • “支援度”是“項集”的度量,支援度大於等於一個閾值的項集就是“頻繁項集”;
  • “置信度”是“關聯規則”的度量,“關聯規則”是“頻繁項集和頻繁項集之間的關係”,是一個條件概率,通過“頻繁項集”的支援度計算得到,置信度大於等於一個閾值的關聯規則就是強關聯規則;
  • 關聯分析的一個重要目標就是找出強關聯規則。

關聯分析的步驟

通過以上分析,我們知道,通過關聯分析,我們想找到諸如 {漢堡,薯條} → {可樂} 這樣的強關聯規則。關聯規則描述了項集和項集之間的關聯關係,通過項集的支援度定義。

所以,我們得到關聯分析的步驟如下。

1、發現頻繁項集;

如果一個商品或者商品的組合被購買的次數都不多,它當然不可能成為推薦的物件,因此,我們得先找到頻繁項集。

制定一個閾值,小於這個閾值的支援度的項集都不是頻繁項集。

2、發現強關聯規則。

通過頻繁項集的支援度,得到關聯規則的置信度。
制定一個閾值,小於這個閾值的關聯規則不是強關聯規則。

那麼好了,其實第一個問題其實是得到商品的組合,如果一個商店有 4 4 個商品出售,那麼商品的組合就有 C 4 1 + C 4 2 + C 4 3 + C 4 4 = 2 4 1 C_4^1 + C_4^2 + C_4^3 + C_4^4 = 2^4 -1 個。如果一個商店有 n n 個商品出售,那麼商品的組合就有 C n 1 + C n 2 + + C n 4 = 2 N 1 C_n^1 + C_n^2 + \cdots + C_n^4 = 2^N -1 個。分別計算它們的支援度,再兩兩組合,得到關聯規則,在計算這些關聯規則的置信度(條件概率),關注那些條件概率高的關聯規則,就是強關聯規則了。

上面的敘述是沒有問題的,但是實際上,我們沒有必要把 2 N 1 2^N -1 個商品的組合都拿出來算一下置信度,這個計算量太大了。

對於例 1 而言,一個顯而易見的事實是:如果包含了“雞翅”的訂單都不多的話,那麼包含了{“雞翅”,“可樂”}的訂單肯定會更少,即項集 {雞翅} 的支援度如果很少,項集 {雞翅,可樂} 的支援度只會與之相等或者更少,絕對不會更多。這是個不證自明的道理,看看例1,結合項集和支援度的定義,就不難理解這個基本事實。

根據這個事實,就可以幫助我們大大減少商品組合數的計算,再想一想,如果連《機器學習》的訂購買量都很少的話,一起購買“《機器學習》和《統計學習方法》”的訂單隻會與之相等或更少,不會更多。

這個事實就被人們總結成為了 Apriori 原理,其實並不是什麼晦澀難懂的定理。

Apriori 原理

  • 如果某個項集是頻繁的,那麼它的所有子集也是頻繁的;
  • 如果某個項集不是頻繁項集,那麼它的所有超集也一定不是頻繁項集

使用 Apriori 原理可以避免項集的搜尋呈指數級增長。下面我們就利用 Apriori 原理的第 2 條:如果某個項集不是頻繁項集,那麼它的所有超集也一定不是頻繁項集,來看看如何得到頻繁項集。

頻繁項集搜尋

萬丈高樓平地起,前面我們計算 n n 個商品的組合也是從 1 個商品的組合數、2 個商品的組合數一直到 n n 個商品的組合數,這樣來的。搜尋頻繁項集也不例外。

例2:這裡我們使用 《機器學習實戰》P205 程式清單 11-1 的例子進行輔助說明。

data_set = [
        [1, 3, 4],
        [2, 3, 5],
        [1, 2, 3, 5],
        [2, 5]
    ]

列出 1-項集

我們先列出只包含一個物品的項集,計算它們的頻數和頻率。

結果:

1-項集 頻數(支援度計數) 頻率(支援度) 是否頻繁項集
商品 [1] 2 0.5 頻繁項集
商品 [2] 3 0.75 頻繁項集
商品 [3] 3 0.75 頻繁項集
商品 [4] 1 0.25
商品 [5] 3 0.75 頻繁項集

我們定義,只要出現在一般訂單以上的項集就是頻繁項集,即支援度閾值是 0.5 。那麼商品 [4] 在這個閾值定義下,就不是頻繁項集。因此只有 1 個商品的頻繁項集就是 {商品 [1]}、 {商品 [2]}、 {商品 [3]}、 {商品 [5]}。

列出 2-項集

根據 Apriori 原理,商品 [4] 一定不會出現在多於 1 個商品的項集裡,接下來我們找只有 2 個商品的頻繁項集,就從 {商品 [1]}、 {商品 [2]}、 {商品 [3]}、 {商品 [5]} 來生成,這其實也是一個組合問題, C 4 2 = 6 C_4^2 = 6 ,我們可以列出如下統計表:

2-項集 頻數(支援度計數) 頻率(支援度) 是否頻繁項集
商品 [1,2] 1 0.25
商品 [1,3] 2 0.5 頻繁項集
商品 [1,5] 1 0.25
商品 [2,3] 2 0.5 頻繁項集
商品 [2,5] 3 0.75 頻繁項集
商品 [3,5] 2 0.5 頻繁項集

因此,在支援度閾值為 0.5 的時候,商品 [1,3]、商品 [2,3]、商品 [2,5]、商品 [3,5] 這 4 個項集是頻繁項集。

接下來,我們尋找 3-項集。

<