gpt4 book ai didi

python - Dask优化中的ALS算法

转载 作者:行者123 更新时间:2023-12-04 12:02:02 25 4
gpt4 key购买 nike

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

    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

最佳答案

处理数据集中的空白或缺失值的一种方法是使用 masked arrays .截至 2017 年 5 月,Dask 也支持它们。
在 Dask 中定义掩码数组相当简单,与 numpy 相似。所有支持的功能都列在 docs 中,这里只是一些最常用的方法:

data_set = da.array([[1, 2], [3, 4]])

masked_data_set_1 = da.ma.masked_array(data_set, mask=[[False, True],[True, False]])
# returns [[1, --],[--, 4]]

masked_data_set_2 = da.ma.masked_equal(data_set, 4)
# returns [[1, 2],[3, --]]

masked_data_set_3 = da.ma.masked_where(data_set < 3, data_set)
# returns [[--, --],[3, 4]]
在您的情况下,您正在尝试执行 da.dot(Users, X)) 的点积.而不是设置所有 NaN值为 0,您可以使用掩码数组作为:
masked_X = da.ma.masked_where(X != X, X)
现在您可以轻松执行点积,例如:
da.ma.getdata(da.dot(Users,masked_X))

关于python - Dask优化中的ALS算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67650920/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com