【问题标题】:Faster way of finding least-square solution for large matrix为大型矩阵找到最小二乘解的更快方法
【发布时间】:2018-10-21 15:30:24
【问题描述】:

我想找到一个矩阵的最小二乘解,我正在使用 numpy linalg.lstsq 函数;

weights = np.linalg.lstsq(semivariance, prediction, rcond=None)

我的变量的维度是;

semivariance 是一个大小为 5030 x 5030 的浮点数

prediction 是一个长度为 5030 的一维数组

我遇到的问题是返回 weights 的值大约需要 80 秒,而且我必须重复计算 weights 大约 10000 次,所以计算时间只是增加了。

有没有更快的方法/pythonic 函数来做到这一点?

【问题讨论】:

  • 我怀疑你会在 python 的速度上击败numpy implementation。特别是因为繁重的工作是由C & Fortran 完成的。这很可能是最好的通用实现。您将不得不重新考虑您的问题,这超出了 SO 的范围。
  • 由于semivariance是方阵,所以将其取反后使用dotproduct:weights = np.linalg.inv(semivariance).dot(prediction)会更快
  • 另外,我刚刚注意到你的系统是完全确定的,在这种情况下最好使用solve:weights = np.linalg.solve(semivariance, prediction)。上述两种方法都假设semivariance 是满秩的。
  • @user7436576,你在做kriging吗?
  • @WarrenWeckesser,是的。我在做克里金法

标签: python python-3.x numpy scipy least-squares


【解决方案1】:

@Brenlla 似乎是对的,即使您通过使用 Moore-Penrose 伪逆求解来执行最小二乘,它也比 np.linalg.lstsq 快得多:

import numpy as np
import time

semivariance=np.random.uniform(0,100,[5030,5030]).astype(np.float64)
prediction=np.random.uniform(0,100,[5030,1]).astype(np.float64)

start=time.time()
weights_lstsq = np.linalg.lstsq(semivariance, prediction, rcond=None)
print("Took: {}".format(time.time()-start))

>>> Took: 34.65818190574646

start=time.time()
weights_pseudo = np.linalg.solve(semivariance.T.dot(semivariance),semivariance.T.dot(prediction))
print("Took: {}".format(time.time()-start))

>>> Took: 2.0434153079986572

np.allclose(weights_lstsq[0],weights_pseudo)

>>> True

以上不是您的确切矩阵,但样本上的概念可能会转移。 np.linalg.lstsq 通过最小化 || b - a x ||^2 来执行优化问题,以求解 ax=b 中的 x。这通常在非常大的矩阵上更快,因此为什么线性模型通常在神经网络中使用梯度下降来解决,但在这种情况下,矩阵就不足以提高性能。

【讨论】:

    猜你喜欢
    • 2021-11-27
    • 2023-03-23
    • 2021-11-25
    • 2021-11-26
    • 2015-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-20
    相关资源
    最近更新 更多