scipy 'Минимизировать сумму квадратов набора уравнений'

StackOverflow https://stackoverflow.com/questions/1488227

  •  18-09-2019
  •  | 
  •  

Вопрос

Я столкнулся с проблемой в процедуре оптимизации scipy «leastsq», если я выполню следующую программу, в которой говорится:

    raise errors[info][1], errors[info][0]
TypeError: Improper input parameters.

и иногда index out of range for an array...

from scipy import *
import numpy
from scipy import optimize
from numpy import asarray
from math import *

def func(apar):
  apar = numpy.asarray(apar)
  x = apar[0]
  y = apar[1]
  eqn = abs(x-y)
  return eqn

Init = numpy.asarray([20.0, 10.0])
x = optimize.leastsq(func, Init, full_output=0, col_deriv=0, factor=100, diag=None, warning=True)
print 'optimized parameters: ',x
print '******* The End ******'

Я не знаю, в чем проблема с моим вызовом funcOptimize.leastsq(), пожалуйста, помогите мне

Это было полезно?

Решение

leastsq работает с векторами, поэтому функция невязки, func, необходимо вернуть вектор длины не менее двух.Итак, если вы замените return eqn с return [eqn, 0.], ваш пример сработает.Запуск дает:

optimized parameters:  (array([10., 10.]), 2)

что является одним из многих правильных ответов на вопрос минимума абсолютной разницы.

Если вы хотите минимизировать скалярную функцию, fmin это путь, optimize.fmin(func, Init).

Проблема здесь в том, что эти две функции, хотя и выглядят одинаково для скаляров, преследуют разные цели. leastsq находит наименьшую квадратичную ошибку, как правило, из набора идеализированных кривых, и это всего лишь один из способов достижения «наилучшего соответствия».С другой стороны fmin находит минимальное значение скалярной функции.

Очевидно, что ваш пример игрушечный, для которого ни один из этих вариантов не имеет смысла, поэтому путь, по которому вы пойдете, будет зависеть от вашей конечной цели.

Другие советы

Поскольку вы хотите минимизировать простую скалярную функцию (func() возвращает одно значение, а не список значений), scipy.optimize.leastsq() следует заменить вызовом одного из fmin функции (с соответствующими аргументами):

x = optimize.fmin(func, Init)

правильно работает!

Фактически, leastsq() минимизирует сумму квадратов списка значений.Похоже, что он не работает с (списком, содержащим) одно значение, как в вашем примере (хотя теоретически это возможно).

Просто глядя на Документация по методу наименьших квадратов, возможно, ваша функция func определяется неверно.Вы предполагаете, что всегда получаете массив длиной не менее 2, но функция оптимизации не дает четкого представления о длине массива, который вы получите.Вы можете попробовать написать, чтобы просмотреть что-нибудь apar то есть, чтобы увидеть, что вы на самом деле получаете.

Если вы используете что-то вроде ipython или оболочку Python, вы должны получить трассировки стека, которые точно покажут вам, в какой строке возникает ошибка, поэтому начните с нее.Если вы не можете это понять, публикация трассировки стека, вероятно, нам поможет.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top