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

标签 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

最佳答案

所以你正在寻找的东西,在 pythonnumpy 中是这样的(我冒昧地不“直接翻译” matlab-code 到 pythonnumpy,相反,我对它进行了一些重构,以“感觉”更多 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/

相关文章:

python - 更新 django 项目、跟踪更新的最佳方法

python - 安装匀称: OSError: [WinError 126] The specified module could not be found

python - 元组转换为字符串

matlab - 有没有更好的代码完成的 MATLAB 编辑器/插件/版本?

image - 当我们有 from 时,如何获得位移场或控制点向量?

python - 用所有相交条目的并集更新所有列表条目的最快方法

python - 连接 Pandas DataFrame 中的列值,用逗号替换 “NaN” 值

matlab - 将 Matlab 结构打印到文本文件

matlab - MATLAB 中两个连通分量之间的填充区域

Matlab 循环变量(初学者)