python - 如何优化参数的权重?
问题描述
我有三个参数(a
、b
和c
)并且想要找到它们的权重( 和 )的最佳组合w_a
(w_b
即w_c
在 1 到 10 之间)。
y = ((w_a * a) + (w_b * b) + (w_c * c))/(w_a + w_b + w_c)
权重的最佳值是我们有 y 的最大值的地方。
我已经应用了敏感性分析(一个一个),但我想尝试一种优化方法。你会建议任何方法吗?
解决方案
我不知道参数是什么,你的函数可以达到无穷大,最大化没有意义。然而,这是一种最大化功能的方法。
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
推荐阅读
- python - 如何为字典值生成随机键?
- asp.net-mvc - 如何使用实体框架将基类转换为派生类
- python - 如何添加复制某些列的新行,但在其他列中分配新值
- flutter - 颤动中自动扩展容器——适用于所有设备
- javascript - div onclick 不触发(css 动画箭头,可能的 div 大小/覆盖问题)
- javascript - 如何在从一个域重定向到另一个域时将数据传递到另一个域
- python - OneHotEncoder 更改名称列
- hive - 如何正确设置 SerDe XML 架构?
- powerbi - 基于 Power Bi 中的多个切片器计算结果行的数量
- hdbscan - 如何在 HDBSCAN 中打印输出结果