我想找到将功能最小化的some_arg
值。
1)进口
from scipy import optimize
import math as m
2)计算原始2 * sin(t)数据
time_steps = list(range(0,20))
def my_sin(time_steps):
sin_data = list()
for time_step in time_steps:
sin_data.append(2*m.sin(time_step))
return sin_data
my_sin_data = my_sin(time_steps)
3)我想最小化的设置错误
def fun_to_brute(z, *params):
some_argument = z
sum_of_errors = 0
for time_step in params[0]:
sum_of_errors = sum_of_errors + some_argument*m.sin(time_step) - params[1][time_step]
return sum_of_errors
4)最后开始蛮力
rranges = [slice(-4, 4, 0.25)]
params = (time_steps, my_sin_data)
resbrute = optimize.brute(fun_to_brute, rranges, args = params, full_output=True)
但是我得到的结果是错误的。我希望蛮力使
some_arg
值2,在这种情况下,sum_of_errors
_必须等于零。但是resbrute [0]返回一些奇怪的值
最佳答案
如果我没看错,您只是在尝试恢复在原始数据中应用的2
比例因子。
您可以简化一些事情。请注意,range和args参数要求使用元组。还请注意,您正在寻找的东西应该是您要调用的函数的主要参数。
通常,您可以通过比较模型之间的差异(如使用parameter_of_interest计算得出的模型以及实验数据中的模型)来最小化残差平方和或其他一些误差度量:
import numpy
import scipy
from scipy import optimize
def f(param_of_interest, *args):
sin_data = args[0]
time_steps = args[1]
model = param_of_interest * numpy.sin(time_steps)
ssq_residuals = numpy.sum((model - sin_data) ** 2)
return ssq_residuals
# Your input data
time_steps = numpy.arange(20)
factor = 2
sin_data = factor * numpy.sin(time_steps)
result= scipy.optimize.brute(f,
(slice(-4, 4, 0.25),),
args=(sin_data, time_steps),
full_output=True)
print(result) # Gives expected answer of 2.
关于python - python scipy蛮力优化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42069650/