linalg.lstsq с фиксированным наклоном?

#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])
 

Мы получаем новый оптимальный