SlopeOne推荐算法实现(C++)

SlopeOne算法是一个非常简单的协同过滤算法,主要思想如下:如果用户u对物品j打过分,现在要对物品i打分,那么只需要计算出在同时对物品i和j打分的这种人中,他们的分数之差平均是多少,那么我们就可以根据这个分数之差来计算用户u对物品i的打分了,当然,这样的物品j也有很多个,那有的物品和j共同打分的人少,有的物品和j共同打分的人多,那么显而易见,共同打分多的那个物品在评分时所占的比重应该大一些。

如上就是简单的SlopeOne算法的主要思想,用维基百科上的一张图来表示(一看就懂):

途中用户B要对物品J进行评分,那么这时候发现物品i被用户B打为2分,而同时发现用户A同时评价了物品i和物品j,且物品i比物品j少了0.5分,那么由此看来,用户B给物品j打得分应该就是比给物品i打的分高0.5分,故是2.5分。

由于思想是如此简单,故我们就来实践一把,当然这里就是最最朴素的实现,只是为了检测下算法效果如何。。。数据集还是如上篇博客一样,用的是movielens里面的小数据集,其中有1000用户对2000物品的评分,80%用来训练,20%用来测试。

具体代码如下:

#include <iostream>
#include <string>
#include <fstream>
#include <math.h>
using namespace std;
const int USERMAX = 1000;
const int ITEMMAX = 2000;
double rating[USERMAX][ITEMMAX];
int I[USERMAX][ITEMMAX];//indicate if the item is rated
double mean;

double predict(int u, int l)
{
	double total = 0;
	double totalCnt = 0;
	for (int i = 0; i < ITEMMAX; i++)
	{
		if (l != i&&I[u][i])
		{
			double dev = 0;
			int cnt = 0;
			for (int j = 0; j < USERMAX; j++)
			{
				if (I[j][l] && I[j][i])
				{
					dev += rating[j][i]-rating[j][l];
					cnt++;
				}
			}
			if (cnt)
			{
				dev /= cnt;
				total += (rating[u][i] - dev)*cnt;
				totalCnt += cnt;
			}
		}
	}
	if (totalCnt == 0)
		return mean;
	return total / totalCnt;
}
double calMean()
{
	double total = 0;
	int cnt = 0;
	for (int i = 0; i < USERMAX; i++)
		for (int j = 0; j < ITEMMAX; j++)
		{
			total += I[i][j] * rating[i][j];
			cnt += I[i][j];
		}
	return total / cnt;
}

void train()
{
	//read rating matrix
	memset(rating, 0, sizeof(rating));
	memset(I, 0, sizeof(I));
	ifstream in("ua.base");
	if (!in)
	{
		cout << "file not exist" << endl;
		exit(1);
	}
	int userId, itemId, rate;
	string timeStamp;
	while (in >> userId >> itemId >> rate >> timeStamp)
	{
		rating[userId][itemId] = rate;
		I[userId][itemId] = 1;
	}
	mean = calMean();
}

void test()
{
	ifstream in("ua.test");
	if (!in)
	{
		cout << "file not exist" << endl;
		exit(1);
	}
	int userId, itemId, rate;
	string timeStamp;
	double total = 0;
	double cnt = 0;
	while (in >> userId >> itemId >> rate >> timeStamp)
	{
		double r = predict(userId, itemId);
		cout << "true: " << rate << " predict: " << r << endl;
		total += (r - rate)*(r - rate);
		cnt += 1;
		//cout << total << endl;
	}
	cout << "test rmse is " << pow(total / cnt, 0.5) << endl;
}
int main()
{
	train();
	test();
	return 0;
}

实验结果如下:

在测试集上的rmse达到了0.96,而之前一篇博客实现的svd通过复杂的梯度下降来求最优解也就0.95左右,故SlopeOne算法是非常简单有效的,维基百科里说是最简洁的协同过滤了,但是我个人觉得类似knn的协同过滤更加好懂啊(只不过在计算用户相似度等方面麻烦了点)

时间: 2024-08-11 01:26:04

SlopeOne推荐算法实现(C++)的相关文章

java和python实现一个加权SlopeOne推荐算法

一.加权SlopeOne算法公式: (1).求得所有item之间的评分偏差 上式中分子部分为项目j与项目i的偏差和,分母部分为所有同时对项目j与项目i评分的用户数 (2).加权预测评分 项目j与项目i 上式中表示用户u对项目j的评分预测,分子为项目j对项目i的偏差加上用户对项目i的评分,cji表示同时对项目j与项目i评分的用户数 二.python实现 1 #!/usr/bin/python 2 # -*- coding: utf-8 -*- 3 4 user_data = {"小明":

机器学习:推荐算法之基于用户、基于物品和Slope One

? ? 引言 ? ? 之前有段时间研究过推荐算法,倒不是科研需要,是觉得很想弄明白每天淘宝的时候那些猜你喜欢的东西是怎么冒出来的,还有最近很火的网易云音乐以及虾米音乐的推荐算法,这里很高兴的就是网易云音乐已经被我调教的很棒了,真开心 ? ? 后来了解到那些企业做的推荐算法多是混合推荐,而我只了解了基础的三种,不过相信万变不离其宗,很多基础的东西还是很重要的,所以对这三种推荐算法进行了整理,最后因为之前自己用Python参照着github上一个人的代码自己也尝试着实现了一下该推荐系统,主要是基于用

Mahout推荐算法API详解

前言 用Mahout来构建推荐系统,是一件既简单又困难的事情.简单是因为Mahout完整地封装了“协同过滤”算法,并实现了并行化,提供非常简单的API接口:困难是因为我们不了解算法细节,很难去根据业务的场景进行算法配置和调优. 本文将深入算法API去解释Mahout推荐算法底层的一些事. 1. Mahout推荐算法介绍 Mahoutt推荐算法,从数据处理能力上,可以划分为2类: 单机内存算法实现 基于Hadoop的分步式算法实现 1). 单机内存算法实现 单机内存算法实现:就是在单机下运行的算法

从分类,排序,top-k多个方面对推荐算法稳定性的评价

介绍 论文名: "classification, ranking, and top-k stability of recommendation algorithms". 本文讲述比较推荐系统在三种情况下, 推荐稳定性情况. 与常规准确率比较的方式不同, 本文从另一个角度, 即推荐算法稳定性方面进行比较. 详细 参与比较的推荐算法 包括: baseline 传统基于用户 传统基于物品 oneSlope svd 比较方式 比较的过程分为两个阶段: 阶段一, 将原始数据分为两个部分, 一部分

Mahout推荐算法之SlopOne

Mahout推荐算法之SlopOne 一.       算法原理 有别于基于用户的协同过滤和基于item的协同过滤,SlopeOne采用简单的线性模型估计用户对item的评分.如下图,估计UserB对ItemJ的偏好 图(1) 在真实情况下,该方法有如下几个问题: 1.  为什么要选择UserA计算? 2.  对大量稀疏的情况如何处理,而这种情况是最为普遍的. 图(2) Item1和item2的相似度:((5-3)+(3-4))/2=0.5 Item1和Item3的相似度:(5-2)/1=3 L

Mahout推荐算法API详解【一起学Mahout】

阅读导读: 1.mahout单机内存算法实现和分布式算法实现分别存在哪些问题? 2.算法评判标准有哪些? 3.什么会影响算法的评分? 1. Mahout推荐算法介绍 Mahout推荐算法,从数据处理能力上,可以划分为2类: 单机内存算法实现 基于Hadoop的分步式算法实现 1). 单机内存算法实现 单机内存算法实现:就是在单机下运行的算法,是由cf.taste项目实现的,像我们熟悉的UserCF,ItemCF都支持单机内存运行,并且参数可以灵活配置.单机算法的基本实例,请参考文章:用Maven

Mahout推荐算法API具体解释【一起学Mahout】

阅读导读: 1.mahout单机内存算法实现和分布式算法实现分别存在哪些问题? 2.算法评判标准有哪些? 3.什么会影响算法的评分? 1. Mahout推荐算法介绍 Mahout推荐算法,从数据处理能力上,能够划分为2类: 单机内存算法实现 基于Hadoop的分步式算法实现 1). 单机内存算法实现 单机内存算法实现:就是在单机下执行的算法,是由cf.taste项目实现的,像我们熟悉的UserCF,ItemCF都支持单机内存执行.而且參数能够灵活配置.单机算法的基本实例.请參考文章:用Maven

[转]Mahout推荐算法API详解

Mahout推荐算法API详解 Hadoop家族系列文章,主要介绍Hadoop家族产品,常用的项目包括Hadoop, Hive, Pig, HBase, Sqoop, Mahout, Zookeeper, Avro, Ambari, Chukwa,新增加的项目包括,YARN, Hcatalog, Oozie, Cassandra, Hama, Whirr, Flume, Bigtop, Crunch, Hue等. 从2011年开始,中国进入大数据风起云涌的时代,以Hadoop为代表的家族软件,占

Mahout推荐算法基础

转载自(http://www.geek521.com/?p=1423) Mahout推荐算法分为以下几大类 GenericUserBasedRecommender 算法: 1.基于用户的相似度 2.相近的用户定义与数量 特点: 1.易于理解 2.用户数较少时计算速度快 GenericItemBasedRecommender 算法: 1.基于item的相似度 特点: 1.item较少时就算速度更快 2.当item的外部概念易于理解和获得是非常有用 SlopeOneRecommender(itemB