Apriori演算法中使用Hash樹進行支援度計數

2021-10-04 21:05:19 字數 2260 閱讀 9744

在apriori演算法中,當檢視乙個候選集是否是頻繁項集,需要將該候選集與db中的每個事務進行比較,如果該候選集在這個事務**現了,就將其支援度加1。當db中有5個事務,而候選項集為3個的時候,其總的比較次數就是3×5=15次。

為了減少比較的次數,通過以hash樹的結構來儲存候選集,每乙個事務不再和每個候選集進行比較,而是和hash樹中特定的候選集進行比較。我們通過下面的乙個例子來理解。

假設我們已經有了候選三項集(共15個),候選集如下所示:

針對這個候選集,我們需要建立一棵hash樹,根據以下規則建立

1.hash函式,如以mod3為例,

2.最大葉節點數,如果乙個葉子節點所包含的資料樹大於最大葉節點數,該葉節點需要進一步進行**。這裡我們的max_leaf_size選擇為3。

現在我們開始針對候選集來建立hash樹

對於項集來說,對第一項 1 來說根據hash函式,應該放在左邊。

對於項集來說,其第一項為1,也放在左邊。

對於項集來說,第一項為4,放在左邊,但這時因為左邊有3個候選集,需要進行**,這時我們根據候選集的第二項進行hash

對於項集,加入其中,先對第一項1進行hash,應放在左邊,在對中間項2進行hash,放在中間,和,放在一起,此時超出了最大葉節點數,引起新的**,這時需要對項集中第3項來進行hash,,應該放在左邊,而應放在中間。

依次不斷加入新的項集,構成的候選集的hash樹。如圖所示:

注:如果這時加入新的項集,應該加入項集,這個葉子結點,此時應該**,但是對項集,,他們的三個元素均進行過hash,因此通常的做法是加入其中,形成線性表的形式。(類似於hash表中處理衝突的常見做法)

這一步是求乙個事務可能的子項集,以事務為例,求該事務可能存在的三項集。可能的三項集數目應該是c53(5為下標,3為上標)共10個。

分3步來求其子項集,

1.先求第乙個項,對該事務,項集第乙個只能是1或2或3。

2.求第二項,在項為1的前提下,其第二項只能是2或3或5。

3.在前兩項為1,2的前提下,第三項是3或5或6。因此得到項集,,。

怎麼通過hash樹來減少支援度計數呢?

前兩步的基礎上,對於事務開始進行候選三項集的支援度計數。

對於事務,首項為1的項集,應該投遞在左邊,而首項為2的投遞在中間,首項為3的投遞在右邊。

然後進行下一步投遞,對於首項為1,第2項為2投遞在左,第2項為3的投遞在右,第二項為5的投遞在中間。

進行最後一步的投遞,對於前兩項為1,2。其可能的項集為,,,項集,應該投遞在右,與葉子節點中資料進行比較,沒有相同的。項集應該投遞在中間,與,結點進行比較,存在項集,因此的支援度計數加一。

而對於項集前兩項為1,3的前提下,因為只有乙個葉子節點,因此不需要再對第三項進行投遞,因此直接和葉子節點進行比較。

畫紅框的是需要比較的結點。

從以上結果可以得到一共需要比較9次(共5個紅框,9個項集),而如果不採用hash表的結構,因為一共15個候選3項集,每乙個候選集都要與該事務進行比較,因此需要進行15次比較。

支援度計數的過程和求事務的項集的子項集是很類似的。思想主要是將事務進行拆分,進行投遞,然後進行比較,如果有相同的,支援度加1。

尋找乙個可以在Delphi中使用的hash錶類

尋找乙個可以在delphi中使用的hash錶類 delphi windows sdk api 輕量級的,只要能夠使用字串作為鍵值的即可。我找到乙個hashtrie,編譯出來一大堆警告還不說了,而且速度也是具慢無比。有沒有哪位老兄推薦乙個給我啊?謝了先。如果實在找不到的話我就用c 做dll來搞了。試試...

尋找乙個可以在Delphi中使用的hash錶類

尋找乙個可以在delphi中使用的hash錶類 delphi windows sdk api 輕量級的,只要能夠使用字串作為鍵值的即可。我找到乙個hashtrie,編譯出來一大堆警告還不說了,而且速度也是具慢無比。有沒有哪位老兄推薦乙個給我啊?謝了先。如果實在找不到的話我就用c 做dll來搞了。試試...

Apriori演算法小結

1 apriori演算法是一種挖掘關聯規則的頻繁項集演算法,其核心思想是通過候選集生成挖掘頻繁項集。2 步驟 3 概念 對於a b 支援度 support p a b 既有a又有b 的概率 置信度 p b a p ab p a 在a 發生的事件中同時發生 b的概率 例如購物籃分析 牛奶 麵包例子 支...