【发布时间】:2012-10-03 04:30:42
【问题描述】:
我们计划将 Mahout 用于电影推荐系统。我们还计划 使用 SVD 进行模型构建。
当新用户到来时,我们会要求他/她对一定数量的电影(比如 10 部电影)进行评分。
问题是,为了向这个新用户推荐,我们必须重新构建整个模型。
有没有更好的方法?
谢谢
【问题讨论】:
我们计划将 Mahout 用于电影推荐系统。我们还计划 使用 SVD 进行模型构建。
当新用户到来时,我们会要求他/她对一定数量的电影(比如 10 部电影)进行评分。
问题是,为了向这个新用户推荐,我们必须重新构建整个模型。
有没有更好的方法?
谢谢
【问题讨论】:
是的...虽然不是在 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 算法。这是一个更简单的过程,所以更快(但使折叠变得更难——见a recent explanation I gave 的结尾)。它非常适合推荐。
这也存在于 Mahout 中,尽管没有实现折叠。 Myrrix,这是我继续 Mahout 工作的地方,实现了所有这些。
【讨论】: