Untitled

 avatar
unknown
python
2 years ago
2.2 kB
4
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...