【发布时间】:2022-01-11 21:27:23
【问题描述】:
我有几个在外部库中定义的函数。我无法更改这些函数的参数或内容。以下面的函数为例(虽然原来的要复杂得多):
def func1(info: dict) -> float:
return 1 - (1.5 * info["b"] - info["a"])
def func2(info: dict) -> float:
return 1 - (np.exp(info["c"]) - info["a"])
我有一个初步的猜测,我正在尝试应用scipy.optimize.least_squares 来找到最佳值以最小化func1 或func2(不是同时),即目标是这样的
import scipy
def func1(info: dict) -> float:
return 1 - (1.5 * info["b"] - info["a"])
def func2(info: dict) -> float:
return 1 - (np.exp(info["c"]) - info["a"])
initial_dict = {"a" : 5, "b" : 7}
result = scipy.optimize.least_squares(func1, initial_dict)
initial_dict["c"] = 3
result2 = scipy.optimize.least_squares(func1, initial_dict)
问题是least_squares 只接受floats,而不接受dicts。我认为可以将字典的值转换为列表并编写一个“包装器”函数将列表转换回字典,即
def func1_wrapped(lst: list[float]) -> float:
a, b, c = lst
tmp_dict = {"a" : a, "b": b, "c": c}
return func1(tmp_dict)
result1 = scipy.optimize.least_squares(func1_wrapped,[5, 7, 3])
这样的事情合理吗?有没有更好、更有效的方法?
【问题讨论】:
-
“这样的事情合理吗?” 是的,你需要这样的包装器。
-
Lmfit 使用类似的方法。你应该看看它
标签: python dictionary scipy least-squares