Используя метод линейной регрессии, постройте приближение функции $f$ многочленом третьей степени по следующим данным:
$f$ | 3.9 | 5.0 | 5.7 | 6.5 | 7.1 | 7.6 | 7.8 | 8.1 | 8.4 |
---|---|---|---|---|---|---|---|---|---|
$x$ | 4.0 | 5.2 | 6.1 | 7.0 | 7.9 | 8.6 | 8.9 | 9.5 | 9.9 |
In [12]:
import numpy
import scipy
from scipy.linalg import inv
import matplotlib.pyplot
%matplotlib inline
Решение.
_Ясно, что нам нужна модель $y=\theta_0 + \theta_1 x + \theta_2 x^2 + \theta_3 x^3$_.
In [9]:
n = 9 # Размер выборки
k = 4 # Количество параметров
Рассмотрим отклик.
In [10]:
Y = numpy.array([3.9, 5.0, 5.7, 6.5, 7.1, 7.6, 7.8, 8.1, 8.4]).reshape(n, 1)
print(Y)
Рассмотрим регрессор.
In [31]:
x = numpy.array([4.0, 5.2, 6.1, 7.0, 7.9, 8.6, 8.9, 9.5, 9.9])
X = numpy.ones((n, k))
X[:, 1] = x
X[:, 2] = x ** 2
X[:, 3] = x ** 3
print(X)
Воспользуемся классической формулой для получения оценки.
In [33]:
Theta = inv(X.T @ X) @ X.T @ Y
print(Theta)
Построим график полученной функции и нанесем точки выборки.
In [34]:
x = numpy.linspace(3.5, 10.4, 1000)
y = Theta[0] + x * Theta[1] + x ** 2 * Theta[2] + x ** 3 * Theta[3]
In [37]:
matplotlib.pyplot.figure(figsize=(20, 8))
matplotlib.pyplot.plot(x, y, color='turquoise', label='Предсказание', linewidth=2.5)
matplotlib.pyplot.scatter(X[:, 1], Y, s=40.0, label='Выборка', color='blue', alpha=0.5)
matplotlib.pyplot.legend()
matplotlib.pyplot.title('Функция $f(x)$')
matplotlib.pyplot.grid()
matplotlib.pyplot.show()
Вывод. Кубический многочлен, полученный методом линейной регресии, отлично приближает данную функцию. По графику видно, однако, что ее может хорошо приблизить и линейный многочлен.
_ Странно, что в этом задании ничего больше не требуют, но что просили, то я и сделал. Даже график построил._