协同过滤之ItemCF(c++实现)
来源:互联网 发布:淘宝上卖什么最赚钱 编辑:程序博客网 时间:2024/06/05 08:12
ItemCF认为一个人会喜欢和他以前喜欢的东西相似的东西.
通常情况下,ItemCF算法可归纳为如下三个步骤:
1、计算用户曾经评过分的每一个物品与当前物品的相似度;
2、从用户曾经评过分的物品中,选出与当前物品相似度最高的k个作为当
前物品的邻居;
3、利用邻居物品评分的加权平均值来预测用户对当前物品的评分
代码如下:
#include<iostream>#include<algorithm>using namespace std;#define K 2class U_I{public:U_I::U_I(){M=5;N=5;no=0;}int GetM(){return M;}int GetN(){return N;}int GetR(){return R;}int GetC(){return C;}double Getsim(){return sim;}double Getindex(){return index;}int Getno(){return no;}void Setno(int n){no=n;};void Setsim(double s){sim=s;}void Setindex(int i){index=i;}void Init_a(){a=new int[GetM()*GetN()];} //初始化矩阵指针void Getarr(); //输出矩阵void Init_arr(); //初始化矩阵int C_(int); //获取需要计算相似度的列double Sim_fengzi(int);double Sim_fengmu(int);double Sim(double,double);void Get_sim_index(U_I); //输出 sim:indexvoid Get_score(U_I); //输出最终评分private:int *a;int no; <span style="font-family: Arial, Helvetica, sans-serif;">//no记录需要计算多少个项目的相似度</span>int M;int N;int index;double sim;static const int R=2;static const int C=3;}arr[10];void U_I::Getarr(){for(int i=0;i<M*N;++i){cout<<'\t'<<a[i];if((i+1)%5==0&&i!=0)cout<<endl;}}void U_I::Init_arr(){a[0]=0,a[1]=4,a[2]=5,a[3]=2,a[4]=5;a[5]=0,a[6]=2,a[7]=4,a[8]=4,a[9]=3;a[10]=5,a[11]=3,a[12]=2,a[13]=0,a[14]=5;a[15]=2,a[16]=4,a[17]=0,a[18]=1,a[19]=1;a[20]=3,a[21]=0,a[22]=3,a[23]=4,a[24]=0;}int U_I::C_(int i){if(a[R*M+i]!=0)return i;elsereturn -1;}double U_I::Sim_fengzi(int c){double s1=0; for(int i=0,j=0;i<M*N&&j<N;i=i+5) { if(*(a+c+i)==0||*(a+C+i)==0) continue; else {s1+=*(a+c+i)**(a+C+i); ++j;}} cout<<"分子:"<<s1<<endl; return s1; }double U_I::Sim_fengmu(int c){double s2=0,s3=0; for(int i=0,j=0;i<M*N&&j<N;i=i+5) { if(*(a+c+i)==0||*(a+C+i)==0) continue; else {++j;s2+=*(a+c+i)**(a+c+i); s3+=*(a+C+i)**(a+C+i);}} cout<<"分母:"<<sqrt(s2)*sqrt(s3)<<endl; return sqrt(s2)*sqrt(s3); }double U_I::Sim(double s1,double s2){return s1/s2;}bool cmp (U_I s1,U_I s2) { return s1.Getsim()>s2.Getsim(); }void U_I::Get_sim_index(U_I u){cout<<"排序后的相似性及索引位置如下:"<<endl;for(int i=0;i<u.Getno();++i) { cout<<arr[i].sim<<":"<<arr[i].index<<endl; } }void U_I::Get_score(U_I u){double s=0,ss=0;for(int i=0;i<K;++i) { s+=arr[i].sim*a[arr[i].index+u.GetR()*u.GetM()]; ss+=arr[i].sim; } cout<<"评分为:"<<s/ss<<endl;}int main(){int c; double simi;// U_I arr[10];U_I u;u.Init_a();u.Init_arr();u.Getarr();for(int i=0;i<u.GetM();++i){c=u.C_(i);if(c!=-1){u.Setno(u.Getno()+1);;simi=u.Sim(u.Sim_fengzi(c),u.Sim_fengmu(c));arr[i].Setsim(simi);arr[i].Getsim();arr[i].Setindex(c);arr[i].Getindex();// cout<<"sim:"<<u.sim<<" index:"<<u.index<<endl;}}sort(arr,arr+u.Getno()+1,cmp);u.Get_sim_index(u);/*cout<<"排序后的相似性及索引位置如下:"<<endl; for(int i=0;i<no;++i) { cout<<arr[i].Getsim()<<":"<<arr[i].Getindex()<<endl; } */u.Get_score(u);return 0; return 0;}
0 0
- 协同过滤之ItemCF(c++实现)
- 基于物品的协同过滤ItemCF的mapreduce实现
- 基于物品的协同过滤ItemCF的mapreduce实现
- mapreduce实现ItemCF——基于物品的协同过滤
- Hadoop案例之基于物品的协同过滤算法ItemCF
- itemCF 基于物品的协同过滤
- 协同过滤:基于用户的协同过滤itemCF
- 协同过滤之UserCF(c++实现)
- 基于物品的协同过滤算法itemCF原理及python代码实现
- [推荐算法]ItemCF,基于物品的协同过滤算法
- Mahout分布式程序开发 基于物品的协同过滤ItemCF
- [推荐算法]ItemCF,基于物品的协同过滤算法
- [推荐算法]ItemCF,基于物品的协同过滤算法
- [推荐算法]ItemCF,基于物品的协同过滤算法
- [推荐算法]ItemCF,基于物品的协同过滤算法
- [推荐算法]ItemCF,基于物品的协同过滤算法
- 推荐系统之协同过滤实现
- Hadoop 实现协同过滤算法(1)
- Oracle DB 11.2.0.4 中SYS.ALL_CONSTRAINTS的定义 和 SYS.ALL_CONS_COLUMNS的定义
- [LeetCode] Excel Sheet Column Number
- sqlserver检查死锁的sql
- ArcGIS创建发布地图服务
- Mongodb2.8的版本升级(从2.4升级到2.8)
- 协同过滤之ItemCF(c++实现)
- Swift语言IOS8开发战记1.Button与Alert
- zookeeper原理
- js源码收集
- 关于微信突然停止WeixinJSBridge的接口暂时解决办法
- 知道前序遍历和中序遍历编写程序得到二叉树
- java 操作zookeeper 查看状态
- tcp 3秒 timeout
- Linux - 如何查看USB设备信息