这是一个理论问题。假设我已经实现了两种类型的协同过滤:基于用户的 CF 和基于项目的 CF(以Slope One的形式)。
我有一个很好的数据集供这些算法运行。但后来我想做两件事:
- 我想为数据集添加一个新评级。
- 我想编辑现有评级。
我的算法应该如何处理这些变化(不做很多不必要的工作)?任何人都可以帮助我吗?
这是一个理论问题。假设我已经实现了两种类型的协同过滤:基于用户的 CF 和基于项目的 CF(以Slope One的形式)。
我有一个很好的数据集供这些算法运行。但后来我想做两件事:
我的算法应该如何处理这些变化(不做很多不必要的工作)?任何人都可以帮助我吗?
对于这两种情况,策略非常相似:
基于用户的 CF:
斜坡一:
备注:如果您的“相似度”不对称,则需要更新一行一列。如果它是对称的,则更新一行会自动导致相应列的更新。对于 Slope-One,矩阵是对称的(频率)和倾斜对称的(差异),所以如果您处理,您还需要更新一行或一列,并免费获取另一行或列(如果您的矩阵存储像这样工作)。
如果您想查看如何实现此功能的示例,请查看 MyMediaLite(免责声明:我是主要作者):https ://github.com/zenogantner/MyMediaLite/blob/master/src/MyMediaLite/RatingPrediction /ItemKNN.cs 有趣的代码在方法 RetrainItem() 中,它是从 AddRatings() 和 UpdateRatings() 调用的。
一般的东西叫做在线算法。
与其重新训练整个预测器,不如仅使用新数据“在线”更新(同时保持可用)。
如果你在谷歌上搜索“在线斜率一预测器”,你应该能够从文献中找到一些相关的方法。