關聯規則挖掘演算法:Apriori,演算法apriori
所謂的關聯規則(Association Rule)主要是指資料中的並發關係,最典型的的應用就是對購物籃的分析,發現所有的老爸買尿布的時候都會買啤酒。
關聯規則挖掘中有一些容易混淆的術語,詳見http://blog.sina.com.cn/s/blog_4d8d6303010009kb.html ,這裡有兩個很重要的概念:支援度和信賴度。通俗的說,支援度就是所有的顧客中有多少顧客買了尿布和啤酒(支援度過低,說明該規則實際中較少出現,沒有應用價值);信賴度就是所有買了尿布的顧客中有多少買了啤酒的(信賴度過低,說明買尿布就會買啤酒這條規則不太可靠)
Apriori演算法的實質十分簡單:首先找出所有只包含一個項目的規則,然後合成包含兩個項目的規則(中間需要進行剪枝),以此類推。
Aprior演算法流程圖: Candidate-gen函數流程圖:
接下來我將用一個實際的例子來描述Apriori演算法的過程: 假設我們要求的最小支援度minsup=30%,最小信賴度mincond=80%。再次介紹兩個十分重要的術語: k項頻繁集(包含k個項目的支援度公安與minsupde 項目集合)。 向下閉包屬性(Downward Closure Property)這個屬性是演算法的一個核心,即如果一個項集為頻繁項目集,那麼它的所有非空子集也是頻繁項目集;很明顯,若集合{1,2}是頻繁項集,那麼{1},{2}肯定也是頻繁項集(因為包含1,2的交易一定包含1,但包含1的交易不一定包含1,2)。 Apriori演算法的第一個主要步驟是使用前一輪產生的頻繁項集Fk-1(一般初始化為只含一個項目的頻繁集),通過candidate-gen函數來產生候選項集Ck。這裡來介紹一下candidate-gen函數。該函數主要包含合并和剪枝兩個步驟。 合并:就是使用兩個(k-1)頻繁項集產生k頻繁項集,首先注意每個項集裡的項目都是按一定順序排序的,這裡要求兩個頻繁項集的前k-2個項要相同只有最後一個不同。具體來說就是頻繁集{1,3}和{1,5}合成{1,3,5}。你一定要問了{1,3}和{3,5}能合成{1,3,5}嗎?答案是不能,因為根據向下閉包原則,如果{1,3,5}是頻繁集那麼{1,3}{1,5}{3,5}都是頻繁集,想想如果{1,5}是頻繁集的話,那麼就可以直接用{1,3}和{1,5}來合成{1,3,5}了,沒必要使用{3,5},所以這裡的合并必須要求前k-2項是相同的,只有最後一項是不同的。 剪枝:就是檢查所有候選集Ck的子集是否是頻繁集,如果有一個子集不是,則刪除Ck。例如前面通過{1,3}和{1,5}產生的{1,3,5},如果{3,5}不是頻繁集則{1,3,5}肯定也不是頻繁集。 Apriori演算法的最後一步就是檢查新的候選集合中所有項集的支援度,符合要求的就進行下一輪篩選。 最後講講如何根據產生的頻繁項集來生產規則。根據Apriori演算法產生了頻繁項目集f,那麼所有的關聯規則都可以表示為(f-a) -> a,並且可以繼續推斷(f-b(b為a的子集)) -> b,必然成立。因為信賴度=f.count/(f-a).count,其中a集合越小,f-a集合越大,(f-a).count越小,總的信賴度也越大,這就是所謂的資料稀疏原理(越是大的資料集合在實際中出現的次數越小)。建置規則的過程類似於Apriori演算法,首先找出頻繁集f的所有後件為1的規則,然後利用candidate-gen函數類推,只不過裡面是將支援度檢驗換為信賴度檢驗即可。
Apriori的一個具體實現的例子:http://blog.csdn.net/lskyne/article/details/8302478
線上急apriori演算法,要可以實現關聯規則
摘 要
隨著資訊時代的發展,資訊量呈幾何級數增長,人們發現從這些海量資訊中擷取有用的資訊越來越困難,要找出資訊背後隱藏的規律更是不可想象。資料採礦就是從大量資料中擷取有用資訊的一門新技術,關聯規則挖掘是資料採礦方法中的一種。本文詳細論述了基於Apriori演算法的關聯規則挖掘系統的設計開發過程。系統基於經典的Apriori演算法,對交易資料庫進行了位元影像矩陣轉換,大大提高了搜尋效率,並能分別挖掘頻繁項集和關聯規則。
論文組織如下:首先介紹了資料採礦的產生、定義和應用;接著闡述了關聯規則挖掘的基本概念;然後對系統的需求進行了分析,並提出設計方案;緊接著是系統的具體實現;最後對系統進行了測試,將系統用於挖掘中藥方劑庫中的藥對藥組,驗證了系統的正確性和實用性。
關鍵詞:資料採礦;關聯規則;Apriori演算法
需求分析和設計方案
4.1需求分析
由於交易資料庫一般只具有對大量資料的存取、檢索功能,對於使用者的一般性的使用可以滿足,然而,正是由於資料庫中存放了大量的資料,不同的資料項目,以及多個資料項目之間還存在有大量的隱含的、未知的、有意義的資料關係,這些關係對於使用者有著及其重要的作用,所以資料採礦便在此情況下產生了。而關聯規則挖掘是資料採礦中一個重要規則,Apriori演算法又是關聯挖掘的一個經典演算法,它能發現大量資料中項集之間有趣的關聯和相關聯絡。隨著大量資料不停地收集和儲存,許多業界人士對於從他們的資料庫中挖掘關聯規則越來越感興趣。從大量商務事務記錄中發現有趣的關聯關係,可以協助許多商務決策的制定,如分類設計、交叉購物和促銷分析。
1引言
隨著資料庫技術的迅速發展以及資料庫管理系統的廣泛應用,人們積累的資料越來越多。激增的資料背後隱藏著許多重要的資訊,人們希望能夠對其進行更高層次的分析,以便更好地利用這些資料。目前的資料庫系統可以高效地實現資料的錄入、查詢、統計等功能,但無法探索資料中存在的關係和規則,無法根據現有的資料預測未來的發展趨勢。缺乏找出資料背後隱藏的知識的手段,導致了“資料爆炸但知識貧乏”的現象。於是資料採礦技術應運而生,並顯示出強大的生命力。資料採礦就是從大量的、不完全的、有雜訊的、模糊的、隨機的資料中,提取隱含在其中的、人們事先不知道的、但又是潛在有用的資訊和知識的過程。它使人類分析問題和發現知識能力得到了延伸。
2資料採礦概述
2.1資料採礦的產生
隨著資訊時代的發展,資訊量呈幾何級數增長,然而用於對這些資料進行分析處理的工具卻很少,人們擁有了海量的資料的同時卻苦於資訊的缺乏。而激增的資料背後隱藏著許多重要的資訊,人們希望能夠對其進行更高層次的分析,以便更好地利用這些資料。目前的資料庫系統可以高效地實現資料的錄入、查詢、統計等功能,但無法探索資料中存在的關係和規則,無法根據現有的資料預測未來的發展趨勢。缺乏挖掘資料背後隱藏的知識的手段,導致了“資料爆炸但知識貧乏”的現象。資訊爆炸是一把雙刃劍:巨量的資訊既是最重要的財富,又是最危險的殺手。巨量資訊也導致決策與理解危機。面對“人人被資料淹沒,人們卻饑餓於知識”的挑戰,資料採礦和知識發現技術應運而生,並得以蓬勃發展,越來越顯示出其強大的生命力。
資料採礦是資訊技術自然演化的結果。演化過程的見證是資料庫業界開發以下功能:資料收集和資料庫建立,資料管理(包括資料存放區和檢索,資料庫交易處理),以及資料分析與理解(涉及資料倉儲和資料採礦)。例如,資料收集和資料庫建立機制的早期開發已成為稍後資料存放區和檢索、查詢和交易處理有效機制開發的必備基礎。隨著提供查詢和交易處理的大量資料庫系統廣泛付諸實踐,數......餘下全文>>
用Matlab實現apriori演算法關聯規則的挖掘程式,完整有詳細註解
下面這段是apriori演算法中由2頻繁項集找k頻繁項集的程式,程式中有兩個問題:
1、似乎while迴圈的K永遠都是固定的,也就是都是頻繁2項集的個數。得到頻繁3項集後K的個數不是要變嗎?如何體現呢?
2、程式中有兩個for的大迴圈,但是發現結果是只要找到一個頻繁3項集第二個for迴圈就會結束,但是其實還應該有其它的頻繁3項集。for迴圈不是應該無條件執行到參數k結束嗎?當時k值是15,可是程式結束的時候i=2,j=3,然後j就不執行4以及一直到k的部分了。是什麼原因呢?麻煩高手指點一下。急啊……
while( k>0)
le=length(candidate{1});
num=2;
nl=0;
for i=1:k-1
for j=i+1:k
x1=candidate{i}; %candidate初始值為頻繁2項集,這個表示頻繁項集的第i項
x2=candidate{j};
c = intersect(x1, x2);
M=0;
r=1;
nn=0;
l1=0;
if (length(c)==le-1) & (sum(c==x1(1:le-1))==le-1)
houxuan=union(x1(1:le),x2(le));
%樹剪枝,若一個候選項的某個K-1項子集為非頻繁,則剪枝掉
sub_set=subset(houxuan);
%產生該候選項的所有K-1項子集
NN=length(sub_set);
%判斷這些K-1項自己是否都為頻繁的
while(r & M<NN)
M=M+1;
r=in(sub_set{M},candidate);
end
if M==NN
nl=nl+1;
%候選k項集
cand{nl}=houxuan;
%記錄每個候選k項集出現的次數
le=length(cand{1});
for i=1:m
s=cand{nl};
x=X(i,:);
if sum(x(s))==le
nn=nn+1;
end
end
end
end
......餘下全文>>