資源描述:
《數(shù)據(jù)挖掘實驗三應用-Apriori-算法挖掘頻繁項集.docx》由會員上傳分享,免費在線閱讀,更多相關內容在教育資源-天天文庫。
1、實驗三、應用Apriori算法挖掘頻繁項集學院計算機科學與軟件學院?實驗目的:(1)熟悉VC++編程工具和Apriori頻繁項集挖掘算法。(2)根據(jù)管理層的需求,確定數(shù)據(jù)挖掘的任務,明確數(shù)據(jù)挖掘的功能,也就是明確要挖掘什么。(3)由確定的數(shù)據(jù)挖掘任務,從實驗一處理后的結果中,采用切塊或切片等聯(lián)機分析處理技術,選擇出挖掘任務相關數(shù)據(jù)。(4)用VC++編程工具編寫Apriori算法的程序,對任務相關數(shù)據(jù)運行Apriori算法,挖掘出所有的頻繁項集。1.寫出實驗報告。?實驗原理:1、Apriori算法Apriori使用一種稱作逐層搜索的迭代方法,k項集用于探索(k+1)項集。首先,通過掃描數(shù)據(jù)
2、庫,累計每個項的計數(shù),并收集滿足最小支持度的項,找出頻繁1項集的集合。該集合記作L1。然后,L1用于找頻繁2項集的集合L2,L2用于找L3,如此下去,直到不能再找到頻繁k項集。找每個Lk需要一次數(shù)據(jù)庫全掃描。2、提高頻繁項集逐層產生的效率Apriori性質:頻繁項集的所有非空子集也必須是頻繁的。三、實驗內容:1、實驗內容在給定的數(shù)據(jù)中提取統(tǒng)一購物籃購買的商品信息,由這些數(shù)據(jù)構成事務數(shù)據(jù)庫D,挖掘其中的頻繁項集L。挖掘頻繁項集的算法描述如下:Apriori算法:使用逐層迭代找出頻繁項集輸入:事務數(shù)據(jù)庫D;最小支持度閾值。輸出:D中的頻繁項集L。(1)L1=find_frequent_1-i
3、temsets(D);//挖掘頻繁1-項集,比較容易(2)for(k=2;Lk-1≠Φ;k++){(3)Ck=apriori_gen(Lk-1,min_sup);//調用apriori_gen方法生成候選頻繁k-項集分為兩步:合并、減枝(4)foreachtransactiont∈D{//掃描事務數(shù)據(jù)庫D(5)Ct=subset(Ck,t);(6)foreachcandidatec∈Ct(7)c.count++;//統(tǒng)計候選頻繁k-項集的計數(shù)(8)}(9)Lk={c∈Ck
4、c.count≥min_sup}//滿足最小支持度的k-項集即為頻繁k-項集(10)}(11)returnL=∪kL
5、k;//合并頻繁k-項集(k>0)算法在根據(jù)頻繁k-1項集生成頻繁K項集過程中要計算頻繁K項集中每個元素的支持度,并計算K項集中每個k-1項子集是否在Fk-1中,上述兩條任何一條不滿足,則刪去這個K項集中的元素。2、實驗過程1、打開試驗用數(shù)據(jù),讀取出同一流水號的商品ID并取前5位,生成以行為單位生成事務數(shù)據(jù)集transitions;2、ind_frequent_1-itemsets生成頻繁一項集for(eachtransactionintransitions){for(eachitemintransaction){oneItemSet;oneItemSet.count++;//對1項集進
6、行計數(shù)}}3、apriori-gen(Lk-1)候選集產生算法Forallitemsetp∈Lk-1doForallitemsetq∈Lk-1doIfp.item1=q.item1,p.item2=q.item2,…,p.itemk-2=q.itemk-2,p.itemk-1!=q.itemk-1thenbeginc=p∞q//p、q合并后任意的Lk-1子集ifhas_infrequent_subset(c,Lk-1)thendeletec//存在c不屬于Lk-1剪枝elseaddctoCkEndReturnCk4、has_infrequent_subset(c,Lk-1)判斷候選集的元
7、素Forall(k-1)-subsetsofcdoIfNot(S∈Lk-1)THENreturnTRUE;ReturnFALSE;1.流程圖4、主要程序代碼1、//產生事務數(shù)據(jù)庫代碼(加注釋)#include#include#include#includeusingnamespacestd;classSales_n{public:stringserial;intmarket;chardate[10];intsn;intid;floatnum;floatprice;};intmain(){//////////打開并
8、創(chuàng)建txt文件//////////////////////////////////charname1[50],name2[50];ifstreaminfile;cout<<"選擇要打開的文件:1019n.txt1020n.txt1021n.txt"<>name1;infile.open(name1,ios::in);/*stringcontents;*/if(infile.fail()){cout<<"error