资源简介
基于邻域推荐算法中,基于物品的协调过滤推荐算法 itemCF 的visual c++ 的实现代码,MovieLens数据集。
代码片段和文件信息
#include “math.h“
#include “string.h“
#include “stdlib.h“
#include “stdio.h“
#include “iostream.h“
#include “time.h“ //使用当前时钟做种子
FILE *fp;
const int usersum = 6040;
const int itemsum = 3952;
const int N = 10;
char datasetfile[100] = “E:\\mytest\\ratings.dat“;
int train[itemsum][usersum]={0}; //训练集合user item rate矩阵
int test[itemsum][usersum]={0}; //测试集合user item rate矩阵
double trainuseritem[usersum][itemsum]={0.0};//训练集合user item 兴趣程度 矩阵
int recommend[usersum][N]={0}; //为每个用户推荐N个物品
struct simi
{
double value; //相似值
int num; //相似物品号
};
simi simiItem[itemsum][itemsum]; //排序后的相似性矩阵
//第一步,拆分数据集为测试集test和训练集train,其中1/m为测试集取不同的k<=m-1值 在相同的随即种子下可得到不同的测/训集合
int SplitData(int m int k);
//寻找数据集每条记录对应的用户号和物品号
int Buf_UIR(char* bufint* user int* item);
double Simility(int* ItemA int* ItemB); //第二步,计算物品之间的相似性,获得物品相似性矩阵
int sort(double* simArr simi* simStruct); //第三步,物品相似性矩阵排序(根据相似性由高到低排序)
double getUserLikeItem(int iint jint k); //第四步,得到用户i对物品j预测兴趣程度,利用k个最近邻来计算
int getRecommend(); //第五步,通过物品兴趣程度,推荐前N个
double Recall(); //第六步,计算召回率、准确率和覆盖率
double Precision();
double Coverage();
double Diversity(double **a);//计算多样性
int main()
{
int ij;
double recallprecisioncoveragediversity;
int k; //去用户的k个最近邻居来计算推荐物品
printf(“请输入取最近邻居做计算的个数:k=“);
scanf(“%d“&k);
//1.初始化数据集
SplitData(81); //随即分配1/8为测试集,其他为训练集
//输出初始化的矩阵
/*
for (i=0;i<5;i++)
{
cout<<“Item“< for (j=0;j<100;j++)
{
cout< }
cout< }
*/
//动态分配内存空间给用物品相似性矩阵
double **itemsim;
itemsim = (double**)malloc(sizeof(double*)*itemsum);
for(i=0; i {
itemsim[i] = (double*)malloc(sizeof(double)*itemsum);
}
//2.计算物品之间相似性,得到相似性矩阵
for (i=0;i {
for (j=0;j {
itemsim[i][j] = Simility(train[i]train[j]);
}
}
//输出物品相似性矩阵
/*
for (i=0;i<5;i++)
{
cout<<“Item“< for (j=0;j<100;j++)
{
cout< }
cout< }
*/
//3.物品相似度由高到低排序
for (i=0;i {
//cout<<“Item“< sort(itemsim[i]simiItem[i]);
//cout< }
//输出排序后的物品相似性矩阵
/*
for(i=0;i<5;i++)
{
cout<<“item“< for(j=0;j<100;j++)
{
cout< }
cout< }
*/
//4.得到用户对物品兴趣程度的矩阵
for(i=0;i {
for(j=0;j {
if(train[j][i]==0) //如果用户i对物品j没有过行为,才计算i对j的预测兴趣程度
trainuseritem[i][j]=getUserLikeItem(ijk);
}
}
//输出用户对物品兴趣的矩阵
/*
for (i=0;i<5;i++)
{
cout<<“User“< for (j=0;j<100;j++)
{
cout< }
cout< }
*/
//5.通过物品兴趣程度,推荐前N个
getRecommend();
//输出推荐矩阵
for (i=0;i<5;i++)
{
cout<<“User“< for (j
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
目录 0 2012-11-25 18:45 Item-CF实验结果\
文件 410624 2012-11-12 13:42 Item-CF实验结果\Item-CF实验结果.doc
文件 588288 2012-11-22 20:47 Item-CF实验结果\ItemCF流程图.doc
目录 0 2012-11-25 18:44 Item-CF实验结果\mytest\
目录 0 2012-11-25 18:44 Item-CF实验结果\mytest\Debug\
文件 282666 2012-11-10 16:21 Item-CF实验结果\mytest\Debug\test1.exe
文件 961300 2012-11-10 16:21 Item-CF实验结果\mytest\Debug\test1.ilk
文件 30862 2012-11-10 17:04 Item-CF实验结果\mytest\Debug\test1.obj
文件 309284 2012-11-10 12:59 Item-CF实验结果\mytest\Debug\test1.pch
文件 730112 2012-11-10 15:23 Item-CF实验结果\mytest\Debug\test1.pdb
文件 9033 2012-10-28 15:35 Item-CF实验结果\mytest\Debug\testfile.obj
文件 214016 2012-11-10 17:04 Item-CF实验结果\mytest\Debug\vc60.idb
文件 94208 2012-11-10 17:04 Item-CF实验结果\mytest\Debug\vc60.pdb
目录 0 2012-11-25 18:44 Item-CF实验结果\mytest\Release\
文件 2016256 2012-11-09 14:10 Item-CF实验结果\mytest\Release\test1.bsc
文件 69632 2012-11-10 18:24 Item-CF实验结果\mytest\Release\test1.exe
文件 11576 2012-11-10 18:24 Item-CF实验结果\mytest\Release\test1.obj
文件 313040 2012-11-10 16:31 Item-CF实验结果\mytest\Release\test1.pch
文件 0 2012-11-09 14:10 Item-CF实验结果\mytest\Release\test1.sbr
文件 50176 2012-11-10 18:24 Item-CF实验结果\mytest\Release\vc60.idb
文件 24594131 2003-02-28 15:53 Item-CF实验结果\mytest\ratings.dat
文件 10252 2012-11-10 17:00 Item-CF实验结果\mytest\test1.cpp
文件 3389 2012-11-10 17:04 Item-CF实验结果\mytest\test1.dsp
文件 516 2012-11-10 18:31 Item-CF实验结果\mytest\test1.dsw
文件 50176 2012-11-23 16:08 Item-CF实验结果\mytest\test1.ncb
文件 48640 2012-11-23 16:08 Item-CF实验结果\mytest\test1.opt
文件 841 2012-11-10 18:24 Item-CF实验结果\mytest\test1.plg
评论
共有 条评论