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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

数据挖掘Apriori算法

發(fā)布時(shí)間:2025/4/16 编程问答 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据挖掘Apriori算法 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

數(shù)據(jù)挖掘Apriori算法

數(shù)據(jù)挖掘(Data Mining)就是從大量的、不完全的、有噪聲的、模糊的、隨機(jī)的實(shí)際應(yīng)用數(shù)據(jù)中,提取隱含在其中的、人們事先不知道的、但又是潛在有用的信息和知識(shí)的過程。挖掘的原始數(shù)據(jù)可以是結(jié)構(gòu)化的,如關(guān)系數(shù)據(jù)庫(kù)中的數(shù)據(jù);也可以是半結(jié)構(gòu)化的,如文本、圖形和圖像數(shù)據(jù);甚至是分布在網(wǎng)絡(luò)上的異構(gòu)型數(shù)據(jù)。

數(shù)據(jù)挖掘的幾種主要形式:

規(guī)則挖掘:?

如果一個(gè)事務(wù)中含有X,則該事務(wù)中很可能含有Y。具體形式為{X}→{Y},即通常可以描述為:當(dāng)一個(gè)事務(wù)中顧客購(gòu)買了一樣?xùn)|西{啤酒}(這里X=“啤酒”)則很可能他同時(shí)還購(gòu)買了{(lán)尿布}(這里Y= "尿布"),這就是關(guān)聯(lián)規(guī)則。

Apriori算法描述

Apriori算法采用的方法:首先產(chǎn)生頻繁1項(xiàng)集L1,然后用L1經(jīng)過自連接、剪枝生成L2(頻繁2-項(xiàng)集),然后L2有生成L3,依次迭代直到無(wú)法生成新的頻繁項(xiàng)集為止。然后根據(jù)給定的最小可信度,利用生成的頻繁項(xiàng)集產(chǎn)生強(qiáng)關(guān)聯(lián)規(guī)則。


第一階段:產(chǎn)生頻繁項(xiàng)集 該過程通過以下步驟實(shí)現(xiàn):

(1)所有單獨(dú)的項(xiàng)都是候選項(xiàng)集C1。任何支持度值比給定的最小支持度小的項(xiàng)都將從候選項(xiàng)集C1中剔除,形成頻繁1-項(xiàng)集L1。

(2)兩個(gè)通過自連接形成具有2個(gè)項(xiàng)的候選項(xiàng)集。通過再次掃描數(shù)據(jù)庫(kù)確定這些候選項(xiàng)的支持度。保留大于之前設(shè)定的最小支持度閾值的候選項(xiàng),形成頻繁2-項(xiàng)集。

(3)下一步形成含有3個(gè)項(xiàng)的候選項(xiàng)集C3,重復(fù)之前的操作直到無(wú)法生成新的頻繁項(xiàng)集為止。



代碼描述

# -*- coding: utf-8 -*- """ Apriori exercise. Created on Fri Nov 27 11:09:03 2015 @author: alexChen """ def loadDataSet():'''創(chuàng)建一個(gè)用于測(cè)試的簡(jiǎn)單的數(shù)據(jù)集'''return [ [ 1, 3, 4 ], [ 2, 3, 5 ], [ 1, 2, 3, 5 ], [ 2, 5 ] ] def createC1( dataSet ):'''構(gòu)建初始候選項(xiàng)集的列表,即所有候選項(xiàng)集只包含一個(gè)元素,C1是大小為1的所有候選項(xiàng)集的集合'''C1 = []for transaction in dataSet:for item in transaction:if [ item ] not in C1:C1.append( [ item ] )C1.sort()return map( frozenset, C1 ) def scanD( D, Ck, minSupport ):'''計(jì)算Ck中的項(xiàng)集在數(shù)據(jù)集合D(記錄或者transactions)中的支持度,返回滿足最小支持度的項(xiàng)集的集合,和所有項(xiàng)集支持度信息的字典。'''ssCnt = {}for tid in D:# 對(duì)于每一條transactionfor can in Ck:# 對(duì)于每一個(gè)候選項(xiàng)集can,檢查是否是transaction的一部分# 即該候選can是否得到transaction的支持if can.issubset( tid ):ssCnt[ can ] = ssCnt.get( can, 0) + 1numItems = float( len( D ) )retList = []supportData = {}for key in ssCnt:# 每個(gè)項(xiàng)集的支持度support = ssCnt[ key ] / numItems# 將滿足最小支持度的項(xiàng)集,加入retListif support >= minSupport:retList.insert( 0, key )# 匯總支持度數(shù)據(jù)supportData[ key ] = supportreturn retList, supportData if __name__ == '__main__':# 導(dǎo)入數(shù)據(jù)集myDat = loadDataSet()# 構(gòu)建第一個(gè)候選項(xiàng)集列表C1C1 = createC1( myDat )# 構(gòu)建集合表示的數(shù)據(jù)集 DD = map( set, myDat )# 選擇出支持度不小于0.5 的項(xiàng)集作為頻繁項(xiàng)集L, suppData = scanD( D, C1, 0.5 )print u"頻繁項(xiàng)集L:", Lprint u"所有候選項(xiàng)集的支持度信息:", suppData# Aprior算法 def aprioriGen( Lk, k ):'''由初始候選項(xiàng)集的集合Lk生成新的生成候選項(xiàng)集,k表示生成的新項(xiàng)集中所含有的元素個(gè)數(shù)'''retList = []lenLk = len( Lk )for i in range( lenLk ):for j in range( i + 1, lenLk ):L1 = list( Lk[ i ] )[ : k - 2 ];L2 = list( Lk[ j ] )[ : k - 2 ];L1.sort();L2.sort()if L1 == L2:retList.append( Lk[ i ] | Lk[ j ] )return retList def apriori( dataSet, minSupport = 0.5 ):# 構(gòu)建初始候選項(xiàng)集C1C1 = createC1( dataSet )# 將dataSet集合化,以滿足scanD的格式要求D = map( set, dataSet )# 構(gòu)建初始的頻繁項(xiàng)集,即所有項(xiàng)集只有一個(gè)元素L1, suppData = scanD( D, C1, minSupport )L = [ L1 ]# 最初的L1中的每個(gè)項(xiàng)集含有一個(gè)元素,新生成的# 項(xiàng)集應(yīng)該含有2個(gè)元素,所以 k=2k = 2while ( len( L[ k - 2 ] ) > 0 ):Ck = aprioriGen( L[ k - 2 ], k )Lk, supK = scanD( D, Ck, minSupport )# 將新的項(xiàng)集的支持度數(shù)據(jù)加入原來(lái)的總支持度字典中suppData.update( supK )# 將符合最小支持度要求的項(xiàng)集加入LL.append( Lk )# 新生成的項(xiàng)集中的元素個(gè)數(shù)應(yīng)不斷增加k += 1# 返回所有滿足條件的頻繁項(xiàng)集的列表,和所有候選項(xiàng)集的支持度信息return L, suppData

第二階段:產(chǎn)生關(guān)聯(lián)規(guī)則

從事務(wù)數(shù)據(jù)庫(kù) D 中挖掘出頻繁所有的頻繁項(xiàng)集后,就可以比較容易的獲得相應(yīng)的關(guān)聯(lián)規(guī)則,即滿足可信度> min_conf 的頻繁項(xiàng)集產(chǎn)生強(qiáng)關(guān)聯(lián)規(guī)則。由于規(guī)則是由頻繁項(xiàng)集產(chǎn)生,所以每個(gè)規(guī)則自動(dòng)滿足最小支持度min_sup。使用頻繁項(xiàng)集X生成關(guān)聯(lián)規(guī)則。

代碼描述如下:

# 規(guī)則生成與評(píng)價(jià) def calcConf( freqSet, H, supportData, brl, minConf=0.7 ):'''計(jì)算規(guī)則的可信度,返回滿足最小可信度的規(guī)則。freqSet(frozenset):頻繁項(xiàng)集H(frozenset):頻繁項(xiàng)集中所有的元素supportData(dic):頻繁項(xiàng)集中所有元素的支持度brl(tuple):滿足可信度條件的關(guān)聯(lián)規(guī)則minConf(float):最小可信度'''prunedH = []for conseq in H:conf = supportData[ freqSet ] / supportData[ freqSet - conseq ]if conf >= minConf:print freqSet - conseq, '-->', conseq, 'conf:', confbrl.append( ( freqSet - conseq, conseq, conf ) )prunedH.append( conseq )return prunedH def rulesFromConseq( freqSet, H, supportData, brl, minConf=0.7 ):'''對(duì)頻繁項(xiàng)集中元素超過2的項(xiàng)集進(jìn)行合并。freqSet(frozenset):頻繁項(xiàng)集H(frozenset):頻繁項(xiàng)集中的所有元素,即可以出現(xiàn)在規(guī)則右部的元素supportData(dict):所有項(xiàng)集的支持度信息brl(tuple):生成的規(guī)則'''m = len( H[ 0 ] )# 查看頻繁項(xiàng)集是否大到移除大小為 m 的子集if len( freqSet ) > m + 1:Hmp1 = aprioriGen( H, m + 1 )Hmp1 = calcConf( freqSet, Hmp1, supportData, brl, minConf )# 如果不止一條規(guī)則滿足要求,進(jìn)一步遞歸合并if len( Hmp1 ) > 1:rulesFromConseq( freqSet, Hmp1, supportData, brl, minConf ) def generateRules( L, supportData, minConf=0.7 ):'''根據(jù)頻繁項(xiàng)集和最小可信度生成規(guī)則。L(list):存儲(chǔ)頻繁項(xiàng)集supportData(dict):存儲(chǔ)著所有項(xiàng)集(不僅僅是頻繁項(xiàng)集)的支持度minConf(float):最小可信度'''bigRuleList = []for i in range( 1, len( L ) ):for freqSet in L[ i ]:# 對(duì)于每一個(gè)頻繁項(xiàng)集的集合freqSetH1 = [ frozenset( [ item ] ) for item in freqSet ]# 如果頻繁項(xiàng)集中的元素個(gè)數(shù)大于2,需要進(jìn)一步合并if i > 1:rulesFromConseq( freqSet, H1, supportData, bigRuleList, minConf )else:calcConf( freqSet, H1, supportData, bigRuleList, minConf )return bigRuleList


第三階段,測(cè)試:


if __name__ == '__main__':# 導(dǎo)入數(shù)據(jù)集myDat = loadDataSet()# 選擇頻繁項(xiàng)集L, suppData = apriori( myDat, 0.5 )rules = generateRules( L, suppData, minConf=0.7 )print 'rules:\n', rules




總結(jié)

以上是生活随笔為你收集整理的数据挖掘Apriori算法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。