【发布时间】:2015-06-21 05:49:30
【问题描述】:
我有一个非常大的 csr 稀疏矩阵 M。我想得到这个矩阵的点积(M.dot(M.T)),并在结果矩阵R 中每行只保留N 最大值。问题是点积M.dot(M.T) 引发MemoryError。所以我创建了点函数的修改实现,看起来像:
def dot_with_top(m1, m2, top=None):
if top is not None and top > 0:
res_rows = []
for row_id in xrange(m1.shape[0]):
row = m1[row_id]
if row.nnz > 0:
res_row = m1[row_id].dot(m2)
if res_row.nnz > top:
args_ids = np.argsort(res_row.data)[-top:]
data = res_row.data[args_ids]
cols = res_row.indices[args_ids]
res_rows.append(csr_matrix((data, (np.zeros(top), cols)), shape=res_row.shape))
else:
res_rows.append(res_row)
else:
res_rows.append(csr_matrix((1, m1.shape[0])))
return sparse.vstack(res_rows, 'csr')
return m1.dot(m2)
它工作正常,但有点慢。是否有可能使这个计算更快,或者你知道一些已经存在的方法可以更快?
【问题讨论】:
-
您似乎正在尝试为一些高维稀疏数据集计算协方差矩阵。你打算用它做什么?根据您的最终目标,可能有一些方法可以避免显式计算协方差矩阵。
-
@ali_m 我正在为基于项目的协同过滤需求计算余弦相似度矩阵。根据该方法,我每个项目最多只需要 30 个元素。
-
您能否将其更改为一次处理行块,而不仅仅是一个?使用 1000 行的 10 步应该比 10,000 步快。
-
我建议进行分析。例如,哪个需要更多时间,
row.dot(m2)行(每个循环只执行一次mi[]),还是收集 30 个值?在每个步骤中创建csr还是为所有数组收集data,row,col更好?vstack或最终csr_matrix?查看bmat的内部结构(这是vstack使用的)。 -
@hpaulj 我考虑过块,但方法中最慢的部分是排序。即使我使用块,我也必须对每一行中的项目进行排序。这就是为什么使用块的解决方案没有带来很大的改进
标签: python numpy scipy linear-algebra sparse-matrix