协同过滤算法参考代码

代码有问题,运行出错,寻找解决办法,是不是数据集的错误呢?

#include<iostream>
#include<queue>
#include<cmath>
#include<cassert>
#include<cstdlib>
#include<fstream>
#include<sstream>
#include<vector>
#include<algorithm>

using namespace std;

const int ITERM_SIZE=1682;
const int USER_SIZE=943;
const int V=15; //ITERM的最近邻居数
const int S=10; //USER的最近邻居数

struct MyPair{
int id;
double value;
MyPair(int i=0,double v=0):id(i),value(v){}
};

struct cmp{
bool operator() (const MyPair & obj1,const MyPair & obj2)const{
return obj1.value < obj2.value;
}
};

double rate[USER_SIZE][ITERM_SIZE]; //评分矩阵
MyPair nbi[ITERM_SIZE][V]; //存放每个ITERM的最近邻居
MyPair nbu[USER_SIZE][S]; //存放每个USER的最近邻居
double rate_avg[USER_SIZE]; //每个用户的平均评分

//从文件中读入评分矩阵
int readRate(string filename){
ifstream ifs;
ifs.open(filename.c_str());
if(!ifs){
cerr<<"error:unable to open input file "<<filename<<endl;
return -1;
}
string line;
while(getline(ifs,line)){
string str1,str2,str3;
istringstream strstm(line);
strstm>>str1>>str2>>str3;
int userid=atoi(str1.c_str());
int itermid=atoi(str2.c_str());
double rating=atof(str3.c_str());
rate[userid-1][itermid-1]=rating;
//line.clear();
}
ifs.close();
return 0;
}

//计算每个用户的平均评分
void getAvgRate(){
for(int i=0;i<USER_SIZE;++i){
double sum=0;
for(int j=0;j<ITERM_SIZE;++j)
sum+=rate[i][j];
rate_avg[i]=sum/ITERM_SIZE;
}
}

//计算两个向量的皮尔森相关系数
double getSim(const vector<double> &vec1,const vector<double> &vec2){
int len=vec1.size();
assert(len==vec2.size());
double sum1=0;
double sum2=0;
double sum1_1=0;
double sum2_2=0;
double sum=0;
for(int i=0;i<len;i++){
sum+=vec1[i]*vec2[i];
sum1+=vec1[i];
sum2+=vec2[i];
sum1_1+=vec1[i]*vec1[i];
sum2_2+=vec2[i]*vec2[i];
}
double ex=sum1/len;
double ey=sum2/len;
double ex2=sum1_1/len;
double ey2=sum2_2/len;
double exy=sum/len;
double sdx=sqrt(ex2-ex*ex);
double sdy=sqrt(ey2-ey*ey);
assert(sdx!=0 && sdy!=0);
double sim=(exy-ex*ey)/(sdx*sdy);
return sim;
}

//计算每个ITERM的最近邻
void getNBI(){
for(int i=0;i<ITERM_SIZE;++i){
vector<double> vec1;
priority_queue<MyPair,vector<MyPair>,cmp> neighbour;
for(int k=0;k<USER_SIZE;k++)
vec1.push_back(rate[k][i]);
for(int j=0;j<ITERM_SIZE;j++){
if(i==j)
continue;
vector<double> vec2;
for(int k=0;k<USER_SIZE;k++)
vec2.push_back(rate[k][j]);
double sim=getSim(vec1,vec2);
MyPair p(j,sim);
neighbour.push(p);
}
for(int n=0;n<V;++n){
nbi[i][n]=neighbour.top();
neighbour.pop();
}
}
}

//预测用户对未评分项目的评分值
double getPredict(const vector<double> &user,int index){
double sum1=0;
double sum2=0;
for(int i=0;i<V;++i){
int neib_index=nbi[index][i].id;
double neib_sim=nbi[index][i].value;
sum1+=neib_sim*user[neib_index];
sum2+=fabs(neib_sim);
}
return sum1/sum2;
}

//计算两个用户的相似度
double getUserSim(const vector<double> &user1,const vector<double> &user2){
vector<double> vec1;
vector<double> vec2;
int len=user1.size();
assert(len==user2.size());
for(int i=0;i<len;++i){
if(user1[i]!=0 || user2[i]!=0){
if(user1[i]!=0)
vec1.push_back(user1[i]);
else
vec1.push_back(getPredict(user1,i));
if(user2[i]!=0)
vec2.push_back(user2[i]);
else
vec2.push_back(getPredict(user2,i));
}
}
return getSim(vec1,vec2);
}

//计算每个USER的最近邻
void getNBU(){
for(int i=0;i<USER_SIZE;++i){
vector<double> user1;
priority_queue<MyPair,vector<MyPair>,cmp> neighbour;
for(int k=0;k<ITERM_SIZE;++k)
user1.push_back(rate[i][k]);
for(int j=0;j<USER_SIZE;++j){
if(j==i)
continue;
vector<double> user2;
for(int k=0;k<ITERM_SIZE;++k)
user2.push_back(rate[j][k]);
double sim=getUserSim(user1,user2);
MyPair p(j,sim);
neighbour.push(p);
}
for(int m=0;m<S;++m){
nbu[i][m]=neighbour.top();
neighbour.pop();
}
}
}

//产生推荐,预测某用户对某项目的评分
double predictRate(int user,int iterm){
double sum1=0;
double sum2=0;
for(int i=0;i<S;++i){
int neib_index=nbu[user][i].id;
double neib_sim=nbu[user][i].value;
sum1+=neib_sim*(rate[neib_index][iterm]-rate_avg[neib_index]);
sum2+=fabs(neib_sim);
}
return rate_avg[user]+sum1/sum2;
}

//测试
int main(){
//string file="/home/orisun/DataSet/movie-lens-100k/u.data";
string file="E:\\C++programs1\\ml-100k\\ml-100k\\u.data";
if(readRate(file)!=0){
return -1;
}
getAvgRate();
getNBI();
getNBU();
while(1){
cout<<"please input user index and iterm index which you want predict"<<endl;
int user,iterm;
cin>>user>>iterm;
cout<<predictRate(user,iterm)<<endl;
}
return 0;
}

时间: 2024-11-07 00:33:01

协同过滤算法参考代码的相关文章

基于用户的协同过滤算法

基于用户的协同过滤算法-参考<推荐系统实践>一书,作者:项亮 1 import random 2 import math 3 class UserBasedCF: 4 def __init__(self,datafile = None): 5 self.datafile = datafile 6 self.readData() 7 self.splitData(3,47) 8 def readData(self,datafile = None): 9 """ 10

推荐引擎之Mahout 基于用户协同过滤算法的使用

本文目的: 介绍一种常见推荐算法(用户协同过滤)的使用. 应用场景: XXX项目运行一段时间后,系统中将会存在很多视频信息, 而通常 APP 给用户推送的消息(1-3条/每天), 那么这就需要我们根据用户的行为特征,进行更为有效的推送. 工具介绍:mahout 协同过滤算法的使用 测试代码: /**  *   * 基于用户近邻协同过滤推荐算法,  * 本文目的:针对xxx后续广告推荐算法,提供一些算法模型的参考  *   * @版权所有:来谊金融 版权所有 (c) 2015  * @author

协同过滤算法 R/mapreduce/spark mllib多语言实现

用户电影评分数据集下载 http://grouplens.org/datasets/movielens/ 1) Item-Based,非个性化的,每个人看到的都一样 2) User-Based,个性化的,每个人看到的不一样 对用户的行为分析得到用户的喜好后,可以根据用户的喜好计算相似用户和物品,然后可以基于相似用户或物品进行推荐.这就是协同过滤中的两个分支了,基于用户的和基于物品的协同过滤. 在计算用户之间的相似度时,是将一个用户对所有物品的偏好作为一个向量,而在计算物品之间的相似度时,是将所有

《推荐系统》基于用户和Item的协同过滤算法的分析与实现(Python)

1:协同过滤算法简介 2:协同过滤算法的核心 3:协同过滤算法的应用方式 4:基于用户的协同过滤算法实现 5:基于物品的协同过滤算法实现 一:协同过滤算法简介 关于协同过滤的一个最经典的例子就是看电影,有时候不知道哪一部电影是我们喜欢的或者评分比较高的,那么通常的做法就是问问周围的朋友,看看最近有什么好的电影推荐.在问的时候,都习惯于问跟自己口味差不 多的朋友,这就是协同过滤的核心思想. 协同过滤是在海量数据中挖掘出小部分与你品味类似的用户,在协同过滤中,这些用户成为邻居,然后根据他们喜欢的东西

基于Spark MLlib平台的协同过滤算法---电影推荐系统

基于Spark MLlib平台的协同过滤算法---电影推荐系统 又好一阵子没有写文章了,阿弥陀佛...最近项目中要做理财推荐,所以,回过头来回顾一下协同过滤算法在推荐系统中的应用. 说到推荐系统,大家可能立马会想到协同过滤算法.本文基于Spark MLlib平台实现一个向用户推荐电影的简单应用.其中,主要包括三部分内容: 协同过滤算法概述 基于模型的协同过滤应用---电影推荐 实时推荐架构分析     一.协同过滤算法概述 本人对算法的研究,目前还不是很深入,这里简单的介绍下其工作原理. 通常,

GBDT(Gradient Boosting Decision Tree)算法&amp;协同过滤算法

GBDT(Gradient Boosting Decision Tree)算法参考:http://blog.csdn.net/dark_scope/article/details/24863289 理解机器学习算法:http://blog.csdn.net/dark_scope/article/details/25485893 协同过滤算法:http://blog.csdn.net/dark_scope/article/details/17228643

Spark机器学习(11):协同过滤算法

协同过滤(Collaborative Filtering,CF)算法是一种常用的推荐算法,它的思想就是找出相似的用户或产品,向用户推荐相似的物品,或者把物品推荐给相似的用户.怎样评价用户对商品的偏好?可以有很多方法,如用户对商品的打分.购买.页面停留时间.保存.转发等等.得到了用户对商品的偏好,就可以给用户推荐商品.有两种方法:用户A喜欢物品1,商品2和物品1很相似,于是把物品2推荐给用户A:或者用户A和用户B很类似,B喜欢商品2,就将商品2推荐给用户A.所以协同过滤分为两类:基于用户的协同过滤

spark基于用户的协同过滤算法与坑点,提交job

承接上文: http://blog.csdn.net/wangqi880/article/details/52875524 对了,每台机子的防火墙要关闭哈,不然spark集群启动不起来 前一次,已经把spark的分布式集群布置好了,今天写一个简单的案例来运行.会写一些关于spark的推荐的东西,这里主要有4点,1基于用户协同过滤,2基于物品协同过滤,3基于模型的协同过滤,4基于关联规则的推荐(fp_growth),只写核心代码啊. 基于spark用户协同过滤算法的实现 1用户协同过滤算法 1.1

亚马逊 协同过滤算法 Collaborative filtering

这节课时郭强的三维课.他讲的是MAYA和max .自己对这个也不怎么的感兴趣.而且这个课感觉属于数字媒体.自己对游戏,动画,这些东西一点都不兴趣,比如大一的时候刚开学的时候,张瑞的数字媒体的导论课.还有就是秀霞的动画课,自己记录一下自己的思想我在网上看见了这样一个说法,说的是跟着本科生导师做项目.就比如一个人说的,先找一个APP运行一遍,然后再这个基础上修改,各种的粘贴代码.是继续的做这个项目,还是学一点计算机的基础知识了.开始写算法,亚马逊的协同过滤算法 第一:初次印象,进入一个网站的时候,可