1. apriori演算法是什麼
經典的關聯規則挖掘演算法包括Apriori演算法和FP-growth演算法。
apriori演算法多次掃描交易資料庫,每次利用候選頻繁集產生頻繁集;而FP-growth則利用樹形結構,無需產生候選頻繁集而是直接得到頻繁集,大大減少掃描交易資料庫的次數,從而提高了演算法的效率,但是apriori的演算法擴展性較好,可以用於並行計算等領域。
(1)apriort演算法的概念擴展閱讀:
Apriori algorithm是關聯規則里一項基本演算法
Apriori演算法將發現關聯規則的過程分:
第一通過迭代,檢索出事務資料庫1中的所有頻繁項集,即支持度不低於用戶設定的閾值的項集;
第二利用頻繁項集構造出滿足用戶最小信任度的規則。其中,挖掘或識別出所有頻繁項集是該演算法的核心,占整個計算量的大部分。
2. 第九章 數據關聯規則分析演算法——基於Apriori演算法的關聯項分析
9.1 基於Apriori演算法的關聯分析
Aprior演算法是關聯規則分析中較為經典的頻繁項集演算法。關聯規則反映的是兩個或多個事物相互之間的依存性和關聯性。如果兩個或者多個事物相互之間存在一定的關聯關系,則它們之間存在一種關聯規則使得它們之間可以進行搭配。
9.1.1 基本概要
Apriori演算法利用頻繁項集的先驗知識,不斷地按照層次進行迭代,計算數據集中的所有可能的頻繁項集,它的分析主要包括兩個核心部分。
1、根據支持度找出頻繁項集;
2、根據置信度產生關聯規則。
9.1.2 Apriori演算法原理
基本流程:
1、掃描歷史數據,並對每項數據進行頻率次數統計。
2、構建候選集 ,並計算其支持度,即數據出現頻率次數與總數的比。
3、對候選項集進行篩選,篩選的數據項支持度應當不小於最小支持度,從而形成頻繁項集 .
4、對頻繁項集 進行連接生成候選集 ,重復上述步驟,最終形成頻繁K項集或者最大頻繁項集。
Apriori演算法存在兩大定理:
1、如果一個集合是頻繁項集,那麼它的所有子集都是頻繁集合。
2、如果一個集合它不是頻繁集合,那麼它的所有超集都不是頻繁項集。
9.1.3 Apriori演算法優缺點
優:運算過程非常簡單,理論方法也比較容易理解,對數據特徵的要求也相對較低。
缺:
1、產生候選集是產生較多的組合,沒有考慮將一些無關的元素排除後再進行組合。
2、每次計算項集的過程中都會掃描元素的數據表。
針對不足推出不斷改進的Apriori演算法:
1、將數據表(事務表)進行壓縮。
2、利用哈希表的快速查找特性對項集進行計數統計。
3、合理選樣。
3. 關聯規則挖掘演算法的介紹
學號:17020110019 姓名:高少魁
【嵌牛導讀】關聯規則挖掘演算法是數據挖掘中的一種常用演算法,用於發現隱藏在大型數據集中令人感興趣的頻繁出現的模式、關聯和相關性。這里將對該演算法進行簡單的介紹,之後通過Apriori演算法作為實例演示演算法執行結果。
【嵌牛鼻子】數據挖掘 關聯規則挖掘 python
【嵌牛正文】
一、演算法原理
1、基本概念
關聯規則用於發現隱藏在大型數據集中令人感興趣的頻繁出現的模式、關聯和相關性。 而 Apriori演算法則是經典的挖掘頻繁項集的關聯規則演算法,它通過層層迭代來尋找頻繁項集,最後輸出關聯規則:首先掃描數據集,得到 1-頻繁項集,記為 L1,通過合並 L1得到 2-頻繁項集 L2,再通過 L2找到 L3,如此層層迭代,直到找不到頻繁項集為止。
在Apriori演算法中,定義了如下幾個概念:
⚫ 項與項集 :設 I={i1,i2,…,im}是由 m個不同項構成的集合,其中的每個 ik(k=1,2,…,m)被稱為一個項 (Item),項的集合 I被稱為項集和,即項集。在實驗中,每一條購物記錄可以被看做 一個項集,用戶購買的某個商品即為一個項。
⚫ 事務與事務集:神乎事務 T是項集 I的一個子集,而事務的全體被稱為事務集。
⚫ 關聯規則:形如 A=>B的表達式,其中, A和 B都屬於項集 I,且 A與 B不相交。
⚫ 支持度:定義如下 support(A=>B) = P(A B),即 A和 B所含的項在事務集中同時出現的概率。
⚫ 置信度:定義如下 confidence(A⇒B)=support(A⇒B)/support(A)=P(A B)/P(A)=P(B|A),即如果事務包含 A,則事務中同時出現 B的概率。
⚫ 頻繁項集:如果項集 I的支持度滿足事先定義好的最小支持度閾慧液值(即 I的出現頻度大於相應的最小出現頻度閾值),則 I是頻繁項集。
⚫ 強關聯規則:滿足最小支持度和最小置信度的關聯規則,即待挖掘的關聯規則。
根據以上概念,要實現關聯規則的挖掘,首先要找到所有的頻繁項集,之後找出強關聯規則(即通過多次掃描數據集,找出頻繁集,然後產生關聯規則)。
2、挖掘頻繁項集
在該步驟中有兩個較為重要的部分 :連接和修剪。連接步驟即使用k-1頻繁項集,通過連接得到 k-候選項集,並且只有相差一個項的項集才能進行連接,如 {A,B}和 {B,C}連接成為 {A,B,C}。修剪步驟基於一個性質:一個 k-項集,如果它的一個 k-1項集(子集)不是頻繁的,那麼它本身也不可能是頻繁的。 因此可以基於這個性質,通過判斷先驗性質來對候選集進行修剪。
3、產生關聯規則
經過連接和修剪之後,即找到了所有的頻繁項集,此時可以在此基礎上產生關聯規則,步驟如下
(1)對於每個頻繁項集 l,產生 l的所有非空子集(這些非空子集一定是頻繁項集);
(2)對於 l的每一個非空子集 x,計算 confidence(x => (l-x)),如果 confidence(x => (l-x)) confmin,那麼規則 x => (l-x)」成立。
二、演算法設計
1、數據集
通過語句 import xlrd導入相關的庫來進行數據的讀取 。數據內容為十條購物記錄 ,每條購物記錄有若干個商品,表示某個顧客的購買記錄 ,如圖
對於數據載入部分 使用了 xlrd庫中的函數 open_workbook來 打開一個表格文件,使用sheet_by_index函數得到一個工作表, row_values函數即可讀取表格中的內容。由於每個購物記錄的商品數不一定相同,導致讀取的內容含有空格 (』 』),因此對數據進行刪減以得到緊湊的數據 ,最終讀取數據的結果以列表的游碧悉形式返回。
2、連接
對於連接部分,主要目標是根據已有的k-1頻繁項集生成 k-候選頻繁項集。演算法步驟為:首先將項集中的項按照字典順序排序,之後將 k-1項集中兩個項作比較,如果兩個項集中前 k-2個項是相同的,則可以通過或運算(|)將它們連接起來。
3、修剪
修剪操作主要使用一個判斷函數,通過傳入連接操作後的項集和之前的k-1頻繁項集,對新的項集中的每一個項的補集進行判斷,如果該補集不是 k-1頻繁項集的子集,則證明新的項集不滿足先驗性質,即一個頻繁項集的所有非空子集一定是頻繁的 ,否則就滿足先驗形式。返回布爾類型的參數來供調用它的函數作判斷。
經過連接和修剪步驟之後,項基要成為頻繁項集還必須滿足最小支持度的條件,筆者設計了generateFrequentItems函數來對連接、修剪後產生的 k-候選項集進行判斷,通過遍歷數據集,計算其支持度,滿足最小支持度的項集即是 一個頻繁項集,可將其返回。
以上,經過不斷的遍歷、連接、修剪、刪除,可將得到的所有結果以列表形式返回。筆者還設計了字典類型的變數 support_data,以得到某個頻繁項集及其支持度 。
4、挖掘關聯規則
generateRules函數用來挖掘關聯規則,通過傳入 最小置信度、 頻繁項集及其 支持度來生成規則 。根據定理:對於頻繁項集 l的每一個非空子集 x,計算 confidence(x => (l-x)),如果 confidence(x => (l-x)) confmin,那麼規則 x => (l-x)」成立,因此,該函數重點在掃描頻繁項集,得到每一個子集,並計算置信度,當置信度滿足條件(即大於等於最小置信度)時,生成一條規則。在函數中,使用了元組來表示一條規則,元組中包含 x、 l-x以及其置信度 ,最後返回生成的所有規則的列表。
三、演算法執行結果
設置最大頻繁項集數k為 3,最小支持度為 0.2,最小置信度為 0.8 使用 pycharm運行程序 ,得到以下結果:
由圖中結果可以看出,對於頻繁 1-項集,有五個滿足的項集,頻繁 2-項集有 6個,頻繁 3-項集有 2個,它們都滿足支持度大於或等於最小支持度 0.2。根據頻繁項集,程序得到的關聯規則有三條,即 {麵包 }=>{牛奶 },,{雞蛋 }=>{牛奶 },,{麵包,蘋果 }=>{牛奶 其中,這些規則的置信度都是 1.0,滿足大於或等於最小置信度 0.8的條件 。
四、程序源碼
4. 關聯分析的關聯分析的方法
Apriori演算法是挖掘產生布爾關聯規則所需頻繁項集的基本演算法,也是最著名的關聯規則挖掘演算法之一。Apriori演算法就是根據有關頻繁項集特性的先驗知識而命名的。它使用一種稱作逐層搜索的迭代方法,k—項集用於探索(k+1)—項集。首先,找出頻繁1—項集的集合.記做L1,L1用於找出頻繁2—項集的集合L2,再用於找出L3,如此下去,直到不能找到頻繁k—項集。找每個Lk需要掃描一次資料庫。
為提高按層次搜索並產生相應頻繁項集的處理效率,Apriori演算法利用了一個重要性質,並應用Apriori性質來幫助有效縮小頻繁項集的搜索空間。
Apriori性質:一個頻繁項集的任一子集也應該是頻繁項集。證明根據定義,若一個項集I不滿足最小支持度閾值min_sup,則I不是頻繁的,即P(I)<min_sup。若增加一個項A到項集I中,則結果新項集(I∪A)也不是頻繁的,在整個事務資料庫中所出現的次數也不可能多於原項集I出現的次數,因此P(I∪A)<min_sup,即(I∪A)也不是頻繁的。這樣就可以根據逆反公理很容易地確定Apriori性質成立。
針對Apriori演算法的不足,對其進行優化:
1)基於劃分的方法。該演算法先把資料庫從邏輯上分成幾個互不相交的塊,每次單獨考慮一個分塊並對它生成所有的頻繁項集,然後把產生的頻繁項集合並,用來生成所有可能的頻繁項集,最後計算這些項集的支持度。這里分塊的大小選擇要使得每個分塊可以被放入主存,每個階段只需被掃描一次。而演算法的正確性是由每一個可能的頻繁項集至少在某一個分塊中是頻繁項集保證的。
上面所討論的演算法是可以高度並行的。可以把每一分塊分別分配給某一個處理器生成頻繁項集。產生頻繁項集的每一個循環結束後.處理器之間進行通信來產生全局的候選是一項集。通常這里的通信過程是演算法執行時間的主要瓶頸。而另一方面,每個獨立的處理器生成頻繁項集的時間也是一個瓶頸。其他的方法還有在多處理器之間共享一個雜湊樹來產生頻繁項集,更多關於生成頻繁項集的並行化方法可以在其中找到。
2)基於Hash的方法。Park等人提出了一個高效地產生頻繁項集的基於雜湊(Hash)的演算法。通過實驗可以發現,尋找頻繁項集的主要計算是在生成頻繁2—項集Lk上,Park等就是利用這個性質引入雜湊技術來改進產生頻繁2—項集的方法。
3)基於采樣的方法。基於前一遍掃描得到的信息,對它詳細地做組合分析,可以得到一個改進的演算法,其基本思想是:先使用從資料庫中抽取出來的采樣得到一些在整個資料庫中可能成立的規則,然後對資料庫的剩餘部分驗證這個結果。這個演算法相當簡單並顯著地減少了FO代價,但是一個很大的缺點就是產生的結果不精確,即存在所謂的數據扭曲(Dataskew)。分布在同一頁面上的數據時常是高度相關的,不能表示整個資料庫中模式的分布,由此而導致的是采樣5%的交易數據所花費的代價同掃描一遍資料庫相近。
4)減少交易個數。減少用於未來掃描事務集的大小,基本原理就是當一個事務不包含長度為志的大項集時,則必然不包含長度為走k+1的大項集。從而可以將這些事務刪除,在下一遍掃描中就可以減少要進行掃描的事務集的個數。這就是AprioriTid的基本思想。 由於Apriori方法的固有缺陷.即使進行了優化,其效率也仍然不能令人滿意。2000年,Han Jiawei等人提出了基於頻繁模式樹(Frequent Pattern Tree,簡稱為FP-tree)的發現頻繁模式的演算法FP-growth。在FP-growth演算法中,通過兩次掃描事務資料庫,把每個事務所包含的頻繁項目按其支持度降序壓縮存儲到FP—tree中。在以後發現頻繁模式的過程中,不需要再掃描事務資料庫,而僅在FP-Tree中進行查找即可,並通過遞歸調用FP-growth的方法來直接產生頻繁模式,因此在整個發現過程中也不需產生候選模式。該演算法克服了Apriori演算法中存在的問顥.在執行效率上也明顯好於Apriori演算法。
5. 模式挖掘(一):頻繁項集挖掘演算法Apriori和FP Tree
Apriori是最常用的頻繁項集挖掘演算法,其計算邏輯簡單易於直觀理解。在實際應用中舉例,其易於從大量訂單數據中獲取頻繁出現的組合項集,以便於輸出計算單元之間的關聯度,從而給組套銷售、上架擺放等提供建議。下面介紹下工作中總結的知識,和需要避開的問題。
以訂單數據為例。在大量的訂單中,如何評價某一商品組合對的出現頻繁?其組合出現的次數多於其它組合嗎。若訂單覆蓋的商品品類豐富,那麼需求量不高的品類的組合便會被淹沒在快消品的組合里。所以在Apriori中有從三個不同的角度評價頻繁項集,描述元素關聯關系的指標:支持度、置信度、提升度。
在Apriori中有三個維度的頻繁項集的指標: 支持度 、 置信度 、 提升度 。下面以二元的組合舉例說明。
支持度:
置信度:
提升度:
6. apriori演算法
Apriori演算法是第一個關聯規則挖掘演算法,也是最經典的演算法。它利用逐層搜索的迭代方法找出資料庫中項集的關系,以形成規則,其過程由連接(類矩陣運算)與剪枝(去掉那些沒必要的中間結果)組成。