SlopeOne推荐算法实现(C++)
来源:互联网 发布:淘宝导航全屏css代码 编辑:程序博客网 时间:2024/06/06 00:56
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 rateddouble 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 matrixmemset(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的协同过滤更加好懂啊(只不过在计算用户相似度等方面麻烦了点)
0 0
- SlopeOne推荐算法实现(C++)
- SlopeOne推荐算法
- 协同推荐SlopeOne 算法
- 推荐系统之SlopeOne算法
- 第六题 协同推荐SlopeOne 算法
- 协同过滤之 二、SlopeOne推荐算法
- 基于评分数据的推荐算法实现:slopeone和矩阵分解
- python实现SlopeOne
- 经典算法题每日演练——第六题 协同推荐SlopeOne 算法
- 经典算法题——第六题 协同推荐SlopeOne 算法
- 经典算法题每日演练——第六题 协同推荐SlopeOne 算法
- 基于物品的协同过滤算法和SlopeOne的python实现
- 基于物品的协同过滤算法和SlopeOne的python实现
- 推荐算法简单实现
- 个性化推荐算法python实现
- python实现的推荐算法
- MapReduce之推荐算法实现
- 推荐算法学习2-MXNET 实现movielen 融合个性化推荐
- 机器学习基石笔记7——为什么机器可以学习(3)
- c++11多线程应用之简易智能计数器
- 关于大型网站技术演进的思考(四)--存储的瓶颈(4)
- DirectShow学习笔记总结
- 从n个数里面选k个数,状态压缩的方法求解
- SlopeOne推荐算法实现(C++)
- poj1655Balancing Act(树的重心)
- Unique Paths II (DP)
- AngularJS 概述
- x264 frame级流程图(一)
- Mysql的坑--与Oracle对比
- 数独判断程序
- Codeforces 514C Watto and Mechanism Trie树 + dfs
- 美赛打完了..一切都好...不想写感想了....