python - 如何在 SciPy 的 optimize.minimize 中动态设置变量的数量

我让这段代码可以很好地优化多个变量。

def f(params):

    a, b, c = params 
    return a**2 + b**2 + c**2

initial_guess = [1, 1, 1]
result = optimize.minimize(f, initial_guess)
if result.success:
    fitted_params = result.x
    print(fitted_params)
else:
    raise ValueError(result.message)

是否可以修改代码,使参数个数可以动态传递给f?例如,我想要这样的东西。

def f(params, paramsNumber):
    if paramsNumber == 3:
        a, b, c = params 
        return a**2 + b**2 + c**2
    elif paramsNumber == 2:
        a, b  = params 
        return a**2 + b**2 

if paramsNumber == 3:
    initial_guess = [1, 1, 1]
elif paramsNumber == 2:
    initial_guess = [1, 1]
result = optimize.minimize(f, initial_guess)
if result.success:
    fitted_params = result.x
    print(fitted_params)
else:
    raise ValueError(result.message)

非常感谢!

回答1

您可以迭代目标函数中的参数,并且可以使用一些通用初始化,例如,我只是使用了 numpy 的,它创建了一个具有给定数量的数组。

import numpy as np
from scipy import optimize
def f(params):
    return sum(a**2 for a in params)
def find_sol(paramsNumber):
    initial_guess = np.ones(paramsNumber)
    result = optimize.minimize(f, initial_guess)
    if result.success:
        return result.x
    raise ValueError(result.message)
find_sol(4)
array([-3.15727582e-08, -3.15727581e-08, -2.06550776e-09, -2.06550765e-09])

相似文章

随机推荐

最新文章