• 大小: 6KB
    文件类型: .cpp
    金币: 1
    下载: 0 次
    发布日期: 2021-06-09
  • 语言: C/C++
  • 标签: 协同过滤  代码  C++  

资源简介

协同过滤算法代码 VS下运行 数据集采用MovieLens

资源截图

代码片段和文件信息

#include
#include
#include
#include
#include
#include
#include
#include
#include
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=0double v=0):id(i)value(v){}
};

struct cmp{
    bool operator() (const MyPair & obj1const 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){
        cout<<“error:unable to open input file “<        return -1;
    }
    string line;
    while(getline(ifsline)){
        string str1str2str3;
        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());
//cout << str1<<“ “< //break;
        rate[userid-1][itermid-1]=rating;
        line.clear();
    }
    ifs.close();
    return 0;
}

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

//计算两个向量的皮尔森相关系数
double getSim(const vector &vec1const vector &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        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        vector vec1;
        priority_queuecmp> neighbour;
        for(int k=0;k            vec1.push_back(rate[k][i]);
        for(int j=0;j            if(i==j)
                continue;
            vector vec2;
            for(int k=0;k                ve

评论

共有 条评论