日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数据仓库与数据挖掘论文

發布時間:2023/12/10 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据仓库与数据挖掘论文 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

《數據倉庫與數據挖掘》課程論文

題目: 關聯分析Apriori算法的研究和案例實現

專業: 計算機科學與技術
學號: XXXXXXXXX
姓名: XXX

2018-2019學年第二學期
目錄

  • 研究現狀 1
    1.1 算法簡介 1
    1.2 研究現狀 1
  • 算法思想 2
    2.1 相關概念 2
    2.2 基本思想 3
  • 算法步驟 4
  • 算法應用 6
    4.1 所應用的數據集介紹 6
    4.2 核心代碼 7
    4.3 實現頁面截圖 10
    5.總結 12
  • 1.研究現狀
    1.1算法簡介
    Apriori算法是經典的挖掘頻繁項集和關聯規則的數據挖掘算法。A priori在拉丁語中指"來自以前"。當定義問題時,通常會使用先驗知識或者假設,這被稱作"一個先驗"(a priori)。Apriori算法的名字正是基于這樣的事實:算法使用頻繁項集性質的先驗性質,即頻繁項集的所有非空子集也一定是頻繁的。Apriori算法使用一種稱為逐層搜索的迭代方法,其中k項集用于探索(k+1)項集。首先,通過掃描數據庫,累計每個項的計數,并收集滿足最小支持度的項,找出頻繁1項集的集合。該集合記為L1。然后,使用L1找出頻繁2項集的集合L2,使用L2找出L3,如此下去,直到不能再找到頻繁k項集。每找出一個Lk需要一次數據庫的完整掃描。Apriori算法使用頻繁項集的先驗性質來壓縮搜索空間。
    1.2研究現狀
    Apriori是Agrawal等于1993年設計的一個基本算法,首先提出了挖掘顧客交易數據庫中項集間的關聯規則問題,其核心方法是基于頻繁項集理論的遞推方法。算法提出后以后,很多研究人員對關聯規則挖掘算法進行了大量研究,特別是對關聯規則挖掘算法進行了大量的研究和優化。如Savasere等人設計了一個基于劃分的算法,Mannila提出的基于采樣的方法等。
    近幾年,隨著研究者對于關聯規則挖掘的深入研究,關聯規則挖掘研究有了許多擴展,包括:事務間關聯規則挖掘、空間關聯規則挖掘、負關聯規則挖掘、序列模式挖掘及正關聯規則挖掘;另外,對度量的研究也有所突破。自從Chen,Hart,Brin和Motwani等人提出了強關聯規則的興趣度問題以后,強關聯規則興趣度問題的研究得到了很高的重視。后來評估關聯規則興趣度相應的一些優化方法的出現,促進了目前度量方法的進一步改進和完善。同時,Motwani和Silverstein把這方面的研究和討論推廣到相關的算法中。除這個方面外,其他方面的研究也得到了發展,如多層關聯規則挖掘、區間數據關聯規則挖掘、刪除冗余規則、度量的改進研究、關聯規則的有效增量更新和并行分布規則挖掘等等,這些關聯規則挖掘算法在實際數據挖掘系統中的到了很好的應用。
    2.算法思想
    2.1相關概念
    (1)項(item): 項指的是具體的一件東西,比如在購物籃的例子中,你的購物籃里面的大米,被子,紅酒等等商品都是項;
    (2)項集(itemset): 顧名思義,項的集合,由一個或多個項組成的一個整體,我們把由kk個項組成的項集叫kk項集;
    (3)事務(transaction):一個事務,可以看做是發生的一次事件,比如一個人一次的購物清單,用符號TT表示,一般來說,TT包含一個它本身的身份——TIDTID以及事務中的一個項集。當然,如果我們收集很多這樣的清單,構成一個數據庫,這個數據庫就能作為我們挖掘計算的依據了。這個庫,用符號DD表示。
    (4)關聯規則:表示實體之間相關關系,用蘊含式A?BA?B表示A和B之間相關關系(A和B可以是兩個項,也可以是兩個項集),關聯規則包含支持度(support)和置信度(confidence)兩個層面指標;
    (5)支持度(support):說的是所有事務中,A和B同時出現的次數與總的事務數的比例。換個說法,現實數據中,支持A和B這種關聯的比例。用以下公式計算:
    support(A?B)=P(A∪B)
    其中,P(A∪B)的意思是事務中同時包含A和B的比例;
    (6)置信度(confidence):A?BA?B的置信度說的是包含A的事務中,同時也包含B的事務所占的比例。用以下公式計算:
    confidence(A?B)=P(B|A)
    比如說,總共100個事務,有50個包含A,而這50個事務當中,又有20個同時也包含B,那么,confidence(A?B)=40%
    了解了支持度(support)和置信度(confidence)兩個概念,那么不妨可以再深入一步,拓展一個概念:絕對支持度;
    支持度計數(絕對支持度):絕對支持度又叫支持度計數,頻度或計數。上面我們定義的支持度其實也可以叫“相對支持度”,而絕對支持度則說的是一個實體出現的次數,比如:support(A) = A在全體事務數據庫DD中出現的次數。這個概念很重要,因為依靠支持度計數我們就能通過support(A)support(A)和support(A∪B)support(A∪B)來計算置信度:
    confidence(A?B)=P(B|A)=support(A∪B)support(A)
    (7)強規則:我們將實體之間的關聯規則定義為強規則,如果實體之間的相對支持度(support)和置信度(confidence)滿足我們預定義的最小支持度閾值(min_sup)和最小置信度閾值(min_conf)。換句話說,只要我們在上面的概念5中定義的兩個指標都滿足,那么,實體之間就是極有強(關聯)規則的;
    (8)頻繁項集:指的是頻繁在事務中出現的項集,所謂“頻繁”的標準就是這個項集出現的次數滿足最小支持度計數(閾值)。
    2.2 基本思想
    該算法的基本思想是:首先找出所有的頻集,這些項集出現的頻繁性至少和預定義的最小支持度一樣。然后由頻集產生強關聯規則,這些規則必須滿足最小支持度和最小可信度。然后使用第1步找到的頻集產生期望的規則,產生只包含集合的項的所有規則,其中每一條規則的右部只有一項,這里采用的是中規則的定義。一旦這些規則被生成,那么只有那些大于用戶給定的最小可信度的規則才被留下來。為了生成所有頻集,使用了遞歸的方法。
    (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;
    可能產生大量的候選集,以及可能需要重復掃描數據庫,是Apriori算法的兩大缺點?!   ?br /> 3.算法步驟
    下面我們對Aprior算法流程做一個總結。
      輸入:數據集合D,支持度閾值α
      輸出:最大的頻繁k項集
      (1)掃描整個數據集,得到所有出現過的數據,作為候選頻繁1項集。k=1,頻繁0項集為空集。
      (2)挖掘頻繁k項集
        (a) 掃描數據計算候選頻繁k項集的支持度
        (b) 去除候選頻繁k項集中支持度低于閾值的數據集,得到頻繁k項集。如果得到的頻繁k項集為空,則直接返回頻繁k-1項集的集合作為算法結果,算法結束。如果得到的頻繁k項集只有一項,則直接返回頻繁k項集的集合作為算法結果,算法結束。
        ? 基于頻繁k項集,連接生成候選頻繁k+1項集。
      (3) 令k=k+1,轉入步驟2。
    從算法的步驟可以看出,Aprior算法每輪迭代都要掃描數據集,因此在數據集很大,數據種類很多的時候,算法效率很低。
    我們下面這個簡單的例子看看:

    圖3.1.1
      我們的數據集D有4條記錄,分別是134,235,1235和25?,F在我們用Apriori算法來尋找頻繁k項集,最小支持度設置為50%。首先我們生成候選頻繁1項集,包括我們所有的5個數據并計算5個數據的支持度,計算完畢后我們進行剪枝,數據4由于支持度只有25%被剪掉。我們最終的頻繁1項集為1235,現在我們鏈接生成候選頻繁2項集,包括12,13,15,23,25,35共6組。此時我們的第一輪迭代結束。
      進入第二輪迭代,我們掃描數據集計算候選頻繁2項集的支持度,接著進行剪枝,由于12和15的支持度只有25%而被篩除,得到真正的頻繁2項集,包括13,23,25,35?,F在我們鏈接生成候選頻繁3項集,123, 125,135和235共4組,這部分圖中沒有畫出。通過計算候選頻繁3項集的支持度,我們發現123,125和135的支持度均為25%,因此接著被剪枝,最終得到的真正頻繁3項集為235一組。由于此時我們無法再進行數據連接,進而得到候選頻繁4項集,最終的結果即為頻繁3三項集235。

    4.算法應用
    4.1所應用的數據集介紹
    以超市交易為數據集,所有商品的項集為I = {bread, beer, cake, cream, milk, tea}
    某條交易如Ti = {bread, beer, milk},可以簡化為Ti = {a, b, d}
    data.txt數據集樣本如下
    a, d, e,f
    a, d, e
    c, e
    e, f

    數據集位于本地的D:\data目錄下,數據集一共有270行,前24行的數據內容如圖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''' 直接從數據集構造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''' 生成各個候選集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''' 通過候選集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''' 生成從頻繁集關聯規則分析 ''' 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實現頁面截圖

    圖 4.3.1

    圖4.3.2

    圖4.3.3

    圖4.3.4
    5.總結
    Aprior算法是一個非常經典的頻繁項集的挖掘算法,很多算法都是基于Aprior算法而產生的,包括FP-Tree,GSP, CBA等。這些算法利用了Aprior算法的思想,但是對算法做了改進,數據挖掘效率更好一些,因此現在一般很少直接用Aprior算法來挖掘數據了,但是理解Aprior算法是理解其它Aprior類算法的前提,同時算法本身也不復雜,因此值得好好研究一番。
    這次的收獲主要有以下幾點:同一行數據,最小支持度越小,那么產生的頻繁項集維數越高,程序運行的時間越長;頻繁項集的子集一定是頻繁的,子集頻繁父親一定頻繁;Apriori也存在缺點:第一,在每一步產生候選項目集時循環產生的組合過多,沒有排除不應該參與組合的元素;第二,每次計算項集的支持度時,開銷會隨著數據的增多而成幾何級增長。

    總結

    以上是生活随笔為你收集整理的数据仓库与数据挖掘论文的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。