我试图对60000x100矩阵的外积进行归一化求和。我想用numpy方式来做,因为我的解决方案受到列表解析中的python for循环的约束:
def covariance_over_time(X):
B = np.sum(np.array([np.outer(x, x) for x in X]),axis=0)
B = np.true_divide(B, len(X))
return B
请注意,即使这个解决方案有效,它也是单线程的,因此当X有60000行和100列时非常慢。
我尝试了其他方法,例如on stackoverflow中描述的方法。 链接中发布的答案适用于小矩阵,在几秒钟后出现错误。你知道为什么吗? (注意:我有6个TeraByte的RAM,因此我不太可能遇到内存问题,因为我根本没有看到内存使用量增长!)
答案 0 :(得分:7)
您可以使用np.dot
-
matrix-multiplication
B = X.T.dot(X)
然后,使用np.true_divide(B, len(X))
进行标准化。
如果您仍然遇到内存错误,我们还有两个选项/方法。
<强>予。全环路解决方案
我们可以遍历X
的第二个轴(列),并使用两个循环对每列执行每列之间的矩阵乘法。现在,X
只有100
列,因此,完整的循环解决方案只会迭代100X100 = 10000
次,并且在每次迭代时执行60000
(X
中的行数1}})总和减少。
n = X.shape[1]
out = np.empty((n,n),dtype=X.dtype)
for i in range(n):
for j in range(n):
out[i,j] = X[:,i].dot(X[:,j])
<强> II。混合解决方案
在完整循环解决方案和在开始时列出的完全矢量化解决方案之间的A将使用一个循环,其将在每个列与整个阵列之间执行矩阵乘法。这将在每次迭代时进行60000X100=6000000
和减少。
n = X.shape[1]
out = np.empty((n,n),dtype=X.dtype)
for i in range(n):
out[i] = X[:,i].dot(X)