UserCF算法主要流程:
开始输入K(取k个最近邻居)将据集拆分为测试集test和训练集trainuser计算用户之间的相似性,获得用户相似性矩阵usersim用户相似性矩阵排序,获得排好序的用户相似性矩阵simiUser通过k个最近邻,计算用户对物品兴趣程度的矩阵trainuserItem通过物品兴趣程度,推荐前N个计算召回率、准确率和覆盖率结束
主要全局变量:
const int usersum = 6040; //用户总数 const int itemsum =3952; //项目总数
const int N =10; //为用户推荐前N个物品
int trainuser[usersum][itemsum]={0}; //训练集合user item rate矩阵 int test[usersum][itemsum]={0}; //测试集合user item rate矩阵 struct _simi { double value; //相似值 int num; //相似用户号 };
_simi simiUser[usersum][usersum]; //排序后的相似性矩阵 double trainuserItem[usersum][itemsum]={0.0}; // user item 兴趣程度 矩阵 int recommend[usersum][N]={0}; //为每个用户推荐N个物品
拆分数据集函数int SplitData(int m, int k) 主要流程:
将数据集拆分为测试集test和训练集trainuser,其中1/m为测试集,取不同的k<=m-1值 在相同的随即种子下可得到不同的测/训集合
开始打开数据集是否成功打开Y到达文件末尾NN提示“open datasetfile failed”Y寻找数据集每条记录对应的用户号usernum和物品号itemnumNusernum<=usersumtemnum<=itemsumYNrand()%m==kY1←test[usernum-1][itemnum-1]1←trainuser[usernum-1][itemnum-1]关闭文件结束
计算用户之间相似度函数double Simility(int* Ua, int*Ub)主要流程: 计算用户Ua和Ub的相似性,返回值为Ua和Ub的相似度
开始0←comItem(Ua与Ub共有项个数)0.0←simility,0←countUa,0←countUb0←ii