




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、基于二部图的个性化系统推荐:#include<iostream>#include<fstream>#include<vector>#include<string>#include<vector>#include<algorithm>#include<iomanip>usingnamespacestd;/从TXT中读入数据到矩阵(二维数组)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的评分数据,所以把分数达到3的看作是喜欢,标记为1,小于3的视为/不喜欢,置
3、为0input>>dataij;if(dataij>=3)dataij=1;elsedataij=0;returndata;/把矩阵中的数据写入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;/求两个向量的内积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)的二部图的推荐函数,data是训练数据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;/第二步利用权重矩阵和训练数据集针对每个用户对每一个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数量/推荐的items数量/用户确实喜欢的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进行测试,于是选取与测试集大小一样的预测数据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<<"数据读取中."<<endl;vector<vector
15、<double>>train=txtRead<double>(,row,col);/vector<vector<double>>test=txtRead<double>(,462,1591);cout<<"利用二部图网络进行评分预测."<<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;下面是用户协同过滤核心代码:#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. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 天津市水务事业项目融资的前景研究
- 储值卡采购合同范例
- 2025年地毯、挂毯类工艺品项目合作计划书
- 企业投资个人合同范例
- 二手居民住宅购房合同范例
- pvc塑胶地板合同范例
- 人工草皮转让合同范例
- 信息投资合同范例
- 农村宠物寄养服务合同范例
- 出席开业活动合同范本
- 河南2025年河南职业技术学院招聘30人笔试历年参考题库附带答案详解
- 中国药膳理论与实践-药膳基本理论和技能
- 华东师大版七年级初一数学下册全套试卷(单元、期中、期末)
- 南非醉茄产业发展规划(十四五)
- 复古简约中国古典名著导读三国演义培训PPT模板
- 不锈钢排烟风管施工实施方案
- PMC部门工作流程图
- IPC-4101刚性多层印制线路板的基材规范
- Oracle-EBS模块讲解
- 浆砌条石砖项施工方案
- 带你领略渊海子平
评论
0/150
提交评论