![個性化服務推薦_第1頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/15/9ca93346-12ef-4abe-a66a-731cb0fb5af7/9ca93346-12ef-4abe-a66a-731cb0fb5af71.gif)
![個性化服務推薦_第2頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/15/9ca93346-12ef-4abe-a66a-731cb0fb5af7/9ca93346-12ef-4abe-a66a-731cb0fb5af72.gif)
![個性化服務推薦_第3頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/15/9ca93346-12ef-4abe-a66a-731cb0fb5af7/9ca93346-12ef-4abe-a66a-731cb0fb5af73.gif)
![個性化服務推薦_第4頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/15/9ca93346-12ef-4abe-a66a-731cb0fb5af7/9ca93346-12ef-4abe-a66a-731cb0fb5af74.gif)
![個性化服務推薦_第5頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/15/9ca93346-12ef-4abe-a66a-731cb0fb5af7/9ca93346-12ef-4abe-a66a-731cb0fb5af75.gif)
版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、基于二部圖的個性化系統(tǒng)推薦:#include<iostream>#include<fstream>#include<vector>#include<string>#include<vector>#include<algorithm>#include<iomanip>usingnamespacestd;/從TXT中讀入數(shù)據(jù)到矩陣(二維數(shù)組)template<typenameT>vector<vector<T>>txtRead(stringrow,intcol)ifstreami
2、nput();if(!input.is_open()cerr<<"notexisting,checkthepath:n"<<<<endl;exit(1);vector<vector<T>>data(row,vector<T>(col,0);for(inti=0;i<row;+i)for(intj=0;j<col;+j)/因為這里針對的情況是用戶只給出對items的喜歡與不喜歡的情況,而movielens/是一個1-5的評分數(shù)據(jù),所以把分數(shù)達到3的看作是喜歡,標記為1,小于3的視為/不喜歡,置
3、為0input>>dataij;if(dataij>=3)dataij=1;elsedataij=0;returndata;/把矩陣中的數(shù)據(jù)寫入TXT文件template<typenameT>voidtxtWrite(vector<vector<T>>Matrix,stringdest)ofstreamoutput(dest);vector<vector<T>>:size_typerow=Matrix.size();vector<T>:size_typecol=Matrix0.size();for(vec
4、tor<vector<T>>:size_typei=0;i<row;+i)for(vector<T>:size_typej=0;j<col;+j)output<<setprecision(3)<<Matrixij<<"t"output<<endl;/求兩個向量的內(nèi)積doubleInnerProduct(std:vector<double>A,std:vector<double>B)doubleres=0;for(std:vector<double&g
5、t;:size_typei=0;i<A.size();+i)res+=Ai*Bi;returnres;/矩陣轉置操作template<typenameT>/vector<vector<T>>Transpose(vector<vector<T>>Matrix)unsignedrow=Matrix.size();unsignedcol=Matrix0.size();vector<vector<T>>Trans(col,vector<T>(row,0);for(unsignedi=0;i<co
6、l;+i)for(unsignedj=0;j<row;+j)Transij=Matrixji;returnTrans;/求一個向量中所有元素的和template<typenameT>TSumVector(vector<T>vec)Tres=0;for(vector<T>:size_typei=0;i<vec.size();+i)res+=veci;returnres;/對一個向量中的元素進行降序排列,返回重排后的元素在原來/向量中的索引boolIsBigger(doublea,doubleb)returna>=b;vector<uns
7、igned>DescendVector(vector<double>vec)vector<double>tmpVec=vec;sort(tmpVec.begin(),tmpVec.end(),IsBigger);vector<unsigned>idx;for(vector<double>:size_typei=0;i<tmpVec.size();+i)for(vector<double>:size_typej=0;j<vec.size();+j)if(tmpVeci=vecj)idx.push_back(j);ret
8、urnidx;基于概率傳播(ProbS)的二部圖的推薦函數(shù),data是訓練數(shù)據(jù)vector<vector<double>>ProbS(vector<vector<double>>data)autorow=data.size();autocol=data0.size();vector<vector<double>>transData=Transpose(data);/第一步利用概率傳播機制計算權重矩陣vector<vector<double>>weights(col,vector<double&
9、gt;(col,0);for(vector<double>:size_typei=0;i<col;+i)for(vector<double>:size_typej=0;j<col;+j)doubledegree=SumVector<double>(transDataj);doublesum=0;for(vector<double>:size_typek=0;k<row;+k)sum+=transDataik*transDatajk/SumVector<double>(datak);if(degree)weightsi
10、j=sum/degree;/第二步利用權重矩陣和訓練數(shù)據(jù)集針對每個用戶對每一個item評分vector<vector<double>>scores(row,vector<double>(col,0);for(vector<double>:size_typei=0;i<row;+i)for(vector<double>:size_typej=0;j<col;+j)/等于0的地方代表useri還木有評價過itemj,需要預測if(0=dataij)scoresij=InnerProduct(weightsj,datai);re
11、turnscores;/計算推薦結果的命中率:推薦的items中用戶確實喜歡的items數(shù)量/推薦的items數(shù)量/用戶確實喜歡的items是由測試集給出,length表示推薦列表最長為多少,這里將測出/推薦列表長度由1已知增加到length過程中,推薦命中率的變化vector<vector<double>>ComputeHitRate(vector<vector<double>>scores,vector<vector<double>>test,unsignedlength)autousersNum=test.size(
12、);autoitemsNum=test0.size();vector<vector<unsigned>>sortedIndex;/因為只是對測試集中的用戶和items進行測試,于是選取與測試集大小一樣的預測數(shù)據(jù)vector<vector<double>>selectedScores(usersNum,vector<double>(itemsNum,0);vector<double>line;for(unsignedi=0;i<usersNum;+i)for(unsignedj=0;j<itemsNum;+j)l
13、ine.push_back(scoresij);sortedIndex.push_back(DescendVector(line);line.clear();/hitRate的第一列存儲推薦列表的長度,第二列存儲對應的命中率vector<vector<double>>hitRate(length);for(unsignedk=1;k<=length;+k)hitRatek-1.push_back(k);doubleCounter=0;for(unsignedi=0;i<usersNum;+i)for(unsignedj=0;j<k;+j)unsigne
14、ditemIndex=sortedIndexij;if(testiitemIndex)+Counter;hitRatek-1.push_back(Counter/(k*usersNum);returnhitRate;intmain()string("data.txt");/string("E:Matlabcoderecommendationsystemdatamovielenstest.txt");introw=10;intcol=10;cout<<"數(shù)據(jù)讀取中."<<endl;vector<vector
15、<double>>train=txtRead<double>(,row,col);/vector<vector<double>>test=txtRead<double>(,462,1591);cout<<"利用二部圖網(wǎng)絡進行評分預測."<<endl;vector<vector<double>>predictScores=ProbS(train);txtWrite(predictScores,"predictScores.txt");/*cou
16、t<<"計算命中率."<<endl;vector<vector<double>>hitRate=ComputeHitRate(predictScores,test,1591);txtWrite(hitRate,"hitRate.txt");cout<<"命中率結果保存完畢!"<<endl;*/return0;下面是用戶協(xié)同過濾核心代碼:#include<iostream>#include<fstream>#include<stdio.
17、h>#include<map>#include<set>#include<vector>#include<cstdlib>#include<cmath>#include<cstring>#include<algorithm>usingnamespacestd;constintMAX=1000;classUserCFprivate:intk,m;/k:themostkpersonsinterestedinthebrandi;m:choosetheformermbrandswhichuseruaremosti
18、nterestedinmap<int,int>userid_id;map<int,int>id_userid;map<int,set<int>>user_brands;map<int,set<int>>id_brands;map<int,set<int>>brand_ids;set<int>brand_all;map<int,set<int>>user_brand_rec;ifstreamfin;ofstreamfout;doublesim_matMAXMAX;t
19、ypedefstructsim_idxdoublesim;intidx;booloperator>(constsim_idx&other)constreturnsim>other.sim;sim_idx;typedefstructbrand_interestdoubleInt;/Int=interestintbrand;booloperator>(constbrand_interest&other)constreturnInt>other.Int;brand_interest;public:UserCF(int_k,int_m):k(_k),m(_m)f
20、in.open("user_brand_m123.txt");fout.open("rec_result_by_m123.txt");if(!fin|!fout)cout<<"cannotopenthefile"<<endl;exit(1);/userid_id,id_userid,user_brands,brand_allintuserid,brandid,i=0;while(fin>>userid>>brandid)if(user_brandsuserid.empty()userid
21、_iduserid=i;id_useridi=userid;i+;user_brandsuserid.insert(brandid);brand_all.insert(brandid);/id_brandsmap<int,set<int>>:iteratorit=user_brands.begin();while(it!=user_brands.end()id_brandsuserid_idit->first=it->second;it+;bzero(sim_mat,0);voidget_sim_mat()get_reverse_table();map<
22、;int,set<int>>:iteratorit=brand_ids.begin();while(it!=brand_ids.end()vector<int>tmp(it->second.begin(),it->second.end();intlen=tmp.size();/foreachbrand,traversealltwopairusers,sim_matincrementfor(inti=0;i<len;i+)for(intj=i+1;j<len;j+)sim_mattmpitmpj+=1;sim_mattmpjtmpi+=1;i
23、t+;intlen=id_userid.size();for(inti=0;i<len;i+)for(intj=0;j<len;j+)sim_matij/=sqrt(user_brandsid_useridi.size()*user_brandsid_useridj.size();sim_matji=sim_matij;cout<<endl;/brand_ids-brand:userid1,userid2,userid3.voidget_reverse_table()map<int,set<int>>:iteratorit=id_brands.b
24、egin();while(it!=id_brands.end()set<int>tmp=it->second;set<int>:iteratorit2=tmp.begin();while(it2!=tmp.end()brand_ids*it2.insert(it->first);it2+;it+;set<int>get_rec_brand_set_by_user(intuserid)/3.1set<int>brand_unused;/*set_difference:finddifferentsetbetweentwoset*funct
25、ion:getbrandsetthatuseridhasneverboughtbefore*/set_difference(brand_all.begin(),brand_all.end(),user_brandsuserid.begin(),user_brandsuserid.end(),inserter(brand_unused,brand_unused.begin();sim_idxsimidx;vector<sim_idx>vec_sim_idx;intlen=userid_id.size();intid=userid_iduserid;for(inti=0;i<le
26、n;i+)simidx.sim=sim_matidi;simidx.idx=i;vec_sim_idx.push_back(simidx);sort(vec_sim_idx.begin(),vec_sim_idx.end(),greater<sim_idx>();/orderbydesc/3.2.1set<int>rec_ids;vector<sim_idx>:iteratorit=vec_sim_idx.begin();for(inti=0;i<k;i+)rec_ids.insert(*it).idx);it+;set<int>rec_b
27、rand;set<int>:iteratoritt=brand_unused.begin();vector<brand_interest>vec_bi;/userid'sinterestleveltowardbrandbrand_interestbi;while(itt!=brand_unused.end()/3.2.2vector<int>newset;/orset<int>newsetset<int>ids=brand_ids*itt;set_intersection(rec_ids.begin(),rec_ids.end
28、(),ids.begin(),ids.end(),inserter(newset,newset.begin();if(newset.empty()itt+;continue;doubleinterest=0.0;intlen=newset.size();for(inti=0;i<len;i+)interest+=sim_matuserid_iduseridnewseti;/3.2.3bi.brand=*itt;bi.Int=interest;vec_bi.push_back(bi);itt+;/while/sort(vec_bi.begin(),vec_bi.end(),greater&
29、lt;brand_interest>();/感謝chenyadong的修改建議,這行代碼要進行添加/3.3for(inti=0;i<m&&i<vec_bi.size();i+)rec_brand.insert(vec_bii.brand);returnrec_brand;voidrecommend()map<int,int>:iteratorit=userid_id.begin();while(it!=userid_id.end()user_brand_recit->first=get_rec_brand_set_by_user(it->
30、;first);it+;/recommendvoidprint()/writerecommendationresult<user,brand>tofilemap<int,set<int>>:iteratorit=user_brand_rec.begin();while(it!=user_brand_rec.end()set<int>tmp=it->second;set<int>:iteratorit2=tmp.begin();while(it2!=tmp.end()fout<<it->first<<
31、""<<*it2<<endl;it2+;it+;/printUserCF()userid_id.clear();user_brands.clear();id_brands.clear();brand_ids.clear();brand_all.clear();user_brand_rec.clear();fin.close();fout.close();intmain(intargc,char*argv)if(argc!=3)cout<<"Usage:./a.outkm"<<endl;exit(1);int
32、k=atoi(argv1);intm=atoi(argv2);UserCFucf(k,m);ucf.get_sim_mat();ucf.recommend();#if1ucf.print();#endifreturn0;下面是計算準確率和召回率代碼:#include<iostream>#include<fstream>#include<map>#include<set>#include<algorithm>usingnamespacestd;intmain()ifstreamfin,fin1;fin.open("rec_re
33、sult_by_m123.txt");fin1.open("user_brand_m4.txt");if(!fin|!fin1)cout<<"cannotopenfile"<<endl;exit(1);map<int,set<int>>fore_user_brands;/recommendationresultmap<int,set<int>>real_user_brands;/realresultintuser,brand;while(fin>>user>
34、;>brand)fore_user_brandsuser.insert(brand);while(fin1>>user>>brand)real_user_brandsuser.insert(brand);doubleprecision=0,recall=0;doublefore_total_brand=0;doublereal_total_brand=0;doubleintersection=0;doubleF=0;map<int,set<int>>:iteratorit=fore_user_brands.begin();map<int,set<int>>:iteratoritt=real_user_brands.begin();while(it!=fore_user_brands.end()fore_total_
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 企業(yè)帶貨主播合同范本
- 包回本合同范例
- 2025年現(xiàn)場壁掛式積算器行業(yè)深度研究分析報告
- 2025年1-7月重大項目建設推進情況報告,基本情況 主要措施 存在問題 下
- 2025年中國電機啟動器市場前景預測及行業(yè)投資潛力預測報告
- 2025年太陽能電力設備項目可行性研究報告
- 2025年度多式聯(lián)運貨物運輸代理合同-@-1
- 2024年生態(tài)保護市場發(fā)展前景預測及投資戰(zhàn)略咨詢報告
- 2025年度新型建筑節(jié)能材料采購簡易合同模板
- 2020-2025年中國新能源汽車連接器行業(yè)市場前景預測及投資戰(zhàn)略研究報告
- 學校保潔服務投標方案(技術標)
- 《社區(qū)工作者培訓課件 新浪版》
- 教育信息化背景下的學術研究趨勢
- 人教版小學數(shù)學(2024)一年級下冊第五單元100以內(nèi)的筆算加、減法綜合素養(yǎng)測評 B卷(含答案)
- 2024年度體育賽事贊助合同:運動員代言與贊助權益2篇
- 智研咨詢發(fā)布:2024年中國新疫苗行業(yè)市場現(xiàn)狀、發(fā)展概況、未來前景分析報告
- 2025屆西藏林芝一中高三第二次診斷性檢測英語試卷含解析
- 中國傳統(tǒng)文化非遺文化中國剪紙介紹2
- 藥企銷售總經(jīng)理競聘
- 開封市第一屆職業(yè)技能大賽健康照護項目技術文件(國賽)
- 公路電子收費系統(tǒng)安裝合同范本
評論
0/150
提交評論