日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

Apriori算法进行关联分析(2)

發(fā)布時(shí)間:2024/9/20 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Apriori算法进行关联分析(2) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

頻繁項(xiàng)集及關(guān)聯(lián)規(guī)則的應(yīng)用中,購(gòu)物、搜索引擎中的查詢?cè)~等,下面看一個(gè)美國(guó)國(guó)會(huì)議員投票的例子。

1. 示例:發(fā)現(xiàn)國(guó)會(huì)投票中的模式

這個(gè)例子雖然在數(shù)據(jù)的獲取過(guò)程中有點(diǎn)復(fù)雜,但我覺(jué)得還是很有必要分析下整個(gè)過(guò)程。

1. 收集數(shù)據(jù):構(gòu)建美國(guó)國(guó)會(huì)投票記錄的事務(wù)數(shù)據(jù)集

我們希望最終數(shù)據(jù)的格式:即每一行代表美國(guó)國(guó)會(huì)的一個(gè)成員,而每列都是他們投票的對(duì)象。

(1)需要提前做的準(zhǔn)備:

  • 安裝python-votesmart
  • 獲得API key(這需要申請(qǐng)自己的key)

    (2)使用相關(guān)的API

  • bills=votesmart.votes.getBillsByStateRecent()獲得最近的100條議案

  • bill.title:獲得議案標(biāo)題 bill.billId:獲得議案ID號(hào)

  • bill=votesmart.votes.getBill(11820)通過(guò)getBill()方法獲得每條議案的更多內(nèi)容,此時(shí)的bill是一個(gè)BillDetail對(duì)象,包含大量的完整信息。

  • bill.actions:查看議案的所有行為,包括議案被提出時(shí)的行為,以及議案在投票時(shí)的行為

  • action.stage和action.actionID:我們所感興趣的是投票時(shí)的行為,所以得到行為的狀態(tài)和其相應(yīng)的ID。

  • voteList=votesmart.votes.getBillActionVotes(),通過(guò)getBillActionVotes()方法獲得某條議案的具體投票信息。其中voteList是一個(gè)包含vote對(duì)象的列表。

(2)為了將billID轉(zhuǎn)化為actionID,并對(duì)actionID進(jìn)行過(guò)濾只保留包含投票數(shù)據(jù)的actionID,這樣得到剩下的議案都是有趣的議案:

# -*- coding: utf-8 -*- """ Created on Thu Nov 09 20:52:41 2017 """from time import sleep from votesmart import votesmart # 此模塊需要單獨(dú)下載votesmart.apikey = 'a7fa40adec6f4a77178799fae4441030' # 這里需要改換成自己的API key # 收集美國(guó)國(guó)會(huì)議案中action ID的函數(shù) def getActionIds():actionIdList = []; billTitleList = []fr = open('recent20bills.txt') for line in fr.readlines():billNum = int(line.split('\t')[0]) # 得到了議案的IDtry:billDetail = votesmart.votes.getBill(billNum) # 得到一個(gè)billDetail對(duì)象for action in billDetail.actions: # 遍歷議案中的所有行為if action.level == 'House' and \(action.stage == 'Passage' or action.stage == 'Amendment Vote'):actionId = int(action.actionId) print 'bill: %d has actionId: %d' % (billNum, actionId)actionIdList.append(actionId)billTitleList.append(line.strip().split('\t')[1])except: # API調(diào)用時(shí)發(fā)生錯(cuò)誤print "problem getting bill %d" % billNumsleep(1) # 禮貌訪問(wèn)網(wǎng)站而做出些延遲,避免過(guò)度訪問(wèn)return actionIdList, billTitleList

此時(shí)得到了有actionID的議案,接下來(lái)可以獲取這些actionID的投票信息。

(3)選舉人可以投是或否的表決票,也可以棄權(quán),需要將上述信息轉(zhuǎn)化為類似于項(xiàng)集或者交易數(shù)據(jù)庫(kù)之類的東西,而一條交易記錄只包含一個(gè)項(xiàng)的出現(xiàn)或者不出現(xiàn),并不包含項(xiàng)出現(xiàn)的次數(shù)。

在使用Apriori之前需要構(gòu)建事務(wù)數(shù)據(jù)庫(kù):首先創(chuàng)建一個(gè)字典,字典中使用政客的名字作為鍵值,然后對(duì)投票進(jìn)行編碼,其對(duì)每條議案使用兩個(gè)條目:bill+’Yea’以及bill+’Nay’。

投票信息到元素項(xiàng)的轉(zhuǎn)換結(jié)果:

下面的函數(shù)就是以actionID串作為輸入并利用votesmart的API來(lái)抓取投票記錄的函數(shù),然后將每個(gè)選舉人的投票轉(zhuǎn)化為一個(gè)項(xiàng)集,每個(gè)選舉人對(duì)應(yīng)于一行或者說(shuō)事物數(shù)據(jù)庫(kù)中的一條記錄。

# 基于投票數(shù)據(jù)的事物列表填充函數(shù) def getTransList(actionIdList, billTitleList): itemMeaning = ['Republican', 'Democratic'] # 創(chuàng)建一個(gè)含義列表for billTitle in billTitleList: # 遍歷所有的議案itemMeaning.append('%s -- Nay' % billTitle) # 在議案標(biāo)題后面添加Nay(反對(duì))itemMeaning.append('%s -- Yea' % billTitle) # 在議案標(biāo)題后添加Yea(同意)transDict = {} # 用于加入元素項(xiàng)voteCount = 2for actionId in actionIdList: # 遍歷getActionIds()返回的每一個(gè)actionIdsleep(3) # 延遲訪問(wèn),防止過(guò)于頻繁的API調(diào)用 print 'getting votes for actionId: %d' % actionIdtry:voteList = votesmart.votes.getBillActionVotes(actionId) # 獲得某個(gè)特定的actionId的所有投票信息for vote in voteList: # 遍歷投票信息if not transDict.has_key(vote.candidateName): # 如果沒(méi)有該政客的名字transDict[vote.candidateName] = [] # 用該政客的名字作為鍵來(lái)填充transDictif vote.officeParties == 'Democratic': # 獲取該政客的政黨信息transDict[vote.candidateName].append(1)elif vote.officeParties == 'Republican':transDict[vote.candidateName].append(0)if vote.action == 'Nay':transDict[vote.candidateName].append(voteCount)elif vote.action == 'Yea':transDict[vote.candidateName].append(voteCount + 1)except: print "problem getting actionId: %d" % actionIdvoteCount += 2return transDict, itemMeaning # 返回事物字典和元素項(xiàng)含義列表

測(cè)試算法,基于投票挖掘關(guān)聯(lián)規(guī)則

dataSet=[transDict[key] for key in transDict.keys() ] L,suppData=apriori(dataSet,0.5) # 得到頻繁項(xiàng)集 rules=generateRules(L,suppData,0.99)

結(jié)果得到:

最后可以基于關(guān)聯(lián)規(guī)則和支持度進(jìn)行分析,解決實(shí)際問(wèn)題。

2. 示例:發(fā)現(xiàn)毒蘑菇的相似特征

有時(shí)我們并不想尋找所有頻繁項(xiàng)集,而只對(duì)包含某個(gè)特定元素項(xiàng)的項(xiàng)集感興趣。在本章這個(gè)最后的例子中,我們會(huì)尋找毒蘑菇中的一些公共特征,利用這些特征就能避免吃到那些有毒的蘑菇。UCI的機(jī)器學(xué)習(xí)數(shù)據(jù)集合中有一個(gè)關(guān)于肋形蘑菇的23種特征的數(shù)據(jù)集,每一個(gè)特征都包含一個(gè)標(biāo)稱數(shù)據(jù)值。我們必須將這些標(biāo)稱值轉(zhuǎn)化為一個(gè)集合,這一點(diǎn)與前面投票例子中的做法類似。幸運(yùn)的是,已經(jīng)有人已經(jīng)做好了這種轉(zhuǎn)換。Roberto Bayardo對(duì)UCI蘑菇數(shù)據(jù)集進(jìn)行了解析,將每個(gè)蘑燕樣本轉(zhuǎn)換成一個(gè)特征集合。其中,枚舉了每個(gè)特征的所有可能值,如果某個(gè)樣本包含特征,那么該特征對(duì)應(yīng)的整數(shù)值被包含數(shù)據(jù)集中。

此時(shí)可以利用Apriori算法尋找包含特征值為2(這里‘2’代表了有毒的特征)的頻繁項(xiàng)集。

代碼:

# 主函數(shù) mushDataSet=[line.split() for line in open ('mushroom.dat').readlines()] L,suppData=apriori(mushDataSet,minSupport = 0.5) print 'L[1]:',L[1] for item in L[1]: # 在單元素頻繁項(xiàng)集中找到包含特征2的頻繁集if item.intersection('2'):print 'item:',item

這里只給出了調(diào)用語(yǔ)句,具體的Apriori算法參考:Apriori算法發(fā)現(xiàn)頻繁集
只需改動(dòng)主函數(shù)語(yǔ)句即可:

運(yùn)行結(jié)果:

L[1]: [frozenset(['59', '85']), frozenset(['63', '85']), frozenset(['86', '34']), frozenset(['76', '86']), frozenset(['59', '34']), frozenset(['24', '85']), frozenset(['39', '85']), frozenset(['39', '86']), frozenset(['86', '59']), frozenset(['86', '53']), frozenset(['2', '85']), frozenset(['86', '36']), frozenset(['24', '90']), frozenset(['39', '36']), frozenset(['53', '85']), frozenset(['63', '86']), frozenset(['86', '85']), frozenset(['24', '34']), frozenset(['36', '34']), frozenset(['90', '85']), frozenset(['39', '34']), frozenset(['67', '34']), frozenset(['90', '63']), frozenset(['76', '34']), frozenset(['76', '85']), frozenset(['86', '67']), frozenset(['53', '34']), frozenset(['90', '86']), frozenset(['90', '36']), frozenset(['59', '36']), frozenset(['90', '53']), frozenset(['63', '36']), frozenset(['90', '59']), frozenset(['24', '86']), frozenset(['90', '39']), frozenset(['36', '85']), frozenset(['85', '34']), frozenset(['63', '34']), frozenset(['85', '67']), frozenset(['90', '34']), frozenset(['63', '59'])] item: frozenset(['2', '85'])

由于這里的支持度閾值較高,并且采用的是較小的項(xiàng)集來(lái)查看特征‘2’,所以得到的項(xiàng)集只有一個(gè)。

通過(guò)觀察這些特征,以便知道了解野蘑菇的那些方面。如果看到其中任何一個(gè)特征,那么這些蘑菇就不要吃了。也即是說(shuō)關(guān)聯(lián)分析就是通過(guò)一個(gè)目標(biāo)特征來(lái)分析得到和其相關(guān)聯(lián)的其他特征,進(jìn)而可以對(duì)其采取措施。

總結(jié)

以上是生活随笔為你收集整理的Apriori算法进行关联分析(2)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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