python scipy 暴力优化

python scipy brute optimization

我想找到 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] returns 一些奇怪的值

如果我没看错,您只是在尝试恢复您在原始数据中应用的 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.