1. 程式人生 > >機器學習:關聯分析

機器學習:關聯分析

1 引言

說到關聯分析,顧名思義的就可以聯想到,所謂關聯就是兩個東西之間存在的某種聯絡。關聯分析最有名的例子是“購物籃事務”,以前在美國西部的一家連鎖店,店家發現男人們在週四購買尿布後還會購買啤酒。於是他便得出一個推理,尿布和啤酒存在某種關聯。但是具體怎麼來評判呢?先看下錶:
 
表 1
表中每一行對應一個事物,包含一個唯一標識TID和給定顧客購買的商品的集合。從這個表中所示的資料中可以提取出如下規則:
{尿布}->{啤酒}

2 一些概念

項集和計數度計數 在關聯分析中,包含0個或者多個項的集合被稱為項集。如果一個項集包含k個項,則稱為k-項集。支援度計數是指包含特定項集的事務的個數。
關聯規則 關聯規則是形如X->Y的蘊含表示式,其中X和Y是不相交的項集。關聯規則的強度可以用它的支援度和置信度度量。
一個項集的支援度(support)被定義為資料集中包含該資料集的記錄所佔的比例。比如有規則X=>Y,它的支援度可以計算為包含XUY所有商品的交易量相對所有交易量的比例(也就是X和Y同時出現一次交易的概率)。可信度定義為包含XUY所有物品的交易量相對僅包含X的交易量的比值,也就是說可信度對應給定X時的條件概率。關聯規則挖掘,其目的是自動發起這樣的規則,同時計算這些規則的質量。
計算公式如下:
支援度=交易量包含XUY交易量支援度/交易量包含XUY交易量
可信度=交易量包含XUY交易量包含X可信度/交易量包含XUY交易量包含X
支援度和可信度是用來量化關聯分析是否成功的方法。關聯分析的目的包括兩個:發現頻繁項集和發現關聯規則。首先我們要找到頻繁項集,然後根據頻繁項集找出關聯規則。
例考慮規則{牛奶,尿布}->{啤酒}。由於項集{牛奶,尿布,啤酒}的支援度技術是2,而事物總數是5,所以規則的支援度為2/5=0.4。規則的置信度是項集{牛奶,尿布,啤酒}的支援度與項集{牛奶,尿布}支援度計數的商。由於存在3個事務同時包含牛奶和尿布,所以該規則的置信度為2/3=0.67。
大多數關聯規則挖掘演算法通常採用的一種策略是,將關聯規則挖掘任務分解為如下兩個主要的子任務。
1)頻繁項集產生:其目標是發現滿足最小支援度閾值的所有項集,這些項集稱為頻繁項集。
2)規則產生:其目標是從上一步發現的頻繁項集中提取所有高置信度的規則,這些規則稱為強規則。

3 頻繁項集的產生

通常,頻繁項集產生的計算開銷遠大於產生規則所需要的計算開銷。

3.1 先驗原理

先驗原理 如果一個項集是頻繁的,則它的所有子集一定也是頻繁的。
相反,如果項集{a,b}是非頻繁的,則他的所有超級也一定不是非頻繁的。我們根據這一點可以進行剪枝操作。這種基於支援度度量修剪指數搜尋空間的策略稱為基於支援度的剪枝。這種剪枝策略依賴於支援度度量的一個關鍵性質,即一個項集的支援度決不會超過它的子集的支援度。這個性質也稱為支援度度量的反單調性。

3.2 Apriori演算法

Apriori演算法是第一個關聯規則挖掘演算法,它使用了基於支援度的剪枝技術,系統地控制候選項集指數增長。對錶1中所示的事務,假設支援度閾值是60%,相當於最小支援度技術為3。
初始時每個項都被看作候選1-項集。對他們的支援度計數之後,候選項集{可樂}和雞蛋被丟棄,因為它們出現的事務少於3個。在下一代迭代,僅使用頻繁1-項集來產生候選2-項集,因為先驗原理保證所有非頻繁的1-項集的超集都是非頻繁的。由於只有4個頻繁1-項集,因此演算法產生的候選2-項集的數目為 6。計算他們的支援度值之後,發現這6個候選項集中的2個,{啤酒,麵包}和{啤酒,牛奶}是非頻繁。剩餘的4個候選項集是頻繁的,因此用來產生候選3-項集。以此類推。
 

通過計算產生的候選項集數目,可以看出先驗剪枝策略的有效性。列舉所有項集(到3-項集)的蠻力策略將產生41 個候選項;而使用先驗原理,將減少 13個候選。


3.3 候選項集的產生和剪枝

其中,Apriori演算法中,候選項集的產生和剪枝是非常重要的環節。
候選項集的產生。該操作由前一次迭代發現的頻繁(k-1)-項集產生新的候選k-項集。下面介紹幾種候選項集的產生過程。
蠻力方法  蠻力方法把所有的k-項集都看做可能的候選,然後使用候選剪枝除去不必要的候選。第k層產生的候選項集的數目為 ,其中d是項的總數。
 

  F(k-1)*F(1)方法 用其它頻繁項來擴充套件每個頻發(k-1)-項集。如用麵包這個頻繁項擴充套件頻繁2-項集{啤酒,尿布},產生候選3-項集{啤酒,尿布,麵包}。


這種方法是完備的,但是很難避免重複產生候選項集。避免產生重複的候選項集的一種方法是確保每個頻繁項集中的項以字典序儲存,每個頻發(k-1)-項集X只用字典比X中所有的項都大的頻發項進行擴充套件。
儘管這樣的方法比蠻力的方法有明顯改進,但是仍然會產生大量不必要的候選。例如,合併{啤酒,尿布}和{牛奶}而得到的候選是不必要的,因為它的子集{啤酒,牛奶}是非頻繁的。


 F(k-1)*F(k-1)方法 合併一對頻繁(k-1)-項集,僅當他們的前k-2個項都相同。例如,頻繁項集{麵包,尿布}和{麵包,牛奶}合併,形成了候選3-項集{麵包,尿布,牛奶}。演算法不會合並項集{啤酒,尿布}和{尿布,牛奶},因為它們的第一個項都不相同。實際上,如果{啤酒,尿布,牛奶}是可行的候選,則它應當由{啤酒,尿布}和{啤酒,牛奶}合併得到。這個例子表明了候選項產生過程的完全性和使用字典序避免重複的候選的優點。
 

3.4支援度計數

1.支援度計數的一種方法是,將每個事務與所有的候選項集進行比較,並且更新包含在事務中的候選項集的支援度計數。這種方法是計算昂貴的,尤其當事務和候選項集的數目都很大時。
2.列舉每個事務所包含的項集,並且利用他們更新對應的候選項集的支援度。
例:事務t={1,2,3,5,6},求事務t包含3個項的子集如下。
 
求得這些項集之後,與候選項集匹配,如果匹配成功,則相應的候選項集的支援度計數+1。
3.使用Hash樹進行支援度計數
候選項集劃分為不同的桶,並放在hash樹中。在支援度計數期間,包含在事務中的項集也雜湊到相應的桶中。然後,將它與桶內候選項集進行匹配。


 
4 規則產生


4.1基於置信度的剪枝


4.2Apriori演算法中規則的產生

初始,提取規則後件只含一個項的所有高置信規則,然後,使用這些規則來產生新的候選規則。例如,如果{acd}->{b}和{abd}->{c}是兩個高置信度的規則,則通過合併這兩個規則的後件產生候選規則{ad}->{bc}。如圖,假設規則{bcd}->{a}具有低置信度,則可以丟棄後件包含a的所有規則。