稀疏度降低

时间:2018-06-15 16:20:49

标签: python optimization pyspark sparse-matrix recommender-systems

我必须分解一个大的稀疏矩阵(代表用户的6.5mln行*代表项目的6.5mln列)来查找用户和项目潜在的向量。我在spark框架(pyspark)中选择了als算法。 为了提高质量,我必须将矩阵的稀疏度降低到98%。 (当前值为99.99%,因为我有356毫升的填充条目)。 我可以通过删除行或列来实现,但我必须找到最大化行数(用户)的最佳解决方案。 主要的问题是我必须找到一些用户和项集的子集,并且删除一些行可以删除一些列,反之亦然,第二个问题是评估稀疏性的函数不是线性的。 哪种方式可以解决这个问题? python中的哪些库可以帮助我? 谢谢。

1 个答案:

答案 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问题,用上述方法计算,直到你对解决方案满意为止。