【发布时间】:2015-10-07 17:34:29
【问题描述】:
首先,感谢您阅读并花时间回复。
二、问题:
我有一个 PxN 矩阵 X,其中 P 大约为 10^6,N 大约为 10^3。所以,X 比较大,而且不是稀疏的。假设 X 的每一行都是一个 N 维样本。我想在这些 P 个样本之间构建一个成对距离的 PxP 矩阵。假设我对 Hellinger 距离感兴趣。
到目前为止,我依赖于稀疏的 dok 矩阵:
def hellinger_distance(X):
P = X.shape[0]
H1 = sp.sparse.dok_matrix((P, P))
for i in xrange(P):
if i%100 == 0:
print i
x1 = X[i]
X2 = X[i:P]
h = np.sqrt(((np.sqrt(x1) - np.sqrt(X2))**2).sum(1)) / math.sqrt(2)
H1[i, i:P] = h
H = H1 + H1.T
return H
这太慢了。有没有更有效的方法来做到这一点?非常感谢任何帮助。
【问题讨论】:
-
你真的需要计算每对距离吗?您的 PxP 矩阵将包含 1E12 个元素,因此假设您正在处理双浮点数,您正在查看大约 8000 GB 来存储输出。如果您只是计算上三角形,那将是 (P^2 - P) / 2 ~= 5E11 元素,假设双浮点数约为 4000 GB。即使是这种大小的二进制矩阵,大小也大约为 500 GB。
-
你是对的。我了解到,使用 scipy 中的密集矩阵,您可以直接计算压缩形式(仅限上三角),但不能使用稀疏矩阵。
标签: python numpy scipy memory-efficient scalable