SciPy optimize.minimize()使用许多变量,没有可分析的可计算梯度

时间:2016-11-30 21:56:55

标签: python numpy optimization scipy gradient

我有以下问题要解决:

给定一个函数,它将变量向量作为参数,找到最小化函数返回值的值。输入向量的大小介于10^310^5元素之间。未提供分析梯度公式。

听起来像scipy.optimize.minimize()的问题;然而,由于数字变量和梯度函数的缺乏,计算速度非常慢,超过2000个参数不会收敛。

我有以下代码熟悉的代码(实际上使用它来进行图像注册,但问题更为笼统):

import numpy as np
from scipy import optimize

def opt_fun(smth1, smth2, con1, con2, con3, con4):
    def inner_opt_fun(arguments):
        arg1 = np.reshape(arguments[0:con1*con2], (con1, con2))
        arg2 = np.reshape(arguments[con1*con2:], (con3, con4))
        result = some_func(smth1, arg1, arg2)
        error = calc_error(result, smth2)
        return error
    return inner_opt_fun

fun = opt_fun(smth1, smth2, con1, con2, con3, con4)
start_args = generate_start_arguments()
bounds = get_bounds() # define some bounds to solver
bounds = reshape_bound(bounds) # to get 1xN vector
options = some_options() # solver options

optimized = optimize.minimize(fun, start_args, bounds=bounds, options=options)

some_func计算变量smth1的转换。

calc_error计算smth2返回的resultsome_func之间的某种错误。

通常,优化程序应该近似error向量arguments的渐变(或其他数量,这可能导致找到局部最小值)。

当向量start_args的长度低于10时,此代码工作正常。但是,涉及的变量越多,optimize.minimize函数执行的事情就越奇怪。在fun的每次调用期间,它仅更改arguments个向量的一个元素(缩放不是那里的问题 - 我在别处执行)。

例如,如果初始化的向量是[0, 0, 0, 0, 0, ... 0],则在第一次迭代后,优化器会尝试类似[1, 0, 0, 0, 0, 0, ... 0],然后[0, 1, 0, 0, 0, 0, ..., 0]的内容 - 对我而言,这是相当强力的方法。

我尝试了不同的优化器(BFGS,L-BFGS-B,Powell,Nelder-Mead - 我不是数学家,所以不要真正理解它们是如何在里面工作的),但它们根本不会收敛到任何东西。 / p>

问题是 - 问题出在哪里?我该怎么做才能实现融合?

0 个答案:

没有答案