python SciPy最小化:仅提供奇整数作为所述成本函数的参数

klh5stk1  于 2023-06-20  发布在  Python
关注(0)|答案(1)|浏览(99)

我尝试将SciPyoptimize模块中的minimize应用于我自己的成本函数:

result = minimize(cost_function, initial_params, args = (TEXT_IMG, BINARY_MASK), method = 'BFGS')

我需要第一个参数是一个奇数,比如31:

initial_params = np.array([31, 2, -7])

但是minimize开始在31周围迭代,只使用浮点数,我的代价函数崩溃了;是否有可能实现边界和约束,以便minimize保持提供数字,如31,29,33等?
我已经读到我可能需要使用differential_evolution而不是minimize,但只是为了确保。

编辑

这是成本函数:

def abs_diff(mask1, mask2):

    diff = np.abs(mask1 - mask2)
    mean_diff = np.mean(diff)

    return mean_diff

def cost_function(params, text_img, binary_mask):
    
    blockSize, C, h = params
    hColor = -3
    templateWSize = 5
    searchWSize = 5

    denoised = cv2.fastNlMeansDenoisingColored(text_img, h, hColor, templateWSize, searchWSize)
    gray_denoised = cv2.cvtColor(denoised, cv2.COLOR_BGR2GRAY)
    imgf = cv2.adaptiveThreshold(gray_denoised, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, blockSize, C)

    error = abs_diff(binary_mask * 255, imgf)
            
    return error
oxf4rvwz

oxf4rvwz1#

像BFGS这样的方法不太适合离散值参数。
实用的解决方案是对所有16个blockSize值进行优化,并选择最佳结果。
或者,您可以在使用之前通过缩放和舍入blockSize来“欺骗”,以使初始发行版具有良好的覆盖率。
如果你有更多的离散参数(尤其是布尔型参数),那么另一种选择是将这个问题视为超参数优化。要么对这些参数进行随机搜索,要么使用类似ray tune的东西,这基本上是一个并行的随机搜索,当它开始看起来很糟糕时,它也支持在内部“训练循环”上提前停止。(内部循环将使用比随机搜索更强的算法来优化剩余的连续参数。
另一种替代方法是CEM(交叉熵方法),它允许混合离散和连续分布。但是对于实值参数,它可能会收敛到比BFGS更差的解。遗传算法也可以工作,但是考虑到你使用的是scipy.optimize,它可能会涉及太多的设置和手工制作。

相关问题