Dask优化中的ALS算法

我正在尝试在 Dask 中实现 ALS 算法,但我无法弄清楚如何一步计算潜在特征。我遵循了这个 stackoverflow 线程上的公式,并提出了以下代码:

    Items = da.linalg.lstsq(da.add(da.dot(Users, Users.T), lambda_ * da.eye(n_factors)), 
                            da.dot(Users, X))[0].T.compute()
    Items = np.where(Items < 0, 0, Items)

    Users = da.linalg.lstsq(da.add(da.dot(Items.T, Items), lambda_ * da.eye(n_factors)), 
                            da.dot(Items.T, X.T))[0].compute()
    Users = np.where(Users < 0, 0, Users)

但我认为这不正确,因为 MSE 并没有减少。

示例输入:

n_factors = 2
lambda_ = 0.1
# We have 6 users and 4 items

矩阵X_train(6x4)、R(4x6)、Users(2x6) 和Items(4x2) 看起来像:

1  0  0  0  5  2        1 0 0 0    0.8  1.3     1.1  0.2  4.1  1.6
0  0  0  0  4  0        0 0 1 1    3.9  4.3     3.5  2.7  4.3  0.5
0  3  0  0  4  0        0 0 0 0    2.9  1.5
0  3  0  0  0  0        0 0 0 0    0.2  4.7
                        1 1 1 0    0.9  1.1
                        1 0 0 0    4.8  3.0

编辑:我发现了问题,但我不知道如何解决它。在迭代开始之前,我将X_train矩阵中没有评级的所有值设置为 0。

X_train = da.nan_to_num(X_train)

原因是因为点积仅适用于数值。但是因为矩阵非常稀疏,它的 90% 现在由零组成。并在矩阵中拟合真实评级,它适合这个零。

任何帮助将不胜感激。<3

以上是Dask优化中的ALS算法的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>