首页 > 解决方案 > 如何优化参数的权重?

问题描述

我有三个参数(abc)并且想要找到它们的权重( 和 )的最佳组合w_aw_bw_c在 1 到 10 之间)。

y = ((w_a * a) + (w_b * b) + (w_c * c))/(w_a + w_b + w_c)

权重的最佳值是我们有 y 的最大值的地方。

我已经应用了敏感性分析(一个一个),但我想尝试一种优化方法。你会建议任何方法吗?

标签: pythonoptimization

解决方案


我不知道参数是什么,你的函数可以达到无穷大,最大化没有意义。然而,这是一种最大化功能的方法。

def func(args):
    a = 1
    b = 2
    c = 1
    w_a, w_b, w_c = args
    out = -((w_a * a) + (w_b * b) + (w_c * c))/(w_a + w_b + w_c)
    if out > 1000 or out < -1000:
        return 0
    return out

from scipy.optimize import minimize

x0 = [0.1, 2, 3]
res = minimize(func, x0, method='Nelder-Mead', tol=1e-6)

请注意,我将您的函数限制在 -1000、1000 内。我使用了 Nelder-Mead,但您也可以尝试其他优化算法。我还从函数中返回了一个负数,因为我们正在使用最小化例程,这相当于最大化函数。x0是您对函数权重的初始猜测值。

运行它会给你这个:

 final_simplex: (array([[ 0.18709895,  4.98366926, -5.16577956],
       [ 0.18709896,  4.98366968, -5.16577998],
       [ 0.18709896,  4.9836698 , -5.1657801 ],
       [ 0.18709896,  4.98366971, -5.16578001]]), array([-999.99999989, -999.99999967, -999.99999919, -999.99999909]))
           fun: -999.999999885923
       message: 'Optimization terminated successfully.'
          nfev: 281
           nit: 144
        status: 0
       success: True
             x: array([ 0.18709895,  4.98366926, -5.16577956])

res[x]会给你的 weights array([ 0.18709895, 4.98366926, -5.16577956]),从而最大化你的功能。现在您的功能已最大化并且具有res[fun] = -999.999999885923


推荐阅读