#python #numpy #least-squares
#python #numpy #метод наименьших квадратов
Вопрос:
Предположим, что у нас есть два массива данных: x = [1,2,3] y = [2,4,6] Очевидно, что линейная подгонка вернет наклон 2 и перехват 0 и, конечно, обе процедуры в Numpy linalg.lstsq()
и polyfit()
являются успешными. Но они считают наклон и перехват параметрами для поиска.
Возможно ли сохранить фиксированный наклон и определить только перехват?
Ответ №1:
Если уравнение соответствия равно y = a*x b
, вы можете найти перехват b
, который наилучшим образом соответствует вашим данным, с учетом фиксированного наклона a = A
, как:
b = np.mean(y - A*x)
Если вместо этого у вас был фиксированный перехват b = B
и вы хотели найти наклон, наиболее подходящий для ваших данных, математика работает следующим образом:
a = np.dot(X, Y-B) / np.dot(X, X)
Комментарии:
1. Правда, для быстрого ответа (который я на самом деле использовал), но я думал о чем-то, что использовало бы преимущества алгоритмов в этих подпрограммах.
2. Я почти уверен, что нет встроенного по умолчанию метода для исправления некоторых параметров в подгонке, хотя это очень просто сделать, если вы знаете, как это работает внутри. Если вы можете предложить интерфейс, я могу составить PR для следующего выпуска numpy…
Ответ №2:
Вы могли бы использовать scipy.optimize.fsolve
:
X = np.array([1, 2, 3])
Y = np.array([2, 4, 6])
s = 2
def f(i):
"""Fixed slope 1-deg polynomial residuals"""
return ((Y - (s*X i))**2).sum()
Он работает примерно так же, как polyfit
:
In [37]: np.polyfit(X, Y, 1)
Out[37]: array([ 2.00000000e 00, 2.30755522e-15])
In [38]: fsolve(f, x0=1)
Out[38]: array([ 1.63883763e-16])
И изменение наклона:
In [39]: s = 4
In [40]: fsolve(f, x0=1)
Out[40]: array([-3.99075568])
Мы получаем новый оптимальный