【问题标题】:python scipy brute optimizationpython scipy蛮力优化
【发布时间】:2017-02-06 23:08:46
【问题描述】:

我想找到可以最小化函数的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_必须等于0。

但是 resbrute[0] 返回一些奇怪的值

【问题讨论】:

  • 为什么会有熊猫?它无处不在......
  • 尝试将finish=None添加到otpimize.brute
  • 没有帮助。 resbrute[0] = 0(必须为 2)

标签: python optimization scipy brute-force


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-05
    • 2020-01-20
    • 1970-01-01
    相关资源
    最近更新 更多