6

我们计划将 Mahout 用于电影推荐系统。我们还计划使用 SVD 进行模型构建。

当新用户到来时,我们将要求他/她对一定数量的电影(比如 10 部电影)进行评分。

问题是,为了向这个新用户提出建议,我们必须再次重建整个模型。

有更好的方法吗?

谢谢

4

1 回答 1

9

是的……虽然不在 Mahout 中。那里的实现本质上是围绕数据模型的定期重新加载和重建而构建的。在某些实现中,这仍然允许您动态使用新数据,例如基于邻域的实现。我认为基于 SVD 的内存中不会这样做(我没有写。)

从理论上讲,您可以从第一次点击或评分开始,通过折叠将目标项目/电影投影回用户特征空间来进行推荐。为了大大简化——如果你对输入 A 的秩 k 近似分解是 Ak = Uk * Sk * Vk',那么对于一个新用户 u,你需要一个新的行 Uk_u 来进行更新。你有A_u。

Uk = Ak * (Vk')^-1 * (Sk)^-1。好消息是右边的那两个倒数是微不足道的。(Vk')^-1 = Vk 因为它具有正交列。(Sk)^-1 只是取 Sk 的对角元素的倒数。

所以 Uk_u = Ak_u * (Vk')^-1 * (Sk)^-1。你没有 Ak_u,但是,你有 A_u 大致相同,所以你使用它。

如果你喜欢 Mahout,并且喜欢矩阵分解,我建议你考虑 ALS 算法。这是一个更简单的过程,因此速度更快(但会使折叠变得更难——请参阅我给出的最近解释的结尾)。它非常适合推荐。

这也存在于 Mahout 中,尽管没有实现折叠。Myrrix是我继续 Mahout 工作的地方,它实现了所有这些。

于 2012-10-12T12:40:20.597 回答