關聯規則挖掘 - Apriori算法

1 Apriori 介紹

Apriori 算法使用頻繁項集的先驗知識,使用一種稱作逐層搜索的迭代方法, k項集用於探索 (k+1) 項集。

首先,通過掃描數據庫,累積每個項的計數,並收集滿足最小值尺度的項,找出頻繁 1 項集的集合,該集合記做 L1 。然後利用 L1 找頻繁 2 項集的集合 L2 ,L2 找 L3 ...如此下去,直到不能再找到任何頻繁 k 項集。最後再在所有的頻繁集中找出強規則,即產生用戶感興趣的關聯規則。

其中, Apriori 算法具有這樣一條性質 :頻繁項集的所有非空子集也必須是頻繁的。

Apriori性質基於這樣的觀察:如果項集I不滿足最小值尺度min_sup,則項集I不是頻繁的。即 P(I)< 最小支持度閾值,當有元素 A 添加到 I 中時,結果項集( A UI )不可能比 I 出現次數更多。因此 A U  I 也不是頻繁的。

該性質屬於一類特殊的性質,即反單調性。指如果一個集合不能通過測試,則它所有的超級也都不能通過相同的測試。

2   使用候選產生髮現頻繁項集

Apriori 算法採用連接步和剪枝步兩種方式來找出所有的頻繁項集。

(1)  連接步

爲找出 Lk (所有的頻繁 k 項集),通過將 Lk-1 (所有的頻繁 k-1 項集)與自身連接產生候選 k項集的集合。該候選集合記作 Ck 。

設 l1 和 l2 是 Lk-1 中的成員。記 li [j] 表示 li 中的第 j 項(例如 l1[k-2] 表示l1的倒數第2項)。假設 Apriori 算法對事務或項集中的項按字典次序排序,即對於( k-1 )項集 li , li [1]<li [2]< ……… .<li [k-1] 。 Lk-1 與自身連接,如果(l1 [1]=l2 [1])&&( l1 [2]=l2 [2])&& …… ..&& (l1 [k-2]=l2 [k-2])&&(l1 [k-1]<l2 [k-1]) ,那認爲 l1 和 l2 是可連接。連接l1 和 l2 產生的結果是 {l1 [1],l1 [2], …… ,l1 [k-1],l2 [k-1]} 。

上面是韓家煒《數據挖掘 - 概念與技術》中的描述。用人的話來說就是:l1是頻繁項集 Lk-1 中的項,在於自身連接時,l1保持不變,在添加這樣的項:除了最後一項,其它與l1相同,組成新的k項。

(2)  剪枝步

CK 是 LK 的超集,也就是說, CK 的成員可能是也可能不是頻繁的,但所有的頻繁項集K都包含在CK 中。通過掃描所有的事務(交易),確定 CK中每個候選的計數,判斷是否小於最小支持度計數,如果不是,則認爲該候選是頻繁的。要計算CK 的支持度,就要不斷的掃庫,成本太高了。

如何壓縮CK ,來減少掃庫的次數呢?

我們可以利用Apriori 性質: 任一頻繁項集的所有非空子集也必須是頻繁的,反之,如果某個候選的非空子集不是頻繁的,那麼該候選肯定不是頻繁的,從而可以將其從 CK 中刪除。即如果K項集的(K-1)項子集不在 Lk-1 中,那麼該候選集也不在K項集中。回想連接步的候選集構造, l1 和 l2 本身都是頻繁的,只是在連接另一個的元素後產生的不頻繁。只需要計算這些項集是否頻繁就好了。也可以採用Hash的方法實現,是否能夠映射到Hash表中。

3 由頻繁項集產生關聯規則

一旦由數據庫中的事務找出頻繁項集(滿足最小支持度),可以由他們產生強關聯規則(滿足最小置信度)。

置信度的計算公式:


其中,支持度用事務數來計算。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章