Ортогональная регрессионная подгонка в методе скудных наименьших квадратов
Метод lesssq в scipy lib соответствует кривой некоторым данным. И этот метод подразумевает, что в этих данных значения Y зависят от некоторого аргумента X. И вычисляет минимальное расстояние между кривой и точкой данных по оси Y (dy)
Но что, если мне нужно вычислить минимальное расстояние в обеих осях (dy и dx)
Есть ли способ реализовать этот расчет?
Вот пример кода при использовании вычисления одной оси:
import numpy as np
from scipy.optimize import leastsq
xData = [some data...]
yData = [some data...]
def mFunc(p, x, y):
return y - (p[0]*x**p[1]) # is takes into account only y axis
plsq, pcov = leastsq(mFunc, [1,1], args=(xData,yData))
print plsq
Недавно я попробовал библиотеку scipy.odr и вернул правильные результаты только для линейной функции. Для других функций, таких как y = a * x ^ b, он возвращает неверные результаты. Вот как я его использую:
def f(p, x):
return p[0]*x**p[1]
myModel = Model(f)
myData = Data(xData, yData)
myOdr = ODR(myData, myModel , beta0=[1,1])
myOdr.set_job(fit_type=0) #if set fit_type=2, returns the same as leastsq
out = myOdr.run()
out.pprint()
Это возвращает неверные результаты, не желаемые, а в некоторых входных данных даже не приближается к реальным.
Может быть, есть некоторые специальные способы его использования, что я делаю неправильно?
Ответы
Ответ 1
Я нашел решение. Scipy Odrpack работает норамально, но для правильных результатов требуется хорошая начальная догадка. Поэтому я разделил процесс на два этапа.
Первый шаг: найдите начальное предположение, используя метод наименьших квадратов ordinaty.
Второй шаг: подстановка этих исходных предположений в ODR как параметр beta0.
И он отлично работает с приемлемой скоростью.
Спасибо, ребята, ваш совет направил меня к правильному решению
Ответ 2
scipy.odr
реализует ортогональную дистанционную регрессию. См. Инструкции по базовому использованию в docstring:
https://github.com/scipy/scipy/blob/master/scipy/odr/odrpack.py#L27
Ответ 3
Если/когда вы можете инвертировать функцию, описанную p, вы можете просто включить x-образную (y) в mFunc, я предполагаю, что sqrt (a ^ 2 + b ^ 2), поэтому (псевдокод)
return sqrt( (y - (p[0]*x**p[1]))^2 + (x - (pinverted(y))^2)
например, для
y=kx+m p=[m,k]
pinv=[-m/k,1/k]
return sqrt( (y - (p[0]+x*p[1]))^2 + (x - (pinv[0]+y*pinv[1]))^2)
Но то, о чем вы просите, в некоторых случаях проблематично. Например, если кривая полинома (или ваша x ^ j) имеет минимум ym в точке y (m) и у вас есть точка x, y ниже ym, какое значение вы хотите вернуть? Там не всегда есть решение.
Ответ 4
У меня есть линейное уравнение: g (t +1) = s/k * g (t) * t +1/k * t +g (t) Итак: g (t) и t = it matrix.
s, k = значение, которое я хочу найти для продукта g (t +1). Итак, я хочу написать код с использованием TLS. Кто-нибудь может мне помочь?!