Теоретическое домашнее задание 13

Задача 3

Используя метод линейной регрессии, постройте приближение функции $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)


[[ 3.9]
 [ 5. ]
 [ 5.7]
 [ 6.5]
 [ 7.1]
 [ 7.6]
 [ 7.8]
 [ 8.1]
 [ 8.4]]

Рассмотрим регрессор.


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)


[[   1.       4.      16.      64.   ]
 [   1.       5.2     27.04   140.608]
 [   1.       6.1     37.21   226.981]
 [   1.       7.      49.     343.   ]
 [   1.       7.9     62.41   493.039]
 [   1.       8.6     73.96   636.056]
 [   1.       8.9     79.21   704.969]
 [   1.       9.5     90.25   857.375]
 [   1.       9.9     98.01   970.299]]

Воспользуемся классической формулой для получения оценки.


In [33]:
Theta = inv(X.T @ X) @ X.T @ Y
print(Theta)


[[ -1.37289441e-01]
 [  1.07154906e+00]
 [ -1.14849960e-02]
 [ -1.00145913e-03]]

Построим график полученной функции и нанесем точки выборки.


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()


Вывод. Кубический многочлен, полученный методом линейной регресии, отлично приближает данную функцию. По графику видно, однако, что ее может хорошо приблизить и линейный многочлен.


_ Странно, что в этом задании ничего больше не требуют, но что просили, то я и сделал. Даже график построил._