第 2 章 相關研究
2.5 MPHP 演算法
DHP 演算法的雜湊函數因為會有碰撞的情形,所以無法直接過濾所有的候選物 項集合,所以必須使用雜湊函數計算完所有的集合,然後再掃描資料庫找尋高 頻物項集合,MPHP(Minimal Perfect Hashing & Pruning)則是 DHP 的雜湊函數最 完美的函數,因為MPHP 不會有碰撞,所以可以直接過濾所有不可能成為高頻 物項集合的候選物項集合,換句話說,MPHP 不需要候選物項集合,就能找出 高頻物項集合,而且MPHP 所使用的記憶體的效率會遠比 DHP 高出許多。
雜湊函數bucket 數量分配方法如圖 2.4
圖 2.4 MPHP 的雜湊函數 bucket 數量分配方法
第1 個部分為原始的資料庫有A、B、C、D、E等 5 個不同的物項,第 2 個 部分將這些物項分別編號成1、2、3、4、5,將這些物項組成 2 個物項為一個 集合的最多組合共有
C
52=10 種,第 3 部分則是將各物項編號組成的各種組合排 序建立單一獨立的索引位址。MPHP 雜湊函數 H(i,j)=((i - 1) * (N - 1)) + j - ((i * (i - 1)) / 2) - 1,其中 N 為物項個 數,其所有物件組合使用雜奏函數計算出獨立索引位址的過程如下:
H(1,2)=((1 - 1) * (5 - 1)) + 2 - ((1 * (1 - 1)) / 2) – 1=1 H(1,3)=((1 - 1) * (5 - 1)) + 3 - ((1 * (1 - 1)) / 2) – 1=2 H(1,4)=((1 - 1) * (5 - 1)) + 4 - ((1 * (1 - 1)) / 2) – 1=3 H(1,5)=((1 - 1) * (5 - 1)) + 5 - ((1 * (1 - 1)) / 2) – 1=4 H(2,3)=((2 - 1) * (5 - 1)) + 3 - ((2 * (2 - 1)) / 2) – 1=5 H(2,4)=((2 - 1) * (5 - 1)) + 4 - ((2 * (2 - 1)) / 2) – 1=6 H(2,5)=((2 - 1) * (5 - 1)) + 5 - ((2 * (2 - 1)) / 2) – 1=7 H(3,4)=((3 - 1) * (5 - 1)) + 4 - ((3 * (3 - 1)) / 2) – 1=8 H(3,5)=((3 - 1) * (5 - 1)) + 5 - ((3 * (3 - 1)) / 2) – 1=9 H(4,5)=((4 - 1) * (5 - 1)) + 5 - ((4 * (4 - 1)) / 2) – 1=10
MPHP 雜湊函數能經簡單的運算就能快速的將所有組合計算出不會碰撞的位
址,MPHP 的雜湊函數找尋高頻物項集合的流程如圖 2.5
H(i,j)=((i - 1) * (N - 1)) + j - ((i * (i - 1)) / 2) - 1 B E
400 A B C E 300
B C E 200
A C D 100
Items TID
9 2 {C E}
{C E}
10 0 6
0 8 1 {C D}
7 5 4 3 2 1
3 2 1 1 2 1
{B E}
{B C}
{A E}
{A D}
{A C}
{A B}
{B E}
{B C}
{A C}
{B E}
{BE}
{AB}, {AC}, {AE}, {BC}, {BE}, {CE}
{BC}, {BE}, {CE}
{AC}, {AD}, {CD}
{2 5}
{1 2}, {1 3}, {1 5}, {2 3}, {2 5}, {3 5}
{2 3}, {2 5}, {3 5}
{1 3}, {1 4}, {3 4}
1
2
3
圖 2.5 MPHP 的雜湊函數找尋高頻物項集合流程圖
資料庫含有4 筆交易紀錄,有A、B、C、D、E等 5 個不同的物項,最小支 持度設定為50%,也就是說候選物項集合次數要超過 2(含)次以上才能成為高頻 物項集合,採用的雜湊函數為H(i,j)=((i - 1) * (N - 1)) + j - ((i * (i - 1)) / 2) - 1。
此範例共有3 個步驟
1. 與 DHP 相同方式建立 Hash table ,Tid=100 下的物項有A、B、D 於結合之
後就會產生{AC}、{AD}、{CD}等 3 個集合,Tid=200 下的物項有 B、C、E 於結合之後就會產生{BC}、{BE}、{CE}等 3 個集合,Tid=300 下的物項有A、B、C、E 於結合之後就會產生{AB}、{AC}、{AE}、{BC}、{BE}、{CE}等 6 個集合,Tid=400 下的物項有B、E 於結合之後就會產生{BE}等 1 個集合。
2. 將 Hash table 所有的集合由物件名稱改成對映索引編號,如{AB}改成{1,2},
{AC}改成{1,3}。
3. 直接將 Hash table 所有的集合使用雜湊函數 H(i,j)=((i - 1) * (N - 1)) + j - ((i * (i
- 1)) / 2) – 1 計算出物件索引位址,並累計索引位址的次數,當計算完所有的 集合時,所有的物項集合的次數已經統計完成,所以完全無需使用候選物項集合。
其詳細的演算法如下 s= a minimum support;
I= {I1, I2, …, IN}, a set of distinguishable items in the database;
N= |I|, total number of data items in the database;
|D|= total transactions of the database;
k= the bottleneck of k-iteration;
g= the number of gth group in database;
itemi= the ith item in k-itemsets;
P(itemi)= the associated position in I;
Minimal Perfect Hash Function for k-itemsets:
Create hashing function with
C hash addresses; //construct hash function
kNHk(
item
1g,item
2g, …,item
kg−1,item )
kg= Inter-Group-offset+ Intra-Group-offset
= (
∑
−= 1 1 g
r
Inter(
item
1r,item
2r, …,item
kr−1)) + Intra(item )
kg= (
∑
−= 1 1 g
r
N- P(
item
kr−1)) + (P(item )- P(
kgitem
kg−1))For all transaction t ∈ D do //scan database begin
For all k-subsets ∈ t do
Hk(item , 1g
item
2g, …,item
kg−1,item )++;
kg end forLk= {k-subsets| Hk (
item
1g,item
2g, …,item
kg−1,item ) ≥ s};
kgApriori with pruning:
For (z= k+1; Lz-1= φ; z++) do begin
Cz= Apriori-gen (Lz-1); //new candidates
transTrim[1 … |D|]=0; //initialize array transTrim[|D|]= 0 Forall transactions t ∈ D & transTrim[t-TID]=0 do begin Ct= SubsetCount-Pruning (Cz , z, t);
//candidates count contained in hash tree with simple pruning end
Lz= {c∈ Cz| c.count ≥ minsup}
end end MPHP
Procedure SubsetCount-Pruning (Cz , z, t)
Forall c such that c∈ Ck and c(= ti1 … tik) ∈ t do begin c.count++;
for (j=1; j≤ z; j++) a[ij]++;
end
transTrim[t-TID] = 1;
for (i=0; i<|t|; i++) if (a[i] ≥ z) {
transFlag[t-TID]= 0;
break;
}
end Procedure
MPHP 的雜湊函數雖然不會碰撞,不須候選 K-物項集合(K 通常為 2),但是於高 頻K+1 物項集合時,MPHP 仍使用以 Apriori 為基礎的演算法找尋高頻物項集 合,其中最大的瓶頸在於MPHP 隨著 K 的增加,記憶體需求會呈指數成長,如 表2.3
Level Bucket Itemsets
L2 499K 4,500K
L3 166,167K 13,500K L4 41,417,124K 21,000K 表 2.3 MPHP 雜湊函數在不同的階層所需的成本
假設總交易紀錄比數為100K,平均每筆交易的物項個數為 10,資料庫所包含的 物項個數為1000,每個 bucket 需要 4 個 bytes 儲存。
表2.3 於階層 2 則需要
C
10002 =1000*999/2≒499K 個位址儲存,共需要499K*4≒0.2M 的記憶體,於階層 3 則需要
C
10003 =1000*999*988/3!≒166,167K 個位址儲存,共需要166,167K*4≒664M,於階層 4 則需要C
10004 =1000*999*988*997/4!≒41,417,124K,但是由於 4 個 bytes 的變數不能滿 足所有的位址,必須改成8 bytes,所以共需要 41,417,124K *8≒331,337M 的記 憶體,所以MPHP 的雜湊函數,所以 MPHP 的雜湊函數通常會使用於階層 2,於階層2 以後使用雜湊函數,普通的電腦已經不能支援這麼多記憶體了。
本章所介紹的各種關聯式法則的演算法,各有其優缺點,Apriori 簡單易於明瞭,
節省記憶體空間,但執行效率不好,所以有很多研究是改善Apriori 的演算法,
如Pincer-Search,Partition 等演算法但是其改進的效益有限,至於使用雜湊函數 的演算法如DHP 則因為碰撞嚴重,所以改進的效益不大,直到 MPHP 演算法找 出了不會碰撞的雜湊函數完全解決了DPH 的困擾,但是因 MPHP 對於階層 2 以後的記憶體需求太高,所以仍必須回到以Apriori 為基礎的演算法來處理,因 此根據以上的所有演算法的介紹,大量的候選物項集合必須有效率的過濾才是 根本解決方法。