单机版的PredictionIO。
Neo4j
图数据库为代表的图数据库推荐系统持保留态度,亲测TopN推荐效果并不好。result
文件夹中。《Performance of Recommender Algorithms on Top-N Recommendation Tasks》
(位于paper文件夹中)中,演示了预测评分的准确度指标均方根差(RMSE)与准确性指标(精确度/召回率)之间,不存在简单的线性关系,即评分预测的结果不适用与TopN推荐。面向TopN领域,非评分预测领域。
本论文中使用的数据集是MovieLens的MovieLens 100K 。使用其中的用户对电影的评分信息,位于u.data文件中。其数据格式为:用户ID、物品ID,评分和时间戳。
评测指标:
在本论文中使用这四个指标是基于一个假设,即:若用户喜欢这部推荐的电影,则会观看(点击)并评价(有评分信息)这部电影;若用户不喜欢(不点击)推荐的这部电影,则不会观看也不会评价(无评分信息)。
推荐算法生成的结果,用户对其只有两种交互的可能性,即喜欢与不喜欢,是一个典型的二分类问题。推荐的电影与用户交互的结果有四种类别,如下表所示:
| 真实情况 | 预测正例 | 预测反例 |
| :———: | :———————————: | :———————————: |
| 正例 | TP(预测为正,实际为正) | FN(预测为负,实际为正) |
| 反例 | FP(预测为正,实际为负) | TN(预测为负,实际为负) |
在本论文推荐算法生成的推荐列表中的电影,都代表预测结果为正例。因为预测结果为负例的电影,即用户不会看的电影,不会推荐给用户。预测结果中包含推荐后用户确实观看的电影(TP),和推荐了但是没有观看的电影(FP)。而测试集中用户的电影列表都是真实情况的正例,其中包含被预测结果命中的正例(TP)和不包含在推荐列表中的反例(FN)。
评测方法:
本论文采用K折交叉验证法,先将原始数据集D划分为k个大小相似的互斥子集,即D=D1UD2UD3U...UDk
。按照划分顺序从中选择一个子集作为测试集,另外k-1个子集为训练集;即可得到k组训练集和测试集,最终返回这k组测试结果的均值,本论文中k的值为5。论文中相关电影的推荐列表长度为10,即TopN@10。
主要验证步骤如下:
1). 选择一个数据子集作为测试集。
2). 对测试集中所有数据按照用户ID分组。
3). 把用户的ID作为参数,调用预测的方法。
4). 接收到模型生成的推荐列表后,与该用户所拥有的电影集合进行验证。
5). 生成验证结果。
6). 选择下一个数据子集,然后重复1-5,直到所有的数据集都被作为测试集。
7). 最后返回所有测试组指标的均值作为最终结果。
整个程序分为数据处理模块、训练模块、预测模块、评估模块。
数据处理模块主要功能是从文件中读取数据,经过处理和分割,把数据传递给训练模块和评估模块。
训练模块主要功能是使用训练数据训练模型,把训练好的模型传递给评估模块。
模型中包含预测模块,对给出的用户生成指定长度推荐列表。
评估模块主要功能是使用测试数据,调用模型的预测模块,获得推荐列表后,对列表中的电影与测试集中用户的电影进行对比验证,产生验证指标。
技术:Scala 2.11.12 + Spark 2.1.3 + DeepLearning4j (详细看’build.sbt’文件中的内容)
环境:IntelliJ IDEA 2018.3.2 (Community Edition)这个随意
其中src/main/scala/Recommender.scala
是定义推荐算法必须实现的接口,其具体实现在src/main/scala/impl
中。每个算法的介绍请在impl
文件夹下,对应的算法文件的头部说明中查看,运行结果在result
文件夹中。
主要是改进了SAR算法,融合聚类协同算法,使其理论上可运行大量数据的平台。
本论文中提出的新的推荐算法,是在传统的用户聚类协同过滤算法的基础上改进而来。其主要步骤是:
利用已有的用户对物品的评分,把对相同物品评分类似的用户(涉及相似度
计算),划分为同一簇,对用户进行聚类。
在同一簇的范围内,计算用户与用户的相似度,生成用户的相似度近邻。
利用近邻用户的已经评分的物品列表,来生成用户的物品推荐列表(近临用户点评过的,当前用户没有看过的)。
过滤当前用户已经评价的物品,生成用户未评价的候选物品列表。
利用用户交互过物品和候选物品列表,构成的相似度矩阵,并计算两个物品之间的相似度。
利用当前用户已经交互的物品及其喜爱程度,与候选物品相似度矩阵,生成用户推荐物品列表。
返回推荐程度最大的TopN个物品给用户。
提升准确率的矩阵相乘的办法原文地址https://github.com/IceS2388/recommenders/blob/master/notebooks/02_model/sar_deep_dive.ipynb。
表1 相似度矩阵S
候选电影1 | 候选电影2 | … | 候选电影l | |
---|---|---|---|---|
已评分电影1 | ||||
已评分电影2 | ||||
… | ||||
已评分电影k |
表2 关联矩阵A
已评分电影1 | 已评分电影2 | … | 已评分电影k | |
---|---|---|---|---|
当前用户 | 1 | 1 | … | 1 |
利用用户关联矩阵A与相似度矩阵S的乘积AxS得到推荐矩阵R,。其生成的推荐矩阵R,如下表3所示。
表3 推荐矩阵
候选电影1 | 候选电影2 | … | 候选电影l | |
---|---|---|---|---|
当前用户 | 推荐程度1 | 推荐程度2 | … | 推荐程度l |
求推荐程度的值公式,如下式所示:
其中表示关联矩阵A中第i列的值,
表示相似度矩阵S中第i行第j列的值。