SVD和ALS有什么关系?

机器算法验证 Python 推荐系统 矩阵分解
2022-03-28 00:29:05

我正在尝试使用小型 MovieLens 数据集构建一个简单的 CF 推荐系统。为了做到这一点,我尝试使用 ALS 将我的(用户,项目)矩阵分解为(用户,潜在空间)矩阵和(项目,潜在空间)矩阵使得: To这样做我使用的是 Python 的 Implicit 包中定义的 ALS 算法,当我乘以大不相同我的问题是,我对 ALS 到底是什么感到困惑吗?我认为它类似于 SVD 或任何其他矩阵分解算法。我使用显式数据而不是隐式数据是否重要?这是我用来执行矩阵分解的代码:AUV

A=UV
UVA

from implicit.als import AlternatingLeastSquares
from scipy import sparse

def matrix_decomposition(matrix, k, i):
    matrix = sparse.csr_matrix(matrix.T)
    model = AlternatingLeastSquares(factors=k, iterations=i)
    model.fit(matrix)
    user_latent = model.user_factors
    item_latent = model.item_factors

    return user_latent, item_latent
1个回答

...我对 ALS 到底是什么感到困惑?我认为它类似于 SVD 或任何其他矩阵分解算法。我使用显式数据而不是隐式数据是否重要?

请参阅:“使用 SVD 的简单电影推荐器”和“ ALS 隐式协同过滤”:

"隐式与显式数据

显式数据是我们有某种评级的数据。就像来自 MovieLens 或 Netflix 数据集的 1 到 5 评分一样。在这里,我们知道用户喜欢或不喜欢一件很棒的商品,但这些数据很难获得。您的用户可能不会花时间对项目进行评分,或者您的应用程序可能一开始就无法很好地使用评分方法。

隐式数据(我们在这里使用的数据类型)是我们从用户行为中收集的数据,不需要评级或特定操作。可能是用户购买了哪些商品,他们播放歌曲或观看电影的次数,他们阅读特定文章的时间等。好处是我们拥有更多这样的数据,坏处是它更嘈杂,并不总是很明显这意味着什么。

例如,通过星级评分,我们知道 1 表示用户不喜欢该项目,而 5 表示他们非常喜欢该项目。对于歌曲播放,用户可能播放了一首歌曲并且讨厌它,或者喜欢它,或者介于两者之间。如果他们不播放一首歌,可能是因为他们不喜欢它,或者如果他们知道的话他们会喜欢它。

因此,我们关注的是我们知道用户已经消费了什么以及我们对他们是否喜欢任何给定项目的信心。例如,我们可以衡量他们播放一首歌的频率,如果他们听了 500 次而不是一次,则假设他们有更高的信心。

随着隐式数据量的增长,隐式推荐正成为许多推荐系统中越来越重要的部分。例如,最初的 Netflix 挑战只关注显式数据,但他们现在越来越依赖隐式信号。Hulu、Spotify、Etsy 和许多其他公司也是如此。”

如果我们正在处理显式数据,则有多种方法可以分解矩阵,例如奇异值分解(SVD) 或概率潜在语义分析(PLSA)。

基本形式的最小二乘法意味着将某些线拟合到数据中,测量从所有点到线的距离平方和,并尝试对缺失点进行最佳拟合。

通过交替最小二乘法,我们使用相同的想法,但在优化 U 和固定 V 之间迭代交替,反之亦然。这是一个迭代优化过程,我们每次迭代都试图越来越接近原始数据的分解表示。

奇异值分解是一种矩阵分解方法,用于将矩阵简化为其组成部分,以使某些后续矩阵计算更简单。

前两个和最后一个链接中的教程应该很有帮助。