首先,要感謝譚武和張朋博同學的PPT,懷念以前一起學習數據挖掘十大算法的時光!
1.關聯挖掘例子
啤酒和尿布的故事:
在一家超市中,人們發現了一個特別有趣的現象:尿布與啤酒這兩種風馬牛不相及的商品居然擺在一起。但這一奇怪的舉措居然使尿布和啤酒的銷量大幅增加了。這可不是一個笑話,而是一直被商家所津津樂道的發生在美國沃爾瑪連鎖超市的真實案例。原來,美國的婦女通常在家照顧孩子,所以她們經常會囑咐丈夫在下班回家的路上爲孩子買尿布,而丈夫在買尿布的同時又會順手購買自己愛喝的啤酒。這個發現爲商家帶來了大量的利潤,但是如何從浩如煙海卻又雜亂無章的數據中,發現啤酒和尿布銷售之間的聯繫呢?這又給了我們什麼樣的啓示呢?
購物籃例子:
看上圖例子,同時買了cheese和bread的用戶佔了50%,並且買了bread的用戶中有23 的買了cheese。
從購物籃分析Bread⟹cheese ,形如:如果…那麼就…(If…Then…),前者爲條件,後者爲結果,用來描述二者相關性。那麼,Bread⟹cheese 就是一條規則,我們至少可以總結50%的顧客可以支持該規則,因爲50%的人同時有兩件物品,並且有23 的可信度。
關聯規則挖掘用於尋找給定數據集中項之間的有趣的關聯或相關關係。關聯規則揭示了數據項間的未知的依賴關係,根據所挖掘的關聯關係,可以從一個數據對象的信息來推斷另一個數據對象的信息。而找出關聯規則就是Apriori算法要做的事。
2.相關基本概念
項集:
令I={i1,i2,...,in} 表示一個項集,顯然這是一個n 項集,因爲該項集中有n 個元素,項集的支持度計數如下:
σ(I)=|{ti|I⊆ti,ti⊆T}|
其中
T 表示所有事務集,也就是所有的樣本;
ti 表示總事務集
T 中的一個子集,
I 表示要計算支持度計數的項集。其實就是計算包含項集
I 的樣本的個數。
如下圖所示,是一個根據天氣狀況要不要出去遊玩的例子。總共有4個屬性{outlook(天氣狀況),temperature(溫度),humidity(溼度),windiy(是否刮風)} ,,其結果就是是否出去遊玩play 。先給出各種屬性的取值,然後各處一些項集舉例,從單項集到四項集的部分舉例。
關聯規則:
關聯規則是一種蘊含形式X⟹Y ,其中X⊆I,Y⊆I ,並且X⋂Y=∅ ,X,Y 都是項集,關聯規則就是挖掘項集之間的聯繫性。
支持度:
是指既包含X 又包含Y的事務佔全體事務的百分比即:
support(X,Y)=σ(X⋃Y)N
其中
N 是總的事務的個數,也就是總的樣本個數。本質上就是既包含項集X又包含項集Y的樣本數佔總樣本數的百分比。
置信度:
是指包含項集X的事務中也包含項集Y的事務所佔的比例,即:
Confidence(X,Y)=σ(X⋃Y)σ(X)
其實相當於條件概率。
minsup:
表示最小支持度
minconf:
表示最小置信度
頻繁項集:
支持度不小於minsup的項集,項集裏項的數量爲項的大小,大小爲k的項集被稱爲k-項集。
對於一個事務集T,Apriori的任務就是產生所有不小於用戶給定的最小支持度(minsup)和最小置信度(minconf)的關聯規則。
超集:
如果一個集合s2的每一個元素都在s1中,且s1中可能包含s2中沒有的元素,s1就是s2的超集,簡單來說就是父集
3.Apriori算法
算法包括兩個組成部分:
Apriori=>{1.尋找頻繁項集2.推導關聯規則
1.尋找頻繁項集:
Apriori性質:項集的反向單調性,即頻繁項集的所有非空子集肯定也是頻繁的。例如,在購物籃例子中,每個包含 {Apple,bread,dove} 的事務也包含{bread,dove} ,如果{Apple,bread,dove} 是頻繁項集,那麼根據頻繁項集的定義,{bread,dove} 也必定是頻繁項集。轉換一下思維,如果一個子集是非頻繁的,那麼它的超集也一定是非頻繁的。這在Apriori 算法裏面很重要。
假設F(k) 表示大小爲k 的頻繁項集的集合,C(k) 表示候選集,即可能成爲大小爲k 的頻繁項集的k 項集,兩者之間的關係式:
F(k)⊆C(k)
利用 Apriori 算法反向單調性的性質,我們可以使用頻繁
(k−1) 項集
F(k−1) 來尋找頻繁
k 項集
F(k) ,求解時分兩個過程:連接步和剪枝步。
連接步:
F(k−1) 與其自身進行連接,產生候選項集C(k) 。F(k−1) 中某個元素與其中另一個元素可以執行連接操作的前提是它們中有(k−2) 個項是相同的。也就是隻有一個項是不同的。
例如:項集dove,egg 與egg,bread 連接之後產生的3項集是{egg,dove,bread} ,而項集{egg,bread} 與 {dove,apple} 不能進行連接操作。
剪枝步:
候選集 C(k) 中的元素可以是頻繁項集,也可以不是。 但所有的頻繁 k 項集一定包含在C(k) 中,所以, C(k) 是F(k) 的超集。掃描事物集T ,計算C(k) 中每個候選項出現的次數,出現次數大於等於最小支持度與事務集 T 中事務總數乘積的項集便是頻繁項集(這裏的最小支持度指的是概率,實際中我們經常直接將最小支持度看成乘積後的結果),如此便可確定頻繁k 項集F(k) 了。
但是,由於C(k) 很大,所以計算量也會很大。爲此,需要進行剪枝,即壓縮C(k) ,刪除其中肯定不是頻繁項集的元素.依據就是前面提到的 Apriori 單向單調性的性質:如果一個子集是非頻繁的,那麼它的超集也一定是非頻繁的。這在 Apriori 算法裏面很重要。如此,如果一個候選(k−1) 子集不在 F(k−1) 中,那麼該候選 k 項集也不可能是頻繁的,可以直接從 C(k) 中刪除。如下圖所示:
下圖是一組求解頻繁項集的過程:
在單項集中,只有{D} 不滿足最小支持度,所以將其剪去。
在2項集中,{A,B},{A,E} 都不滿足最小支持度,所以將其剪去。
在3項集中,{A,B,C},{A,C,E} 都不滿足最小支持度,所以將其剪去。
2.推導關聯規則:
枚舉每個頻繁項集f 的每個非空子集a ,如果support(f) 除以support(a) 不小於minconf ,即生成一條規則a⟹(f−a) 。 即,如果:
confidence(a,f−a)=σ(a⋃f−a)σ(a)=σ(f)σ(a)>=minconf
那麼規則
a⟹(f−a) 成立。
由前面求頻繁項集的例子可以得出,頻繁2項集爲{{A,C},{B,C},{B,E},{C,E}} ,其可能的規則及相應的置信度如下圖所示:
頻繁3項集爲{{B,C,E}} ,其可能的規則及相應的置信度爲:
4.性能分析
Apriori算法的運行時間主要是由minsup決定的,當minsup變小時,運行時間會指數倍的增長,minconf和事務數量所起的作用相對較小。
在尋找規則時,minsup設定得過高雖然可以在較短的時間內獲得少量關聯規則,但其中很多規則都是平凡的。爲了找到更有意義的規則,可以取得較小的minsup,但這可能導致不可接受的運行時間和數量龐大的關聯規則。所以爲了尋找有意義的規則必須找到更高效的算法
5.AprioriTid算法
是Apriori的變體,主要是在計算支持度時,不再掃描事務集T而是使用新的數據集CK¯¯¯¯¯ ,它的每個元素都是<TID,Item> 的形式,TID是事務的標誌符,Item是事務TID中一個潛在的k項集的標識符,如果k=1,C1¯¯¯¯ 就是數據集T,只是T中的每個項i被{i} 代替。
直觀來說k很大時Ck¯¯¯¯ 會變得比數據集小,因爲一些事務可能不包含任何候選k項集,這種情況下Ck¯¯¯¯ 就不包含該事務。
其實本質上這種提升是在遍歷事務T上進行了改進。之前我們每次求支持度,都得遍歷整個事務T,然後求解候選集中所有可能項集的支持度。但是,其中有一些事務(樣本)其實一直都是沒有用的,沒有包含任何頻繁項集,我們每次計算都考慮這些事務沒有任何意義,反而影響性能。而PrioriTID就是在這裏進行了改進,通過維護一個TID列表,刪除不需要考慮的事務,快速的計算出支持度。
以下面的例子爲例:
假設最小支持度(minsup)爲314 。
如果圖示,最開始根據總事務T構造出C1¯¯¯¯ ,從中可以得到單頻繁項集爲{a},{c},{d},{f},{g} 。
根據之前求得的單頻繁項集,我們可以構造出可能的2頻繁項集,得到候選集C2 ,此時我們先遍歷事務T ,將不包含候選集的事務直接刪除,所以被刪除的事務的TID集合爲{002,007,010,011,013} ,然後我們在計算候選集中各可能2頻繁項集的概率,如下圖所示:
然後根據F2 ,即2頻繁項集構造可能的3頻繁項集候選集C3 ,然後再遍歷總事務T ,繼續進行剔除,被刪除的事務的TID集合爲{001,003,005,006,008,0012} ,只剩下最後三個了,最後重複這個過程,可以得到3頻繁相機爲{c,d,f} 。
改進之處就是不再是每次都遍歷所有的事務來求支持度,而是通過維護一個含有TID的列表,只保留可能的事務,來快速的求解可能的頻繁集項。