我需要找到一个有几千个变量的成本函数的最小值。成本函数只是一个最小二乘计算,可以通过numpy矢量化轻松快速地计算。尽管如此,优化仍然需要很长时间。我的猜测是,运行速度慢是发生在SciPy的最小化器中,而不是我的成本函数中。如何更改SciPy最小化器的参数以加快运行速度?
样本代码:
import numpy as np
from scipy.optimize import minimize
# random data
x = np.random.randn(100, 75)
# initial weights guess
startingWeights = np.ones(shape=(100, 75))
# random y vector
y = np.random.randn(100)
def costFunction(weights):
# reshapes flattened weights into 2d matrix
weights = np.reshape(weights, newshape=(100, 75))
# weighted row-wise sum
weighted = np.sum(x * weights, axis=1)
# squared residuals
residualsSquared = (y - weighted) ** 2
return np.sum(residualsSquared)
result = minimize(costFunction, startingWeights.flatten())
字符串
2条答案
按热度按时间y53ybaqx1#
正如在注解中已经提到的,强烈建议为具有
N = 100*75 = 7500
变量的大型问题提供精确的目标梯度。在没有提供梯度的情况下,它将通过有限差分和approx_derivative
函数来近似。然而,有限差分是容易出错的,并且由于梯度的每个评估需要目标函数的2*N
评估(没有缓存),计算成本很高。这可以通过对目标和近似梯度进行定时来容易地说明:
字符串
因此,在我的机器上,每个梯度评估都需要半秒钟以上!评估梯度的更有效的方法是算法微分。使用JAX库非常简单:
型
在这里,
value_and_grad
创建一个函数,用于评估目标和梯度,并返回两者,即obj_value, grad_values = obj_and_grad(x0)
。让我们计算这个函数的时间:型
因此,我们现在评估目标和梯度的速度比以前快了近5000倍。最后,我们可以通过设置
jac=True
来告诉minimize
我们的目标函数返回目标和梯度。所以呢型
应该显著地加速优化。
PS:您也可以尝试通过cyipopt软件包连接的最先进的Ipopt求解器。它还提供了一个类似于scipy的接口,类似于scipy. optimize. minimize。
8hhllhi22#
成本函数只是一个最小二乘计算
不要使用最小化,使用least-squares-如果它确实是,你需要的,-示例:
字符串
shape(100,75)
(同样,* 对于你的最小化方法,你只需要x0=shape(75)
作为coeffs_* 的init_guess-如果你真的需要的话)-因为x 0只是init_coeffs_param(或theta
)来优化与您的init_data(100,75)-xs...如果是-可以看到LS-Optimization-描述的一些机会(包括Jacobi方法(e.g. impl),预处理,稀疏矩阵的共轭梯度[成为您的多维数据,使用2-范数条件数,如果您的数据是空间的] -进行旋转以更好地选择最小化中的步长方向等)......
P.S. When matrices grow up-需要矩阵分解