機器學習算法學習---關聯分析算法(一)


Apriori算法

優點:易編碼實現。

缺點:在大數據集上可能較慢。

適用數據:數值型、標稱型。

1、關聯分析

關聯分析尋找的關系可以有兩種形式:頻繁項集或者關聯規則。

頻繁項集:經常出現在一塊的物品的集合;

關聯規則:暗示兩種物品之間可能存在很強的關系。

支持度:數據集中包含該項集的記錄所占的比例。(針對項集)

可信度/置信度:一條關聯規則{A}-->{B},支持度({A,B})/支持度({A})的比值為可信度。(針對關聯規則)

2、Apriori原理

對於包含N種物品的數據集共有2N-1種項集組合。

目的:為了降低所需的計算時間。減少可能感興趣的項集

原理:如果某個項集是頻繁的,那么它的所有子集也是頻繁的;如果一個項集是非頻繁集,那么它的所有超集也是非頻繁的。

3、使用Apriori算法來發現頻繁集

關聯分析的目標:發現頻繁集和發現關聯規則。

頻繁項集的量化指標:滿足最小支持度

算法過程(輸入為最小支持度和數據集):首先會生成所有單個物品的項集列表;接着掃描交易記錄來查看哪些項集滿足最小支持度要求,那些不滿足最小支持度的集合會被去掉;然后對剩下的集合進行組合以生成包含兩個元素的項集;接下來,再重新掃描交易記錄,去掉不滿足最小支持度的項集。該過程重復進行直到所有項集都被去掉。

python實現如下:

獲取頻繁集

 

#輔助函數

def loadDataSet():#創建數據集

return [[1,3,4],[2,3,5],[1,2,3,5],[2,5]]
def createC1(dataSet):#構建集合C1(大小為1的所有候選項集的集合)
C1=[]
for transaction in dataSet:#遍歷交易記錄
for item in transaction:
if not [item] in C1:
C1.append([item])
C1.sort()
return map(frozenset,C1)#對C1中每個項構建一個不變集合
def scanD(D,Ck,minSupport):#從Ck生成Lk
ssCnt={}
for tid in D:
for can in Ck:
if can.issubset(tid):
if not ssCnt.has_key(can):
ssCnt[can]=1
else:
ssCnt[can]+=1
numItems=float(len(D))
retList=[]
supportData={}
for key in ssCnt:
support=ssCnt[key]/numItems
if support>=minSupport:
retList.insert(0,key)
supportData[key]=support
return retList,supportData
#Apriori算法
def aprioriGen(Lk,k):#創建候選項集Ck
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:#前k-2項同,合並;避免產生重復值
retList.append(Lk[i]|Lk[j])
return retList
def apriori(dataSet,minSupport=0.5):#主函數
C1=createC1(dataSet)
D=map(set,dataSet)
L1,supportData=scanD(D,C1,minSupport)
L=[L1]#存儲頻繁項集
k=2
while len(L[k-2])>0:
Ck=aprioriGen(L[k-2],k)
Lk,supK=scanD(D,Ck,minSupport)
supportData.update(supK)
L.append(Lk)
k+=1
return L,supportData

4、從頻繁項集中挖掘關聯規則

關聯規則箭頭左邊的集合稱作前件,箭頭右邊的集合稱為后件。

關聯規則的量化指標:滿足最小可信度

一條規則P->H的可信度:support(P|H)/support(P)

性質屬性:如果某條規則並不滿足最小可信度要求,那么該規則的所有子集(左件的子集)也不會滿足最小可信度要求。

算法過程(分級法):首先從一個頻繁項集開始,接着創建一個規則列表,其中規則右部只包含一個元素,然后對這些規則進行測試;接下來合並所有剩余規則來創建一個新的規則列表,其中規則右部包含兩個元素。

python實現如下:

獲取關聯規則

#關聯規則生成函數

def calcConf(freqSet,H,supportData,br1,minConf=0.7):#規則評估函數

prunedH=[]
for conseq in H:
conf=supportData[freqSet]/supportData[freqSet-conseq]
if conf>=minConf:
print(freqSet-conseq,'-->',conseq,'conf:',conf)
br1.append((freqSet-conseq,conseq,conf))
prunedH.append(conseq)
return prunedH
def rulesFromConseq(freqSet,H,supportData,br1,minConf=0.7):
m=len(H[0])
if len(freqSet)>(m+1):
Hmp1=aprioriGen(H,m+1)
Hmp1=calcConf(freqSet,Hmp1,supportData,br1,minConf)
if len(Hmp1)>1:
rulesFromConseq(freqSet,Hmp1,supportData,br1,minConf)
def generateRules(L,supportData,minConf=0.7):#主函數
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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM