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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

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

發布時間:2024/9/20 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Apriori算法进行关联分析(2) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

頻繁項集及關聯規則的應用中,購物、搜索引擎中的查詢詞等,下面看一個美國國會議員投票的例子。

1. 示例:發現國會投票中的模式

這個例子雖然在數據的獲取過程中有點復雜,但我覺得還是很有必要分析下整個過程。

1. 收集數據:構建美國國會投票記錄的事務數據集

我們希望最終數據的格式:即每一行代表美國國會的一個成員,而每列都是他們投票的對象。

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

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

    (2)使用相關的API

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

  • bill.title:獲得議案標題 bill.billId:獲得議案ID號

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

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

  • action.stage和action.actionID:我們所感興趣的是投票時的行為,所以得到行為的狀態和其相應的ID。

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

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

# -*- coding: utf-8 -*- """ Created on Thu Nov 09 20:52:41 2017 """from time import sleep from votesmart import votesmart # 此模塊需要單獨下載votesmart.apikey = 'a7fa40adec6f4a77178799fae4441030' # 這里需要改換成自己的API key # 收集美國國會議案中action ID的函數 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) # 得到一個billDetail對象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調用時發生錯誤print "problem getting bill %d" % billNumsleep(1) # 禮貌訪問網站而做出些延遲,避免過度訪問return actionIdList, billTitleList

此時得到了有actionID的議案,接下來可以獲取這些actionID的投票信息。

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

在使用Apriori之前需要構建事務數據庫:首先創建一個字典,字典中使用政客的名字作為鍵值,然后對投票進行編碼,其對每條議案使用兩個條目:bill+’Yea’以及bill+’Nay’。

投票信息到元素項的轉換結果:

下面的函數就是以actionID串作為輸入并利用votesmart的API來抓取投票記錄的函數,然后將每個選舉人的投票轉化為一個項集,每個選舉人對應于一行或者說事物數據庫中的一條記錄。

# 基于投票數據的事物列表填充函數 def getTransList(actionIdList, billTitleList): itemMeaning = ['Republican', 'Democratic'] # 創建一個含義列表for billTitle in billTitleList: # 遍歷所有的議案itemMeaning.append('%s -- Nay' % billTitle) # 在議案標題后面添加Nay(反對)itemMeaning.append('%s -- Yea' % billTitle) # 在議案標題后添加Yea(同意)transDict = {} # 用于加入元素項voteCount = 2for actionId in actionIdList: # 遍歷getActionIds()返回的每一個actionIdsleep(3) # 延遲訪問,防止過于頻繁的API調用 print 'getting votes for actionId: %d' % actionIdtry:voteList = votesmart.votes.getBillActionVotes(actionId) # 獲得某個特定的actionId的所有投票信息for vote in voteList: # 遍歷投票信息if not transDict.has_key(vote.candidateName): # 如果沒有該政客的名字transDict[vote.candidateName] = [] # 用該政客的名字作為鍵來填充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 # 返回事物字典和元素項含義列表

測試算法,基于投票挖掘關聯規則

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

結果得到:

最后可以基于關聯規則和支持度進行分析,解決實際問題。

2. 示例:發現毒蘑菇的相似特征

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

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

代碼:

# 主函數 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]: # 在單元素頻繁項集中找到包含特征2的頻繁集if item.intersection('2'):print 'item:',item

這里只給出了調用語句,具體的Apriori算法參考:Apriori算法發現頻繁集
只需改動主函數語句即可:

運行結果:

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'])

由于這里的支持度閾值較高,并且采用的是較小的項集來查看特征‘2’,所以得到的項集只有一個。

通過觀察這些特征,以便知道了解野蘑菇的那些方面。如果看到其中任何一個特征,那么這些蘑菇就不要吃了。也即是說關聯分析就是通過一個目標特征來分析得到和其相關聯的其他特征,進而可以對其采取措施。

總結

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

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