Минимизация границ наименьших квадратов

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

В первый раз я пытаюсь настроить начальные значения параметров с помощью команды «xtol», которые указывают желаемую ошибку в приближенном решении, но результаты не лучше, поэтому я хотел бы знать, можно ли указать границы для каждый параметр. Это последнее решение может быть более точным, не так ли?

Кроме того, термины, которые мне нужно подобрать, являются параметрами ряда, возможно, есть лучший способ решить эту проблему, чем я сделал, написав 2 заказа...

def residual_V2will2(vars, XA, YA, x0, y0, A2, donnees):
    aI = vars[0]
    aII = vars[1]
    modeleV2 = ma.masked_invalid(np.sqrt((XA-x0)**2 + (YA-y0)**2)**(1/2)*aI/(2*G)*((Kappa - 1/2. + \
    1)*np.sin(np.arctan(((YA-y0)/(XA-x0)))/2) + \
    1/2.*np.sin(np.arctan(((YA-y0)/(XA-x0)))*(-3/2.))) + np.sqrt((XA-x0)**2 + \
    (YA-y0)**2)*aII/(2*G)*((Kappa - 2)*np.sin(np.arctan(((YA-y0)/(XA-x0)))) + \
    np.sin(np.arctan(((YA-y0)/(XA-x0)))*(-1))) + A2) 
    return (donnees-modeleV2)

from scipy.optimize import leastsq
vars = [KI, A2, x0, y0]
out_V_west = sco.leastsq(residual_V2west, vars, args=(XAvect, YAvect, Vmvect))
print out_V_west

Итак, если я следую за вами, у меня должно быть что-то вроде этого:

def residual_V2west(vars, XA, YA, donnees):
    KI = vars[0]
    A2 = vars[1]
    x0 = vars[2]
    y0 = vars[3]
    modeleV2 =  ...
    penalization = abs(2.-modeleV2)*10000
    return (donnees-modeleV2 - penalization)

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


person user3601754    schedule 28.09.2014    source источник
comment
в этом ответе рассказывается, как включить штрафы в остаточную функцию... вы можете сделать то же самое для своей проблемы, если значения выйти за пределы...   -  person Saullo G. P. Castro    schedule 28.09.2014
comment
Я пытаюсь ограничить количество параметров, чтобы соответствовать, я могу иметь представление о x0 и y0, но только с двумя параметрами у меня та же проблема... возможно, моя модель не очень хороша... :/   -  person user3601754    schedule 29.09.2014
comment
Я считаю, что количество параметров не проблема... возможно, следует включить штраф, например (donnees - modeleU2 + penalization)   -  person Saullo G. P. Castro    schedule 30.09.2014
comment
Действительно, когда я изменяю условия инициализации, результаты другие...: это говорит о том, что вы попадаете в различные локальные минимумы. С довольно небольшим количеством параметров подгонка может стать сложной, и подгонка может довольно легко застрять внутри локального минимума. Я думаю, что сложная функция не помогает. Может помочь, если все ваши параметры (var, XAvect, YAvect, Vmvect) разумно нормализованы, т. е. порядка ~1.   -  person    schedule 30.09.2014
comment
Возможно, это так, но моя функция — это серия расширений, возможно, я мог бы избежать этой проблемы, поскольку я в особом случае? Это ряд Вильямса, описывающий перемещения вблизи вершины трещины...   -  person user3601754    schedule 30.09.2014
comment
Если это может быть, вы должны исследовать. Каков примерный порядок ваших входных данных? Не могли бы вы привести какие-то цифры, или, может быть, у вас есть цифра с данными?   -  person    schedule 30.09.2014
comment
У меня есть хороший опыт работы с lmfit, который позволяет ограничивать переменные и многое другое. Я бы рекомендовал не использовать штрафные функции, а скорее выполнение преобразования для обеспечения соблюдения границ, которые приводят к нефизическим значениям вашей функции   -  person chthonicdaemon    schedule 30.09.2014