我正在尝试将一些代码从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
答案 0 :(得分:3)
所以你要找的是python
和numpy
中的这类内容(我冒昧地不将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代码段中没有出现类似内容。