这是一个理论问题。假设我已经实现了两种类型的协同过滤:基于用户的 CF 和基于项目的 CF(以 Slope One 的形式)。
我有一个很好的数据集供这些算法运行。但是我想做两件事:
- 我想向数据集添加一个新的评级。
- 我想编辑现有评级。
我的算法应该如何处理这些变化(不做很多不必要的工作)?谁能帮我解决这个问题?
最佳答案
对于这两种情况,策略非常相似:
基于用户的 CF:
- 更新受影响用户的所有相似性(即相似性矩阵中的一行和一列)
- 如果您的邻居是预先计算的,请为受影响的用户计算邻居(对于完整更新,您可能需要重新计算所有邻居,但我会坚持使用近似解决方案)
坡度一:
- 更新受影响项目的频率(仅在“添加”情况下)和差异矩阵条目(同样,一行和一列)
备注:如果你的'相似度'是不对称的,你需要更新一行一列。如果它是对称的,则更新一行会自动导致更新相应的列。 对于斜率一,矩阵是对称的(频率)和偏斜对称的(差异),所以如果你处理你还需要更新一行或一列,并免费获得另一行(如果你的矩阵存储是这样工作的)。
如果您想查看如何实现的示例,请查看 MyMediaLite(免责声明:我是主要作者):https://github.com/zenogantner/MyMediaLite/blob/master/src/MyMediaLite/RatingPrediction/ItemKNN.cs 有趣的代码在方法 RetrainItem() 中,它是从 AddRatings() 和 UpdateRatings() 调用的。
关于recommendation-engine - 如何处理推荐系统的新数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12466842/