【发布时间】:2021-10-01 01:16:45
【问题描述】:
我需要找到具有数千个变量的成本函数的最小值。成本函数只是一个最小二乘计算,可以使用 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())
【问题讨论】:
-
你有你的成本函数和你使用的最小化器的示例代码吗?一些最小化器可能会很慢,例如:Nelder Mead,而有些则更快一些,例如 COBYLA。而且由于这些最小化器中的许多经常调用 FORTRAN 实现或类似的实现,因此求解器基本上与它获得的一样快。不过,调整一些参数可能有助于提高速度,例如最大迭代次数。
-
除了 cmbfast 的评论:您是否提供了准确的客观梯度和粗麻布?如果不是,则两者都由有限差分近似,这反过来导致对梯度的每个评估的目标进行许多评估。因此,提供精确的梯度和 hessian 可以显着加快优化速度。
-
查看完整的输出,它应该会告诉您调用目标的次数。
-
添加了示例代码。我使用了基本模型最小化器,没有任何方法规范。请注意,我的方法受此启发:papers.ssrn.com/sol3/papers.cfm?abstract_id=1971363
-
我的猜测是最小化 7500 个值需要很多函数调用。如果时间随着值的数量呈指数增长,我不会感到惊讶。
标签: python numpy optimization scipy runtime