有人跟我吐槽说这本质上是数据库大作业+算法大作业....跟C++其实没什么关系 当然如果你要做一个GUI界面的话则另当别论.... 我们小组讨论到最后决定放弃挑战自己,屈服于算法和期末考试...... 【题目如下】 项目描述 在这个项目中,你们小组需要开发一个关于某类产品的评论和推荐系统,类似于亚马逊、当当和豆瓣等。该类产品不限于图书,可以是电影、音乐、餐馆、美食等等。为了表述方便,我们在此文档中统一表述为图书。 系统中需要管理一群用户和许多图书。用户可以对系统中的图书进行【评论和评级】(假设使用1-10级的评分标准)。 当然,一个用户不可能对系统中的所有图书进行评分,一般只是对自己看过的书进行评论并给相应的评分。 【系统运行中,可以注册新的用户,添加新的图书,也可以删除或修改已有的图书和用户的信息(除它们的唯一标识符之外的信息,如图书作者、年份等等)。】 对每本图书,系统要统计其【总的评论数和平均得分】等。 每个用户登陆系统后,系统要向其【推荐】该用户最有可能阅读但还未阅读过的10本图书。 除了推荐图书,系统还可以向用户【推荐兴趣相投的可能好友】,即其他由类似兴趣的用户。 参考数据集 Book-Crossing Dataset:http://www2.informatik.uni-freiburg.de/~cziegler/BX/ MovieLens:http://grouplens.org/datasets/movielens/
【是不是很像数据库+算法大作业??? :)】 这里我先记一点解题思路
从本质理解上看,其实是在用户和推荐物之间,在用户和用户,物品和物品之间各自建立联系,这里就需要一点数据结构中图的知识。(而且肯定是带权的图) 所以一个很大的问题就在于,如何判断两个结点之间有比较好的联系?(权比较大之类的)如何排序? 注意这里面的参数还不少,用户信息和评分都很重要。
【可能涉及到的推荐算法】 1.基于人口统计学的推荐:
说简单一点就是把物品匹配给相同性别或者年龄层的情况相似的人。 优点:没有冷启动的问题 [冷启动问题:在没有用户历史数据的情况下设计个性化推荐并且让用户对推荐结果满意的问题。 或者根本上说:怎么给新用户推荐的问题 ] 缺点:很明显,算法很粗糙,效果很难让人满意,只适合简单的推荐。
2.基于内容的推荐
优点: 对用户兴趣可以很好的建模,通过对物品属性维度的增加获得更好的推荐度。
缺点: 有冷启动问题,以及物品的属性本来就有限,相似度的衡量标准不确定,可能会比较片面。
3.协同过滤(CF)算法【大BOSS】 话不多说先上参考链接 http://blog.csdn.net/ygrx/article/details/15501679 http://www.ibm.com/developerworks/cn/web/1103_zhaoct_recommstudy2/index.html 我觉得这两个写的会比我好很多 该BOSS有两个变体 (1)基于用户的协同过滤 想法: 依据用户对物品的评价计算出所有用户之间的相似度; 选出与当前用户最相似的N个用户; 用N个邻居用户对物品的评分,预测当前用户对没有浏览过的物品的可能评分; 按照预测出的可能评分的高低向当前用户推荐物品。
【那么问题来了——怎么计算相似度?如何预测用户的评分? 其实这可以理解为图中两个结点间的路径长短判断问题。
相似度: 一种常用的计算方法: Pearson Correlation
其他的还有Jaccard算法 / 余弦算法 / 加权平均算法......预测: 一个常用的预测函数:
对每个邻居用户,计算他对物品p的评分高出或者低于其平均评分的差值 将这些评分差值综合起来---以用户相似度为权重 将邻居用户们对p的评分偏见加到用户a的平均评分上,作为用户a对物品p的评分预测
(2)基于物品的协同过滤 依据用户对物品的评价计算出所有物品之间的相似度; 用某用户对相似物品的评分,预测该用户对其未浏览过的物品的评分。 按照预测出的可能评分的高低向当前用户推荐物品。
问题同上,其实思路和解法差不多,但是可能需要一点调整 【调整的余弦相似度】
协同过滤的优点:显而易见,比起之前的细度更大,更加科学一点。 缺点:评分矩阵稀疏问题,冷启动问题等。
小调整: ——(1)一种基于图的方法: (spreading activation) 思路:用长度>3的路径来推荐物品 ——(2)矩阵SVD分解:奇异值分解,本质上是降维 ——(3)信息预处理:减噪和归一化
减噪:用户行为数据是用户在使用应用过程中产生的,它可能存在大量的噪音和用户的误操作,我们可以通过经典的数据挖掘算法过滤掉行为数据中的噪音,这样可以是我们的分析更加精确。 归一化:在计算用户对物品的喜好程度时,可能需要对不同的行为数据进行加权。但可以想象,不同行为的数据取值可能相差很大,比如,用户的查看数据必然比购买数据大的多,如何将各个行为的数据统一在一个相同的取值范围中,从而使得加权求和得到的总体喜好更加精确,就需要我们进行归一化处理。最简单的归一化处理,就是将各类数据除以此类中的最大值,以保证归一化后的数据取值在 [0,1] 范围中
具体代码可以参考我的Github内容:https://github.com/rucerlx/coding-language-learning/pull/1