我必须分解一个大的稀疏矩阵(代表用户的6.5mln行*代表项目的6.5mln列)来查找用户和项目潜在的向量。我在spark框架(pyspark)中选择了als算法。 为了提高质量,我必须将矩阵的稀疏度降低到98%。 (当前值为99.99%,因为我有356毫升的填充条目)。 我可以通过删除行或列来实现,但我必须找到最大化行数(用户)的最佳解决方案。 主要的问题是我必须找到一些用户和项集的子集,并且删除一些行可以删除一些列,反之亦然,第二个问题是评估稀疏性的函数不是线性的。 哪种方式可以解决这个问题? python中的哪些库可以帮助我? 谢谢。
答案 0 :(得分:0)
这是一个组合问题。没有简单的方法可以删除最佳的列集以实现最大数量的用户,同时减少稀疏性。一种正式的方法是将其表述为混合整数程序。考虑从原始矩阵C派生的以下0-1矩阵。
A(i,j) = 1 if C(i,j) is nonzero,
A(i,j) = 0 if C(i,j) is zero
参数:
M : a sufficiently big numeric value, e.g. number of columns of A (NCOLS)
N : total number of nonzeros in C (aka in A)
决策变量
x(j) : 0 or 1 implying whether column j is dropped or not
nr(i): number of nonzeros covered in row i
y(i) : 0 or 1 implying whether row i is dropped or not
约束:
A(i,:) x = nr(i) for i = 1..NROWS
nr(i) <= y(i) * M for i = 1..NROWS
@sum(nr(i)) + e = 0.98 * N # explicit slack 'e' to be penalized in the objective
y(i) and x(j) are 0-1 variables (binary variables) for i,j
目标:
maximize @sum(y(i)) - N.e
这样的模型作为整数模型很难解决。然而,屏障方法应该能够解决线性规划松弛(LP)可能的求解器是Coin / CLP(开源),Lindo(商业)等......然后可以使用LP解决方案来计算近似整数简单舍入的解决方案。
最后,你肯定需要一种迭代方法,每次分解不同的C子矩阵时,需要多次解决MF问题,用上述方法计算,直到你对解决方案满意为止。