我想找到将功能最小化的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/

10-10 13:13