python使用Apriori算法進(jìn)行關(guān)聯(lián)性解析
從大規(guī)模數(shù)據(jù)集中尋找物品間的隱含關(guān)系被稱作關(guān)聯(lián)分析或關(guān)聯(lián)規(guī)則學(xué)習(xí)。過(guò)程分為兩步:1.提取頻繁項(xiàng)集。2.從頻繁項(xiàng)集中抽取出關(guān)聯(lián)規(guī)則。
頻繁項(xiàng)集是指經(jīng)常出現(xiàn)在一塊的物品的集合。
關(guān)聯(lián)規(guī)則是暗示兩種物品之間可能存在很強(qiáng)的關(guān)系。
一個(gè)項(xiàng)集的支持度被定義為數(shù)據(jù)集中包含該項(xiàng)集的記錄所占的比例,用來(lái)表示項(xiàng)集的頻繁程度。支持度定義在項(xiàng)集上。
可信度或置信度是針對(duì)一條諸如{尿布}->{葡萄酒}的關(guān)聯(lián)規(guī)則來(lái)定義的。這條規(guī)則的可信度被定義為“支持度({尿布,葡萄酒})/支持度({尿布})”。
尋找頻繁項(xiàng)集
Apriori原理:如果某個(gè)項(xiàng)集是頻繁的,那么它的所有子集也是頻繁的。反過(guò)來(lái),如果一個(gè)項(xiàng)集是非頻繁項(xiàng)集,那么它的所有超集也是非頻繁的。
Apriori算法是發(fā)現(xiàn)頻繁項(xiàng)集的方法。該算法首先生成所有單個(gè)物品的項(xiàng)集列表,接著掃描交易記錄來(lái)查看哪些項(xiàng)集滿足最小支持度要求,那些不滿足最小支持度的項(xiàng)集會(huì)被去除掉。然后對(duì)剩下來(lái)的集合進(jìn)行組合以生成包含兩個(gè)元素的項(xiàng)集。接下來(lái)重新掃描交易記錄,去掉不滿足最小支持度的項(xiàng)集,該過(guò)程重復(fù)進(jìn)行直到所有項(xiàng)集都被去掉。
Apriori偽代碼
當(dāng)列表中項(xiàng)的個(gè)數(shù)大于0時(shí):
檢查數(shù)據(jù)以確認(rèn)每個(gè)項(xiàng)集都是頻繁的
保留頻繁項(xiàng)集并構(gòu)建k+1項(xiàng)組成的候選項(xiàng)集的列表
從頻繁項(xiàng)集中挖掘關(guān)聯(lián)規(guī)則
當(dāng)可信度大于最小可信度時(shí),可以認(rèn)為是含有關(guān)聯(lián)規(guī)則的??梢杂^察到,如果某條規(guī)則不滿足最小可信度要求,那么該規(guī)則的所有子集也不會(huì)滿足最小可信度要求。
可以首先從一個(gè)頻繁項(xiàng)集開(kāi)始,接著創(chuàng)建一個(gè)規(guī)則列表,其中規(guī)則右部只包含一個(gè)元素,然后對(duì)這些規(guī)則進(jìn)行測(cè)試,接下來(lái)合并,通過(guò)合并所有剩余規(guī)則右部來(lái)創(chuàng)建新的規(guī)則列表,其中規(guī)則右部包含兩個(gè)元素,以此類推。
每個(gè)頻繁項(xiàng)集:
while(len(L)>1)
(k規(guī)則列表)
滿足最小置信度
創(chuàng)建k+1規(guī)則
整體代碼:
import numpy as np def loadDataSet(): return [[1, 3, 4], [2, 3, 5], [1, 2, 3, 5], [2, 5]] def createC1(dateSet): c1 = [] for line in dateSet: for item in line: if not [item] in c1: c1.append([item]) c1.sort() return list(map(frozenset,c1)) def scanData(data,ck,minSupport):#尋找滿足最小支持度的項(xiàng)集 ssCnt = {} for tid in data: for can in ck: if can.issubset(tid): if can not in ssCnt.keys(): ssCnt[can] = 0 ssCnt[can] += 1 numItems = len(data) retList = [] supportData = {} for key in ssCnt.keys(): support = ssCnt[key]/numItems if support >= minSupport: retList.append(key) supportData[key] = support return retList,supportData def aprioriGen(Lk,k): #根據(jù)k-1項(xiàng)集生成k項(xiàng)集 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):#生成頻繁項(xiàng)集 c1 = createC1(dataSet) D = list(map(set,dataSet)) l1,supportData = scanData(D,c1,minSupport) L = [l1] k = 2 while(len(L[k-2])>0): ck = aprioriGen(L[k-2],k) lk,supk = scanData(D,ck,minSupport) k = k + 1 L.append(lk) supportData.update(supk) return L,supportData def generaterRules(L,supportData,minConf=0.7):#生成規(guī)則 bigRuleList = [] for i in range(1,len(L)): for freqSet in L[i]: H1 = [frozenset([item]) for item in freqSet] if i>1: rulesFromConseq(freqSet,H1,supportData,bigRuleList,minConf) else: calcConf(freqSet,H1,supportData,bigRuleList,minConf) return bigRuleList def calcConf(freqSet,H,suppurtData,brl,minConf = 0.7):#計(jì)算滿足置信度的規(guī)則 prunedH = [] for conseq in H: conf = suppurtData[freqSet]/suppurtData[freqSet-conseq] if conf > minConf: brl.append((freqSet-conseq,conseq,conf)) prunedH.append(conseq) return prunedH def rulesFromConseq(freqSet,H,supportData,brl,minConf=0.7):#遞歸生成規(guī)則 m = len(H[0]) if len(freqSet)>=(m+1): Hmp1 = calcConf(freqSet,H,supportData,brl,minConf) if (len(Hmp1) > 1): Hmp1 = aprioriGen(Hmp1,m+1) rulesFromConseq(freqSet,Hmp1,supportData,brl,minConf) data = [line.split() for line in open('mushroom.dat').readlines()] L,support = apriori(data,minSupport=0.3) for i in range(len(L)): for item in L[i]: if item & {'2'}: print(item)
代碼及數(shù)據(jù)集下載:Apriori
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Python時(shí)間戳與日期格式之間相互轉(zhuǎn)化的詳細(xì)教程
java默認(rèn)精度是毫秒級(jí)別的,生成的時(shí)間戳是13位,而python默認(rèn)是10位的,精度是秒,下面這篇文章主要給大家介紹了關(guān)于Python時(shí)間戳與日期格式之間相互轉(zhuǎn)化的相關(guān)資料,需要的朋友可以參考下2022-08-08Django使用paginator插件實(shí)現(xiàn)翻頁(yè)功能的實(shí)例
今天小編就為大家分享一篇關(guān)于Django使用paginator插件實(shí)現(xiàn)翻頁(yè)功能的實(shí)例,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-10-10使用python創(chuàng)建極坐標(biāo)平面的示例代碼
PolarPlane 是 Manim(一個(gè)用于數(shù)學(xué)動(dòng)畫(huà)的Python庫(kù))中的一個(gè)類,用于創(chuàng)建極坐標(biāo)平面,與笛卡爾坐標(biāo)系不同,極坐標(biāo)系是基于角度和半徑來(lái)定位點(diǎn)的,本文就給大家介紹如何用python創(chuàng)建極坐標(biāo)平面,需要的朋友可以參考下2024-08-08python如何實(shí)現(xiàn)質(zhì)數(shù)求和
這篇文章主要介紹了python如何實(shí)現(xiàn)質(zhì)數(shù)求和,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05pytorch VGG11識(shí)別cifar10數(shù)據(jù)集(訓(xùn)練+預(yù)測(cè)單張輸入圖片操作)
這篇文章主要介紹了pytorch VGG11識(shí)別cifar10數(shù)據(jù)集(訓(xùn)練+預(yù)測(cè)單張輸入圖片操作),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-06-06python使用KNN算法識(shí)別手寫(xiě)數(shù)字
這篇文章主要為大家詳細(xì)介紹了python使用KNN算法識(shí)別手寫(xiě)數(shù)字,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-04-04關(guān)于PyQt5中QtGui.QImage圖片顯示問(wèn)題解析
PyQt作為Qt語(yǔ)言的Python擴(kuò)展,可以用來(lái)方便快速的開(kāi)發(fā)界面應(yīng)用,本文重點(diǎn)給大家介紹PyQt5中的QtGui.QImage圖片顯示問(wèn)題分析,需要的朋友可以參考下2022-03-03