1. 程式人生 > >關聯規則DHP演算法詳解

關聯規則DHP演算法詳解

參考文獻:

[1]Park, J. S., Chen, M. S., & Yu, P. S. (1995). Aneffective hash-based algorithm for mining association rules. Acm SigmodRecord, 24(2), 175-186.

[2]潘燕燕. (2012). 關聯規則dhp演算法的研究與分析. 佛山科學技術學院學報(自然科學版), 30(2), 30-32.


寫在前面:上《資料探勘》這門課的時候,講關聯規則挖掘(Association Rules Mining)的時候,其他幾個演算法都是簡單易懂,符合普通認知規律的。唯有DHP演算法是繞了一個小彎。無奈PPT上寫的太簡略,英文原文也是看得模稜兩可。好在,找到了一箇中文版的分析,再結合英文版,果然捋得清多了。寫在這裡,方便自己期末複習。


一、DHP演算法的由來

1993 年Agrawal等人首先提出關聯規則概念之後關聯規則挖掘便迅速受到資料探勘領域專家的廣泛關注。在迄今十幾年中,關聯規則挖掘技術得到了較為深入的發展。

Apriori演算法是關聯規則挖掘經典演算法,針對該演算法的缺點,許多學者提出了改進的演算法,主要有基於雜湊優化DHP 和基於事務壓縮等。

二、DHP演算法的過程

1.縮減候選專案集Ck

對於表1 的資料庫,演算法的條件為:最小支援度為2。雜湊函式為:h{ {x,y} }= ((order of x)+order of y) )mod 7 ,其中, order of x 為專案在所有取值序列中的序號。構造一個有效的Hash 函式很關鍵,因為一個較好的Hash 函式能減少衝突。這裡為了方便說明DHP 演算法的執行過程,取的雜湊函式比較簡單。例如,資料庫D 中包含的事務項為A 、B 、C 、D 、E ,其中order of A 為1 ,order of C 為3 。


(1)生成候選1-專案集C1={{A} , {B} , {C} , {D} , {E}} ,並且掃描資料庫所有事務,統計這些候選1-專案集的支援度,以得到L1。L1為{A,B,C,D,E}。

(2) 為C2建立用於快速統計的雜湊表H2 。建表的方法是:對讀取的每行事務根據要構造的候選集合的長度進行組合分解。例如,為構造候選2-專案集C2 而建立H2時,將資料庫分解,如表2 所示。分別代入雜湊函式,根據算得的雜湊值填寫雜湊表。例如,對於2-專案集{B, D} , 帶入雜湊函式得:h{ {B ,D} }=((order of B)*10 十(order of D) )mod 7= (2*10 十4)mod 7=3 。

(3)DHP 檢測每個項是否在雜湊表中。如果是,它把該項的count 值加1 ;否則,它向雜湊表中插入該項,並將count 值置為1 。表3 為給定資料庫的雜湊表及相應桶內取值情況。


(4)所有的桶組成一個位向量。位向量中每一位的取值與其對應的桶內元素的個數相關。如果個數大於minsup , 則為1 ,反之為0 。掃描資料庫,得到2-專案集的同時,得到雜湊表中的每個桶中含有放入到該桶中2-專案集的數目。由於最小支援度為2 ,得到結果位向量<1 , 1 , 0 , 1 , 0 , 0 , 1> 。也由C 1 得到了LI = { {A } , {B} , {C} , {D } , {E}}。將LI 進行自連線,得到 L1 * L1:{ {A ,C} , {A ,D } ,{A ,E} , {B ,D} , {B ,E} , {C ,D } , {C ,E} , {D , E } }。分別將L1*L1 中的2 專案集帶人雜湊函式,得到每個2-專案集對應的雜湊地址。然後,根據雜湊表H2中的位向量取值,從L1*L1中過濾2-專案集,對應位向量為0的2-專案集組合將被刪掉。最終得到C2={ {A ,C} , {A ,D } ,{A ,E} , {B ,D } ,  {C ,D } , {C ,E} , {D , E } }。

如果利用Apriori 演算法,則將會得到:C2 ={ {A ,C} , {A ,D } ,{A ,E} , {B ,D } , {B ,E} , {C ,D } , {C,E} , {D , E } } 。由以上例子可以看出, DHP 演算法使用雜湊技術找出生成下一個候選專案集所必需的專案集,並且很好地縮小了候選資料的規模,提高了效率,特別是在生成候選集2-專案集的時候。

通過上述例子,可以發現在掃描一次資料庫的過程中,DHP 演算法在獲得頻繁k-專案集Lk 時與Apriori 演算法一樣[氣都是通過L(k- I )來產生是k-專案集。但是不同之處於, DHP 前一次掃描的時候建立了位向量,並且巧妙地運用它來檢測每個是專案集的合法性。DHP 並沒有把從L(k-1)*L(k-1) 得到的所有專案集放到Ck 中,而是把通過雜湊過濾的是k-專案集放到Ck 中,這樣的雜湊過濾可很快減少Ck 的大小。

通俗來說,雜湊過濾的原理在於,雜湊表的key為(X,X)經過處理之後得到的值,value為具有相同key的(X,X)的總個數。當具有相同key的(X,X)的總個數小於最小支援(Mininum Support)的時候,單獨的(X,X)的個數一定是小於最小支援數的,所以這樣就能過濾掉很大一部分候選集。當然,當具有相同key的(X,X)的總個數大於最小支援數(Mininum Support)的時候,單獨的(X,X)的個數不一定大於最小支援數的,所以還需要進行下一趟掃描。


2.縮減將事務集合Dk

原理:

count_support過程:如果一個交易t中含有(k+1)-專案集,那麼該專案集中的每一個元素,至少都在C(k)中出現至少k次。嚴格來說,應該在L(k)中出現k次以上。舉例說明,如果3-專案集中包含ABC,那麼2-專案集中需要包含AB,AC,BC,也就是A,B,C在2-專案集中分別最少出現兩次。

make_hasht過程:如果一個交易t中含有(k+1)-專案集,那麼該專案集中的每一個元素,當其存在於某一個(k+1)專案集的時候,C(k)中必須包含該(k+1)專案集中的(k+1)個k-專案集。比如說C存在於ACD專案集中,那麼C(k)中必須包含AC,AD,CD。

主要過程分為兩步:

1)Procedure count_support:

首先來看一個例子。假設一個交易 t = {A, B, C, D, E},並且有5個2-專案集 { {A,C} , {A ,E } ,{A ,F} , {C ,D } , {E,F } }。定義一個數組a[i],其中,a[0]表示2-專案集中A的個數,a[1]表示2-專案子集中B的個數,a[2]表示2-專案集中B的個數依次類推。故,a[0]=3,a[2]=2,a[3]=1,a[4]=2,a[5]=2。由此可見,在2-專案集中,A,C,E,F的個數是大於2的。因此,不用考慮B和D,它們一定不會出現在3-專案集中。此時t-={A, C, E, F}.

2)Procedure make_hasht:

事實上,專案C不可能出現在3-專案集中,因為假如出現在3-專案集中,就會有ACD,而在2-專案集中,只包含AC,CD,並不包含CD。也就是說,在count_support過程中,我們只能夠確認某一元素存在的次數,卻不能確認(k+1)-專案集中每個元素存在的次數。make_hasht過程就是用來解決這個問題的。

我剛開始接觸的時候,疑惑在於,為什麼在count_support過程中,對於k-專案集中的相同專案只計算一次,比如說{A,C}在多個交易中出現了兩次或者三次。後來想通了,由k-專案集到(k+1)-專案集的過程中,只有不同專案組合才有用,多個{A,C}專案是沒有辦法組合到一塊兒,變成3-專案集的。所以,k-專案集中的相同專案只計算一次。


三、總結

DHP 演算法有以下主要恃點。

(1) 關聯規則演算法生成候選集的個數,從而提高了查詢每個事務中候選專案集的速度,在很大程度上優化了Apriori 演算法的效能瓶頸問題。

(2) 減少事務資料庫的內容。DHP 演算法生成的更小的候選集在生成2-專案集的時候,就可以通過使用剪技技術逐漸減少事務資料庫的內容,包括減少整個資料庫中事務的數量(即行數)和每個事務項中的個數(即每行包含的專案數量) ,從而顯著地減少後面迭代的計算量。

(3) 減少資料庫掃描,降低對磁碟的1/0 訪問。經過剪枝,要處理的候選集小了,更多的內容可以在記憶體中進行,而且由於DHP 演算法在每趟掃描資料庫的時候沒有得到專案集,這樣可以節省某些資料庫掃描.把頻繁專案集的確定推遲到後一趟中,從而減少對磁碟1/0 的訪問。

DHP 演算法減少了處理的候選集,是以附加一個Hash 表的計算和資料庫表的儲存空間(為了進行資料庫的修剪)為代價,換取執行時間的快速。