Нахождение коэфициентов регерсии
Разбирая статьи с хабра https://habr.com/ru/company/ods/blog/322076/ https://habr.com/ru/company/ods/blog/323890/ возникли вопросы
Есть функция y=sin2x+1.5
В Python есть массив значений пар переменных x и y по данной функции с шумом
На основании значений массива переменных x и y хочу аппроксимировать функцию y=sin(w*x)+b Т.е. мне нужно подобрать значения коэффициентов функции а точнее параметры w и b через МНК (метод наименьших квадратов) для этого беру частные производные делаю систему уравнений и приравниваю 0 Как дорешать данную систему уравнений и подобрать коэффициенты?
Ответы (1 шт):
Используем замену переменных. z= sin2x. Получаем линейное уравнение и работаете с ним по МНК, так как это описано в любом учебнике по статистике. Получив ур-ние регресси делаем обратное преобразование.
Градиентный спуск в данном случае - из пушки по воробьям. Можно, но зачем? Его имеет смысл применять когда либо функция преобразования неизвестна, либо когда она очень сложная.
Решение по аналитическому выражению:
import numpy as np
import matplotlib.pyplot as plt
x=np.linspace(0, 6,600)
z=np.sin(2*x)
y=z+1.5+np.random.normal(0,0.1,size=600)
plt.scatter(x,y)
numerator=np.sum((z-np.mean(z))*(y-np.mean(y)))
denominator=np.sum((z-np.mean(z))**2)
b1=numerator/denominator
b0=np.mean(y)-b1*np.mean(z)
y_pred=b0+b1*z
plt.plot(x,y_pred, c='r', lw=4)
Получаем:
b0=1.5027653096440527
b1=0.9961296416892985


