Untitled
unknown
python
3 years ago
2.2 kB
9
Indexable
import numpy as np
x = np.array([-9.93841085, -8.2398223 , -9.06505398, -7.35203062, -5.82847285,
-5.08181713, -3.37174708, -3.6361873 , -0.06175255, 0.09106786,
1.46721029, 0.41053496, 1.71012239, 1.84871104, 6.68526793,
6.82543486, 6.64741998, 8.01775519, 8.57773967, 11.8291112 ])
y = np.array([ 0.99747243, 3.28729745, 2.0644648 , 2.88068415, -0.05454181,
0.63703982, 0.06238763, 0.25253028, 0.06582577, 0.05755049,
0.20686123, -0.03885818, 0.40837474, 0.52833438, 0.25072492,
0.26994154, 0.29157405, 0.52908138, -0.04000158, -0.98596774])
# Функция потерь и её градиент.
def f(X, y, w):
return np.mean((X @ w - y)**2)
def grad(X, y, w):
return 2 / len(X) * X.T @ (X @ w - y)
# Составляем матрицу X.
X = np.stack([
x ** 2,
x,
np.ones(len(x))
], axis=1)
# Инициализируем веса модели.
w = np.array([1, 2, 3])
# Производим градиентный спуск.
gamma = 1e-3
max_iter = 10000
eps = 1e-5
# Делаем один шаг, чтобы проверить, что мы ещё не в минимуме.
f_old = f(X, y, w)
w = w - gamma * grad(X, y, w)
f_new = f(X, y, w)
# Текущий шаг.
i = 1
# Основной цикл.
while np.abs(f_new - f_old) > eps and i < max_iter:
# Обновляем веса.
w = w - gamma * grad(X, y, w)
# Увеличиваем номер шага и обновляем значения функции.
i = i + 1
f_old = f_new
f_new = f(X, y, w)
result = w
print(result)
print(f(X, y, w))
# Код для построения графика с предсказанием обученной функции.
# Раскомментируйте его чтобы график построился.
#from matplotlib import pyplot as plt
#plt.figure(figsize=(8, 6))
#plt.scatter(x, y, s=100)
#X_plot = np.stack([
# np.linspace(x.min(), x.max(), 30),
# np.linspace(x.min(), x.max(), 30) ** 2,
# np.linspace(x.min(), x.max(), 30) ** 3,
# np.ones(30)
#], axis=1)
#plt.plot(X_plot[:, 0], X_plot @ w, c="C1", linewidth=2)Editor is loading...