简介
请注意,没有必要详细了解这一点来回答这个问题。
我有一个矩阵P
,以便
P.shape = (N, k)
和更大的m
大小的随机变量向量,这样P[i,:]
表示在观察i
处相互作用的随机变量的索引。在所有观察之后使随机变量的逆协方差由H
表示,使得
H.shape = (m, m)
我们知道如果H
稀疏,则必须在
H[P[i,j1], P[i,j2]]
代表i in [0, ..., N-1]
和j1,j2 in [0, ..., k-1]
。
问题
我想要的是通过考虑H
来构建P
的稀疏性结构。我不需要计算H
的确切值。我目前的方法是首先构建一个COO矩阵(使用0作为数据的占位符)然后转换为CSR,如下所示
# Build COO
col_idx = np.reshape(np.tile(P, k), [N, k, k])
row_idx = np.transpose(col_idx, [0,2,1])
col_idx = col_idx.flatten().astype(int)
row_idx = row_idx.flatten().astype(int)
indices = np.concatenate((row_idx[:,None], col_idx[:, None]),
axis=1)
A = sp.sparse.coo_matrix((np.zeros(indices.shape[0]),
(indices[:,0], indices[:,1])),
shape=[m, m])
# Convert to CSR
A = A.tocsr()
现在,构建COO矩阵的第一部分非常快,但转换为CSR非常慢。对于我的计算机,使用(N,k,m) = (10000,50,40000)
的值,建立COO需要不到1秒,但要转换为20秒。我的实际问题需要N=300000
,我猜这将需要大约30 * 20 = 600s。
这本质上是一个总是会很慢解决的问题,还是我缺少一些优化?