6 python classification sparse-matrix matrix-factorization dask
我正在尝试在 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)
Run Code Online (Sandbox Code Playgroud)
但我认为这不正确,因为 MSE 并没有减少。
示例输入:
n_factors = 2
lambda_ = 0.1
# We have 6 users and 4 items
Run Code Online (Sandbox Code Playgroud)
矩阵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
Run Code Online (Sandbox Code Playgroud)
编辑:我发现了问题,但我不知道如何解决它。在迭代开始之前,我将X_train矩阵中没有评级的所有值设置为 0。
X_train = da.nan_to_num(X_train)
Run Code Online (Sandbox Code Playgroud)
原因是因为点积仅适用于数值。但是因为矩阵非常稀疏,它的 90% 现在由零组成。并在矩阵中拟合真实评级,它适合这个零。
任何帮助将不胜感激。<3
小智 0
处理数据集中的间隙或缺失值的一种方法是使用masked arrays. 截至 2017 年 5 月,Dask 也支持它们。
在 Dask 中定义屏蔽数组相当简单,并且与 numpy 类似。文档中列出了所有支持的功能,这里只是一些最常用的方法:
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]]
Run Code Online (Sandbox Code Playgroud)
在您的情况下,您正在尝试执行 的点积da.dot(Users, X))。您可以使用掩码数组,而不是将所有NaN值设置为 0:
masked_X = da.ma.masked_where(X != X, X)
Run Code Online (Sandbox Code Playgroud)
现在您可以轻松地执行点积,例如:
da.ma.getdata(da.dot(Users,masked_X))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
258 次 |
| 最近记录: |