我正在尝试将一些代码从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,而是重构了一点”感觉’更pythonic [ of’course非常相似的重构也可以应用于matlab代码]):
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)矩阵将花费大约20秒执行示例(.).
我可以琐碎(由于基本的线性代数)将执行时间缩短到2.5秒(最多10倍的改进)!现在,如果您正在寻找比这更好的性能,那么请详细说明数据的“性质”!
您的数据来自哪里?您使用计算的特征值和-vectors的具体情况是什么?即你的主要目标是什么?
标签:python,matlab
来源: https://codeday.me/bug/20190521/1149155.html