数据仓库与数据挖掘论文
《數(shù)據(jù)倉(cāng)庫(kù)與數(shù)據(jù)挖掘》課程論文
題目: 關(guān)聯(lián)分析Apriori算法的研究和案例實(shí)現(xiàn)
專(zhuān)業(yè): 計(jì)算機(jī)科學(xué)與技術(shù)
學(xué)號(hào): XXXXXXXXX
姓名: XXX
2018-2019學(xué)年第二學(xué)期
目錄
1.1 算法簡(jiǎn)介 1
1.2 研究現(xiàn)狀 1
2.1 相關(guān)概念 2
2.2 基本思想 3
4.1 所應(yīng)用的數(shù)據(jù)集介紹 6
4.2 核心代碼 7
4.3 實(shí)現(xiàn)頁(yè)面截圖 10
5.總結(jié) 12
1.研究現(xiàn)狀
1.1算法簡(jiǎn)介
Apriori算法是經(jīng)典的挖掘頻繁項(xiàng)集和關(guān)聯(lián)規(guī)則的數(shù)據(jù)挖掘算法。A priori在拉丁語(yǔ)中指"來(lái)自以前"。當(dāng)定義問(wèn)題時(shí),通常會(huì)使用先驗(yàn)知識(shí)或者假設(shè),這被稱作"一個(gè)先驗(yàn)"(a priori)。Apriori算法的名字正是基于這樣的事實(shí):算法使用頻繁項(xiàng)集性質(zhì)的先驗(yàn)性質(zhì),即頻繁項(xiàng)集的所有非空子集也一定是頻繁的。Apriori算法使用一種稱為逐層搜索的迭代方法,其中k項(xiàng)集用于探索(k+1)項(xiàng)集。首先,通過(guò)掃描數(shù)據(jù)庫(kù),累計(jì)每個(gè)項(xiàng)的計(jì)數(shù),并收集滿足最小支持度的項(xiàng),找出頻繁1項(xiàng)集的集合。該集合記為L(zhǎng)1。然后,使用L1找出頻繁2項(xiàng)集的集合L2,使用L2找出L3,如此下去,直到不能再找到頻繁k項(xiàng)集。每找出一個(gè)Lk需要一次數(shù)據(jù)庫(kù)的完整掃描。Apriori算法使用頻繁項(xiàng)集的先驗(yàn)性質(zhì)來(lái)壓縮搜索空間。
1.2研究現(xiàn)狀
Apriori是Agrawal等于1993年設(shè)計(jì)的一個(gè)基本算法,首先提出了挖掘顧客交易數(shù)據(jù)庫(kù)中項(xiàng)集間的關(guān)聯(lián)規(guī)則問(wèn)題,其核心方法是基于頻繁項(xiàng)集理論的遞推方法。算法提出后以后,很多研究人員對(duì)關(guān)聯(lián)規(guī)則挖掘算法進(jìn)行了大量研究,特別是對(duì)關(guān)聯(lián)規(guī)則挖掘算法進(jìn)行了大量的研究和優(yōu)化。如Savasere等人設(shè)計(jì)了一個(gè)基于劃分的算法,Mannila提出的基于采樣的方法等。
近幾年,隨著研究者對(duì)于關(guān)聯(lián)規(guī)則挖掘的深入研究,關(guān)聯(lián)規(guī)則挖掘研究有了許多擴(kuò)展,包括:事務(wù)間關(guān)聯(lián)規(guī)則挖掘、空間關(guān)聯(lián)規(guī)則挖掘、負(fù)關(guān)聯(lián)規(guī)則挖掘、序列模式挖掘及正關(guān)聯(lián)規(guī)則挖掘;另外,對(duì)度量的研究也有所突破。自從Chen,Hart,Brin和Motwani等人提出了強(qiáng)關(guān)聯(lián)規(guī)則的興趣度問(wèn)題以后,強(qiáng)關(guān)聯(lián)規(guī)則興趣度問(wèn)題的研究得到了很高的重視。后來(lái)評(píng)估關(guān)聯(lián)規(guī)則興趣度相應(yīng)的一些優(yōu)化方法的出現(xiàn),促進(jìn)了目前度量方法的進(jìn)一步改進(jìn)和完善。同時(shí),Motwani和Silverstein把這方面的研究和討論推廣到相關(guān)的算法中。除這個(gè)方面外,其他方面的研究也得到了發(fā)展,如多層關(guān)聯(lián)規(guī)則挖掘、區(qū)間數(shù)據(jù)關(guān)聯(lián)規(guī)則挖掘、刪除冗余規(guī)則、度量的改進(jìn)研究、關(guān)聯(lián)規(guī)則的有效增量更新和并行分布規(guī)則挖掘等等,這些關(guān)聯(lián)規(guī)則挖掘算法在實(shí)際數(shù)據(jù)挖掘系統(tǒng)中的到了很好的應(yīng)用。
2.算法思想
2.1相關(guān)概念
(1)項(xiàng)(item): 項(xiàng)指的是具體的一件東西,比如在購(gòu)物籃的例子中,你的購(gòu)物籃里面的大米,被子,紅酒等等商品都是項(xiàng);
(2)項(xiàng)集(itemset): 顧名思義,項(xiàng)的集合,由一個(gè)或多個(gè)項(xiàng)組成的一個(gè)整體,我們把由kk個(gè)項(xiàng)組成的項(xiàng)集叫kk項(xiàng)集;
(3)事務(wù)(transaction):一個(gè)事務(wù),可以看做是發(fā)生的一次事件,比如一個(gè)人一次的購(gòu)物清單,用符號(hào)TT表示,一般來(lái)說(shuō),TT包含一個(gè)它本身的身份——TIDTID以及事務(wù)中的一個(gè)項(xiàng)集。當(dāng)然,如果我們收集很多這樣的清單,構(gòu)成一個(gè)數(shù)據(jù)庫(kù),這個(gè)數(shù)據(jù)庫(kù)就能作為我們挖掘計(jì)算的依據(jù)了。這個(gè)庫(kù),用符號(hào)DD表示。
(4)關(guān)聯(lián)規(guī)則:表示實(shí)體之間相關(guān)關(guān)系,用蘊(yùn)含式A?BA?B表示A和B之間相關(guān)關(guān)系(A和B可以是兩個(gè)項(xiàng),也可以是兩個(gè)項(xiàng)集),關(guān)聯(lián)規(guī)則包含支持度(support)和置信度(confidence)兩個(gè)層面指標(biāo);
(5)支持度(support):說(shuō)的是所有事務(wù)中,A和B同時(shí)出現(xiàn)的次數(shù)與總的事務(wù)數(shù)的比例。換個(gè)說(shuō)法,現(xiàn)實(shí)數(shù)據(jù)中,支持A和B這種關(guān)聯(lián)的比例。用以下公式計(jì)算:
support(A?B)=P(A∪B)
其中,P(A∪B)的意思是事務(wù)中同時(shí)包含A和B的比例;
(6)置信度(confidence):A?BA?B的置信度說(shuō)的是包含A的事務(wù)中,同時(shí)也包含B的事務(wù)所占的比例。用以下公式計(jì)算:
confidence(A?B)=P(B|A)
比如說(shuō),總共100個(gè)事務(wù),有50個(gè)包含A,而這50個(gè)事務(wù)當(dāng)中,又有20個(gè)同時(shí)也包含B,那么,confidence(A?B)=40%
了解了支持度(support)和置信度(confidence)兩個(gè)概念,那么不妨可以再深入一步,拓展一個(gè)概念:絕對(duì)支持度;
支持度計(jì)數(shù)(絕對(duì)支持度):絕對(duì)支持度又叫支持度計(jì)數(shù),頻度或計(jì)數(shù)。上面我們定義的支持度其實(shí)也可以叫“相對(duì)支持度”,而絕對(duì)支持度則說(shuō)的是一個(gè)實(shí)體出現(xiàn)的次數(shù),比如:support(A) = A在全體事務(wù)數(shù)據(jù)庫(kù)DD中出現(xiàn)的次數(shù)。這個(gè)概念很重要,因?yàn)橐揽恐С侄扔?jì)數(shù)我們就能通過(guò)support(A)support(A)和support(A∪B)support(A∪B)來(lái)計(jì)算置信度:
confidence(A?B)=P(B|A)=support(A∪B)support(A)
(7)強(qiáng)規(guī)則:我們將實(shí)體之間的關(guān)聯(lián)規(guī)則定義為強(qiáng)規(guī)則,如果實(shí)體之間的相對(duì)支持度(support)和置信度(confidence)滿足我們預(yù)定義的最小支持度閾值(min_sup)和最小置信度閾值(min_conf)。換句話說(shuō),只要我們?cè)谏厦娴母拍?中定義的兩個(gè)指標(biāo)都滿足,那么,實(shí)體之間就是極有強(qiáng)(關(guān)聯(lián))規(guī)則的;
(8)頻繁項(xiàng)集:指的是頻繁在事務(wù)中出現(xiàn)的項(xiàng)集,所謂“頻繁”的標(biāo)準(zhǔn)就是這個(gè)項(xiàng)集出現(xiàn)的次數(shù)滿足最小支持度計(jì)數(shù)(閾值)。
2.2 基本思想
該算法的基本思想是:首先找出所有的頻集,這些項(xiàng)集出現(xiàn)的頻繁性至少和預(yù)定義的最小支持度一樣。然后由頻集產(chǎn)生強(qiáng)關(guān)聯(lián)規(guī)則,這些規(guī)則必須滿足最小支持度和最小可信度。然后使用第1步找到的頻集產(chǎn)生期望的規(guī)則,產(chǎn)生只包含集合的項(xiàng)的所有規(guī)則,其中每一條規(guī)則的右部只有一項(xiàng),這里采用的是中規(guī)則的定義。一旦這些規(guī)則被生成,那么只有那些大于用戶給定的最小可信度的規(guī)則才被留下來(lái)。為了生成所有頻集,使用了遞歸的方法。
(1) L1 = find_frequent_1-itemsets(D);
(2) for (k=2;Lk-1 ≠Φ ;k++) {
(3) Ck = apriori_gen(Lk-1 ,min_sup);
(4) for each transaction t ∈ D {//scan D for counts
(5) Ct = subset(Ck,t);//get the subsets of t that are candidates
(6) for each candidate c ∈ Ct
(7) c.count++;
(8) }
(9) Lk ={c ∈ Ck|c.count≥min_sup}
(10) }
(11) return L= ∪ k Lk;
可能產(chǎn)生大量的候選集,以及可能需要重復(fù)掃描數(shù)據(jù)庫(kù),是Apriori算法的兩大缺點(diǎn)。
3.算法步驟
下面我們對(duì)Aprior算法流程做一個(gè)總結(jié)。
輸入:數(shù)據(jù)集合D,支持度閾值α
輸出:最大的頻繁k項(xiàng)集
(1)掃描整個(gè)數(shù)據(jù)集,得到所有出現(xiàn)過(guò)的數(shù)據(jù),作為候選頻繁1項(xiàng)集。k=1,頻繁0項(xiàng)集為空集。
(2)挖掘頻繁k項(xiàng)集
(a) 掃描數(shù)據(jù)計(jì)算候選頻繁k項(xiàng)集的支持度
(b) 去除候選頻繁k項(xiàng)集中支持度低于閾值的數(shù)據(jù)集,得到頻繁k項(xiàng)集。如果得到的頻繁k項(xiàng)集為空,則直接返回頻繁k-1項(xiàng)集的集合作為算法結(jié)果,算法結(jié)束。如果得到的頻繁k項(xiàng)集只有一項(xiàng),則直接返回頻繁k項(xiàng)集的集合作為算法結(jié)果,算法結(jié)束。
? 基于頻繁k項(xiàng)集,連接生成候選頻繁k+1項(xiàng)集。
(3) 令k=k+1,轉(zhuǎn)入步驟2。
從算法的步驟可以看出,Aprior算法每輪迭代都要掃描數(shù)據(jù)集,因此在數(shù)據(jù)集很大,數(shù)據(jù)種類(lèi)很多的時(shí)候,算法效率很低。
我們下面這個(gè)簡(jiǎn)單的例子看看:
圖3.1.1
我們的數(shù)據(jù)集D有4條記錄,分別是134,235,1235和25。現(xiàn)在我們用Apriori算法來(lái)尋找頻繁k項(xiàng)集,最小支持度設(shè)置為50%。首先我們生成候選頻繁1項(xiàng)集,包括我們所有的5個(gè)數(shù)據(jù)并計(jì)算5個(gè)數(shù)據(jù)的支持度,計(jì)算完畢后我們進(jìn)行剪枝,數(shù)據(jù)4由于支持度只有25%被剪掉。我們最終的頻繁1項(xiàng)集為1235,現(xiàn)在我們鏈接生成候選頻繁2項(xiàng)集,包括12,13,15,23,25,35共6組。此時(shí)我們的第一輪迭代結(jié)束。
進(jìn)入第二輪迭代,我們掃描數(shù)據(jù)集計(jì)算候選頻繁2項(xiàng)集的支持度,接著進(jìn)行剪枝,由于12和15的支持度只有25%而被篩除,得到真正的頻繁2項(xiàng)集,包括13,23,25,35。現(xiàn)在我們鏈接生成候選頻繁3項(xiàng)集,123, 125,135和235共4組,這部分圖中沒(méi)有畫(huà)出。通過(guò)計(jì)算候選頻繁3項(xiàng)集的支持度,我們發(fā)現(xiàn)123,125和135的支持度均為25%,因此接著被剪枝,最終得到的真正頻繁3項(xiàng)集為235一組。由于此時(shí)我們無(wú)法再進(jìn)行數(shù)據(jù)連接,進(jìn)而得到候選頻繁4項(xiàng)集,最終的結(jié)果即為頻繁3三項(xiàng)集235。
4.算法應(yīng)用
4.1所應(yīng)用的數(shù)據(jù)集介紹
以超市交易為數(shù)據(jù)集,所有商品的項(xiàng)集為I = {bread, beer, cake, cream, milk, tea}
某條交易如Ti = {bread, beer, milk},可以簡(jiǎn)化為T(mén)i = {a, b, d}
data.txt數(shù)據(jù)集樣本如下
a, d, e,f
a, d, e
c, e
e, f
…
數(shù)據(jù)集位于本地的D:\data目錄下,數(shù)據(jù)集一共有270行,前24行的數(shù)據(jù)內(nèi)容如圖4.1所示
圖4.1.1
4.2核心代碼
# -*- coding: utf-8 -*- """ Created on Tue Jun 25 21:39:58 2019@author: lyz """def load_data_set():data_set = []fd = open("d:\data\data.txt", "r")for line in fd.readlines():line = line.strip('\n')data_set.append(line)return data_set''' 直接從數(shù)據(jù)集構(gòu)造1-候選集 ''' def create_C1(data_set):C1 = set()for t in data_set:for item in t:item_set = frozenset([item])C1.add(item_set)return C1''' 判斷是否滿足 ''' def is_apriori(Ck_item, Lksub1):for item in Ck_item:sub_Ck = Ck_item - frozenset([item])if sub_Ck not in Lksub1:return Falsereturn True''' 生成各個(gè)候選集Ck ''' def create_Ck(Lksub1, k):Ck = set()len_Lksub1 = len(Lksub1)list_Lksub1 = list(Lksub1)for i in range(len_Lksub1):for j in range(1, len_Lksub1):l1 = list(list_Lksub1[i])l2 = list(list_Lksub1[j])l1.sort()l2.sort()if l1[0:k-2] == l2[0:k-2]:Ck_item = list_Lksub1[i] | list_Lksub1[j]if is_apriori(Ck_item, Lksub1):Ck.add(Ck_item)return Ck''' 通過(guò)候選集Ck生成頻繁集Lk ''' def generate_Lk_by_Ck(data_set, Ck, min_support, support_data):Lk = set()item_count = {}for t in data_set:for item in Ck:if item.issubset(t):if item not in item_count:item_count[item] = 1else:item_count[item] += 1t_num = float(len(data_set))for item in item_count:if (item_count[item] / t_num) >= min_support:Lk.add(item)support_data[item] = item_count[item] / t_numreturn Lk''' 生成各階頻繁集,最小支持度為0.2 ''' def generate_L(data_set, k, min_support):support_data = {}C1 = create_C1(data_set)L1 = generate_Lk_by_Ck(data_set, C1, min_support, support_data)Lksub1 = L1.copy()L = []L.append(Lksub1)for i in range(2, k+1):Ci = create_Ck(Lksub1, i)Li = generate_Lk_by_Ck(data_set, Ci, min_support, support_data)Lksub1 = Li.copy()L.append(Lksub1)return L, support_data''' 生成從頻繁集關(guān)聯(lián)規(guī)則分析 ''' def generate_big_rules(L, support_data, min_conf):big_rule_list = []sub_set_list = []for i in range(0, len(L)):for freq_set in L[i]:for sub_set in sub_set_list:if sub_set.issubset(freq_set):conf = support_data[freq_set] / support_data[freq_set - sub_set]big_rule = (freq_set - sub_set, sub_set, conf)if conf >= min_conf and big_rule not in big_rule_list:big_rule_list.append(big_rule)sub_set_list.append(freq_set)return big_rule_listif __name__ == "__main__":data_set = load_data_set()L, support_data = generate_L(data_set, k=3, min_support=0.2)big_rules_list = generate_big_rules(L, support_data, min_conf=0.7)for Lk in L:print ("=" * 50)print ("frequent " + str(len(list(Lk)[0])) + "-itemsets\t\tsupport")print ("=" * 50)for freq_set in Lk:print (freq_set, support_data[freq_set])print()print ("Big Rules")for item in big_rules_list:print (item[0], "=>", item[1], "conf: ", item[2])4.3實(shí)現(xiàn)頁(yè)面截圖
圖 4.3.1
圖4.3.2
圖4.3.3
圖4.3.4
5.總結(jié)
Aprior算法是一個(gè)非常經(jīng)典的頻繁項(xiàng)集的挖掘算法,很多算法都是基于Aprior算法而產(chǎn)生的,包括FP-Tree,GSP, CBA等。這些算法利用了Aprior算法的思想,但是對(duì)算法做了改進(jìn),數(shù)據(jù)挖掘效率更好一些,因此現(xiàn)在一般很少直接用Aprior算法來(lái)挖掘數(shù)據(jù)了,但是理解Aprior算法是理解其它Aprior類(lèi)算法的前提,同時(shí)算法本身也不復(fù)雜,因此值得好好研究一番。
這次的收獲主要有以下幾點(diǎn):同一行數(shù)據(jù),最小支持度越小,那么產(chǎn)生的頻繁項(xiàng)集維數(shù)越高,程序運(yùn)行的時(shí)間越長(zhǎng);頻繁項(xiàng)集的子集一定是頻繁的,子集頻繁父親一定頻繁;Apriori也存在缺點(diǎn):第一,在每一步產(chǎn)生候選項(xiàng)目集時(shí)循環(huán)產(chǎn)生的組合過(guò)多,沒(méi)有排除不應(yīng)該參與組合的元素;第二,每次計(jì)算項(xiàng)集的支持度時(shí),開(kāi)銷(xiāo)會(huì)隨著數(shù)據(jù)的增多而成幾何級(jí)增長(zhǎng)。
總結(jié)
以上是生活随笔為你收集整理的数据仓库与数据挖掘论文的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 为什么ui框架设计成单线程_评估UI设计
- 下一篇: skype国际版android,Skyp