我正在尝试将一些代码从 Matlab 移植到 Python,但遇到了问题。我似乎找不到与 svds 等效的东西。
我尝试使用 numpy.corrcoef,然后使用 numpy.linalg.eig,但 numpy.corrcoef 不适用于大型数组(比如 500 x 20000)。
这是 matlab 中的代码,以防有任何不同:
s = size(data, 2)
mean = sum(data, 2)/s
m_data = ( data - repmat(mean, 1, s) ) / sqrt(s - 1)
[res_u,res_s] = svds(m_data, s)
eigenvals = diag(res_s).^2
eigenvecs = res_u
最佳答案
所以你正在寻找的东西,在 python
和 numpy
中是这样的(我冒昧地不“直接翻译” matlab
-code 到 python
和 numpy
,相反,我对它进行了一些重构,以“感觉”更多 python
[当然非常相似重构也可以应用于 matlab
-code]):
import numpy as np
def _cas(D):
"""Center at mean and standardize."""
return (D- D.mean(1)[:, None])/ (D.shape[1]- 1)** .5
def example(D):
"""Eigenvalues and -vectors, based on SVD."""
u, s, v= np.linalg.svd(D, full_matrices= False);
return np.diag(s)** 2, u
if __name__ == '__main__':
data= np.random.rand(5, 20)
data= _cas(data) # preprocess data according to your requirements
eigenvals, eigenvecs= example(data)
print eigenvals
print eigenvecs
但是您遇到了性能问题?
您现在能否更具体地说明您目前的表现,以及您真正期望它应该提高多少? FTIW 在我的小型计算机中,随机 (500, 20000) 矩阵将花费执行 example(.)
大约 20 秒。
我可以轻而易举地(由于基本的线性代数)将执行时间减少到 2.5 秒这样的水平(几乎提高了 10 倍)!现在,如果您正在寻找比这更好的性能,那么请详细说明您的数据
的“性质”!
您的数据来自哪里?使用计算出的特征值和向量的具体情况是什么?即,您要实现的主要目标是什么?
关于Python:相当于 Matlab 的 svds(A, k) 用于大型数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4974808/