《大数据计算及应用》
【推荐系统】实验报告
目录
《大数据计算及应用》 1
【推荐系统】实验报告 1
【实验相关统计信息】 1
(1)统计用户数量:19835。 1
【实验原理】 2
1、 找到与目标用户A相似的用户群体 2
【关键部分代码解析】 6
(1) 前期准备 6
(2) 读取数据 6
(4) 将Data矩阵的数据转成Pearson系数矩阵 8
(5) 求用户A和用户B的Pearson相似度 8
(6) 最后产品得分中的bxi的值 9
(7) 最后产品得分中的rxi的值 11
(8) 预测目标用户对目标电影的终极打分 12
(10) Main()函数中一些必须执行的步骤 14
【结果分析】 15
(1) 本实验最终测试RMSE结果约为23。 15

【实验相关统计信息】
(1)统计用户数量:19835。
(2)统计所有产品的得分平均值:49.545。
(3)统计每个用户看过的电影数目,在读取数据时将其存入数组int MovieNum[19835];中。
(4)统计计算Pearson系数需要的数据,存在Pearson矩阵中。
【实验原理】
核心算法:基于用户的协同过滤

如果已知用户A喜欢《蜘蛛侠》、《奇异博士》、《美国队长》、《绿巨人》等漫威超级英雄系列电影,另外用户B也都喜欢这些电影,此外B还喜欢《钢铁侠》,则A很有可能也喜欢《钢铁侠》,故我们可以预测用户A对于《钢铁侠》的打分会较高。

//读取数据到Data矩阵
void load()
{
	//打开train.txt
	ifstream infile1;
	infile1.open("train.txt");
	assert(infile1.is_open());   //若失败,则输出错误消息,并终止程序运行 

	 //向data效用矩阵内存数据
	string s; //存放读取行数据
	string blank = " ";
	string line = "|";
	int UserID = -1; //已知数据集中user递增,这里可以直接先赋值为-1

	int NumOfMovie = 0; //目前的用户所看过的电影数目
	int clock = 0;

	while (getline(infile1, s))//逐行读取数据
	{
		int LocLine = s.find(line); //查找该行中"|"所在位置
		if (s == "")
			break;

		if (LocLine != -1) //"|"存在,新的用户,读取他看过的电影数
		{
			UserID++;
			clock = 0;

			int len = s.length();
			string ss = s.substr(LocLine + 1, len - LocLine);
			NumOfMovie = stoi(ss); //该用户看过的电影数目
			MovieNum[UserID] = NumOfMovie; //存入数组中

			//动态初始化data数组中该UserID行
			Data[UserID] = new MovieScore[NumOfMovie];
		}

		else //"|"不存在,还是上一个用户,现在s存的是电影号和评分
		{
			int LocBlack = s.find(blank); //空格所在位置
			string IDOfMovie = s.substr(0, LocBlack);
			int leng = s.length();
			string sco = s.substr(LocBlack + 2, leng - LocBlack);

			double score = stof(sco);//当前用户对目前行的电影的评分
			int MovieID = stoi(IDOfMovie);//当前电影编号

			struct MovieScore MS = { MovieID,score };			
			//将该行数据存入效用矩阵对应位置			
			Data[UserID][clock] = MS;
			clock++;			
		}
	}
	infile1.close();
	cout << "train.txt已读取完毕" << endl;
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐