寻找大型矩阵最小二乘解的更快方法

Faster way of finding least-square solution for large matrix

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

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

我的变量的维度是;

semivariance 是一个大小为 5030 x 5030

的浮点数

prediction 是一个长度为 5030

的一维数组

我遇到的问题是 return weights 的值大约需要 80 秒,我必须重复计算 weights 大约 10000 次,所以计算时间只是升高。

是否有更快的 way/pythonic 函数来执行此操作?

@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 来执行优化问题。这通常在非常大的矩阵上更快,因此为什么线性模型通常在神经网络中使用梯度下降来求解,但在这种情况下,矩阵不够大,无法获得性能优势。