【发布时间】:2016-06-20 04:46:58
【问题描述】:
目前我正在用 python 为我的本科论文实现这个paper,但我只使用马氏度量学习(如果你好奇的话)。
简而言之,当我需要学习由整数组成的大小为 67K*67K 的矩阵时,我遇到了一个问题,只需 numpy.dot(A.T,A) 其中 A 是大小为 (1,67K) 的随机向量。当我这样做时,它只是抛出 MemoryError,因为我的 PC 只有 8gb 内存,并且所需内存的原始计算是 16gb 来初始化。比我搜索替代品并找到dask。
所以我继续使用这个dask.array.dot(A.T,A) 并完成了。但是我需要对该矩阵进行白化转换,并且在dask中我可以通过获取SVD来实现它。但是每次我执行 SVD 时,ipython 内核都会死掉(我认为是因为内存不足)。
这是我从 init 到内核死掉为止所做的事情:
fv_length=512*2*66
W = da.random.randint(10,20,(fv_length),(1000,1000))
W = da.reshape(W,(1,fv_length))
W_T = W.T
Wt = da.dot(W_T,W); del W,W_T
Wt = da.reshape(Wt,(fv_length*fv_length/2,2))
U,S,Vt = da.linalg.svd(Wt); del Wt
我还没有得到 U、S 和 Vt。
难道我的记忆力根本不足以做这些事情,即使我正在使用 dask? 或者实际上这不是规范问题,而是我糟糕的内存管理? 还是别的什么?
此时我正在拼命尝试其他更大规格的 PC,因此我打算租用 32gb 内存的裸机服务器。就算我这样做,也够了吗?
【问题讨论】:
-
您需要完整的 SVD,还是只对 N 个最大奇异值/向量感兴趣?
-
我需要 SVD,因为我还想进行美白转换,并使用 PCA 获得该结果。顺便说一句,@mrocklin 让我相信,在更大的规格上做事非常值得。还是谢谢
-
您可以从 N 最大的奇异值和向量生成秩 N 的白化矩阵。根据 N 的大小,这可能比计算完整的 SVD 效率高出许多数量级。
-
任何参考或教程如何获得?
-
如果
U, s, Vt = svd(X)则U[:, :n]的列和Vt[:n, :]的行将包含正交向量。假设您在计算 SVD 之前减去了平均值,那么U[:, :n].dot(Vt[:n])将是X的白化版本。那时您基本上已经完成了 PCA(请参阅我之前的回答 here)。da.linalg.svd_compressed使用 Halko 等人的巧妙随机算法来有效地计算部分 SVD。
标签: python numpy linear-algebra svd dask