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