Python:相当于Matlab的大型数组的svds(A,k)?

时间:2011-02-11 22:43:18

标签: python matlab

我正在尝试将一些代码从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

2 个答案:

答案 0 :(得分:3)

所以你要找的是pythonnumpy中的这类内容(我冒昧地不将matlab - 代码直接翻译成{{1} }}和python,相反,我重构了一点“感觉”更多numpy [of'course非常类似的重构也可以应用于pythonic - 代码]:

matlab

但是你有性能问题吗?

您现在可以更具体地了解您当前的表现,以及您应该加强多少期望它? FTIW在我的适度计算机中,随机(500,20000)矩阵将花费大约20秒执行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

我可以琐碎(由于基本的线性代数)将执行时间缩短到2.5秒(最多10倍的改进)!现在,如果您正在寻找比此更好的性能,那么请详细说明example(.)的“性质”!

您的数据来自哪里?您使用计算的特征值和-vectors的具体情况是什么?那你的主要目标是什么?

答案 1 :(得分:2)

如果你的矩阵很稀疏,你可以在最近的scipy发行版中使用scipy.sparse.linalg.svds。它在ARPACK中包装稀疏的SVD例程。根据我的经验,它是错误的(不确定这是scipy或ARPACK的错误),所以我建议运行测试来检查奇异值是否符合预期。

如果您的矩阵是密集的,那么500乘20000很大但现在在商品桌面上难以处理。您 使用numpy.linalg.svd致电full_matrices=False,对吧?

你在使用numpy.corrcoef做什么用途?您发布的MATLAB代码段中没有出现类似内容。

相关问题