-
大小: 6KB文件類(lèi)型: .cpp金幣: 1下載: 0 次發(fā)布日期: 2021-06-09
- 語(yǔ)言: C/C++
- 標(biāo)簽: 協(xié)同過(guò)濾??代碼??C++??
資源簡(jiǎn)介
協(xié)同過(guò)濾算法代碼 VS下運(yùn)行 數(shù)據(jù)集采用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的最近鄰居數(shù)
const?int?S=10;????????//USER的最近鄰居數(shù)
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?????}
};
double?rate[USER_SIZE][ITERM_SIZE];????//評(píng)分矩陣
MyPair?nbi[ITERM_SIZE][V];????????????//存放每個(gè)ITERM的最近鄰居
MyPair?nbu[USER_SIZE][S];????????????//存放每個(gè)USER的最近鄰居
double?rate_avg[USER_SIZE];????????????//每個(gè)用戶的平均評(píng)分
//從文件中讀入評(píng)分矩陣
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?< //break;
????????rate[userid-1][itermid-1]=rating;
????????line.clear();
????}
????ifs.close();
????return?0;
}
//計(jì)算每個(gè)用戶的平均評(píng)分
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;
????}
}
//計(jì)算兩個(gè)向量的皮爾森相關(guān)系數(shù)
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;
}
//計(jì)算每個(gè)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
評(píng)論
共有 條評(píng)論