将协同过滤代码转换为使用稀疏矩阵的方式,我正在思考以下问题:给定两个完整的矩阵X(m x l)和Theta(n x l),以及一个稀疏矩阵R(m x n),有没有一种快速计算稀疏内积的方法。大尺寸为m和n(约为100000),而l很小(约为10)。这可能是处理大数据的一个相当常见的操作,因为它出现在大多数线性回归问题的成本函数中,所以我期望scipy.sparse内置了解决方案,但我还没有发现任何明显的解决方案。
在Python中完成这个任务的朴素方法是R.multiply(XTheta.T),但这将导致评估完整的矩阵X Theta.T (m x n,约为100000 ** 2),这将占用太多内存,然后丢弃大部分条目,因为R是稀疏的。
stackoverflow上已经有一个伪解决方案,但它在一步中不是稀疏的:pseudo solution already here on stackoverflow。
一个实际上是稀疏的解决方案,但非常缓慢,是:
有人知道一种快速的、完全稀疏的方法来实现这个吗?
在Python中完成这个任务的朴素方法是R.multiply(XTheta.T),但这将导致评估完整的矩阵X Theta.T (m x n,约为100000 ** 2),这将占用太多内存,然后丢弃大部分条目,因为R是稀疏的。
stackoverflow上已经有一个伪解决方案,但它在一步中不是稀疏的:pseudo solution already here on stackoverflow。
def sparse_mult_notreally(a, b, coords):
rows, cols = coords
rows, r_idx = np.unique(rows, return_inverse=True)
cols, c_idx = np.unique(cols, return_inverse=True)
C = np.array(np.dot(a[rows, :], b[:, cols])) # this operation is dense
return sp.coo_matrix( (C[r_idx,c_idx],coords), (a.shape[0],b.shape[1]) )
这对我小规模的数组来说工作得很好,而且速度也很快,但是当我处理大数据集时它会出现以下错误:
... in sparse_mult(a, b, coords)
132 rows, r_idx = np.unique(rows, return_inverse=True)
133 cols, c_idx = np.unique(cols, return_inverse=True)
--> 134 C = np.array(np.dot(a[rows, :], b[:, cols])) # this operation is not sparse
135 return sp.coo_matrix( (C[r_idx,c_idx],coords), (a.shape[0],b.shape[1]) )
ValueError: array is too big.
一个实际上是稀疏的解决方案,但非常缓慢,是:
def sparse_mult(a, b, coords):
rows, cols = coords
n = len(rows)
C = np.array([ float(a[rows[i],:]*b[:,cols[i]]) for i in range(n) ]) # this is sparse, but VERY slow
return sp.coo_matrix( (C,coords), (a.shape[0],b.shape[1]) )
有人知道一种快速的、完全稀疏的方法来实现这个吗?
aa = a[rows, :]; bb = b[:, cols]; C = np.dot(aa, bb)
。您不需要调用np.array
,因为它实际上会复制数组,所以它甚至可能是内存错误的罪魁祸首。在生成R
的过程中,您会破坏X
和Theta
吗? - Jaime