⚙️ Квадрат разницы между y_pred и y будет равен:
Q(y_pred, yᵢ)) = 1/n * ∑ loss(y_pred, yᵢ) — вот мы и получили эмпирический риск
Please open Telegram to view this post
VIEW IN TELEGRAM
📱 Seaborn — библиотека для создания статистических графиков на языке Python. Она построена на основе библиотеки Matplotlib и тесно интегрирована со структурами данных из Pandas.
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
y_pred = model_a(x, w)
Q = loss(y_pred, y).mean()
sns.lineplot(x = x, y = y_pred, color = 'red')
sns.scatterplot(x = x, y = y)
plt.show()
def model_a(m_x, m_w):
return m_w[1] * m_x + m_w[0]
def loss(y_pred, y):
return (y_pred - y) ** 2
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(0)
x = np.arange(-1.0, 1.0, 0.1)
size_train = len(x)
w = [0.5, -0.3]
# model_a = lambda m_x, m_w: (m_w[1] * m_x + m_w[0])
def model_a(m_x, m_w):
return m_w[1] * m_x + m_w[0]
# loss = lambda y_pred, y: (y_pred - y) ** 2
def loss(y_pred, y):
return (y_pred - y) ** 2
y = model_a(x, w) + np.random.normal(0, 0.1, len(x))
y_pred = model_a(x, w)
Q = loss(y_pred, y).mean()
sns.lineplot(x = x, y = y_pred, color = 'red')
sns.scatterplot(x = x, y = y)
plt.show()
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
и вычислить коэффициенты w, используя Q (средний эмпирический риск при MSE).
X = [[1, 1],
[1, 2],
[1, 3]]
Y = [[2.1], — Это наши True значения
[2.9],
[3.8]]
Xᵀ = [[1,1,1],[1,2,3]]
Xᵀ @ X =
[[1, 1, 1], [[1, 1],
[1, 2, 3]] x [1, 2],
[1, 3]]
= [[1*1 + 1*1 + 1*1, 1*1 + 1*2 + 1*3],
[1*1 + 2*1 + 3*1, 1*1 + 2*2 + 3*3]]
= [[3, 6],
[6, 14]]
Xᵀ Y = [[1,1,1],[[2.1],[1,2,3]]x[2.9],[3.8]]=[[1∗2.1+1∗2.9+1∗3.8],[1∗2.1+2∗2.9+3∗3.8]]=[[8.8],[19.3]]
[-6, 3]]
[-6, 3]] @ [[8.8],
[19.3]] = [[7.4],
[5.1]]
Завтра +- все это мы интерпретируем в виде кода, там полегче будет намного. Даже эта писанина сверху — это не сложно, просто попытайтесь вникнуть в то, что я написал.
Please open Telegram to view this post
VIEW IN TELEGRAM
import numpy as np
np.random.seed(0) # Здесьможем ставить любое число в скобки
x = np.arange(-1.0, 1.0, 0.1) # будет вот так - [-1. , -0.9, -0.8, ..., 0.8, 0.9]
Y = -5.2 + 0.7 * x + np.random.normal(0, 0.1, len(x))
# w0 = -5.2 — сдвиг
# w1 = 0.7 — коэффициент наклона
# np.random.normal(0, 0.1, len(x)) — случайный шум с нормальным распределением (среднее 0, стандартное отклонение 0.1)
X = np.column_stack((np.ones(len(x)), x))
X =
[[ 1. -1. ]
[ 1. -0.9]
..............
[ 1. 0.9]]
w = np.linalg.inv(X.T @ X) @ X.T @ Y
x = [-1. -0.9 -0.8 ... 0.9] # (20,)
Y = [-5.14 -5.05 -4.79 ... -4.58] # (20,)
x.shape == (20,)
Y.shape == (20,)
Y = Y.reshape(-1, 1) # (20, 1)
X = np.column_stack((np.ones(len(x)), x)) # (20, 2)
X =
[[ 1. -1. ]
[ 1. -0.9]
...
[ 1. 0.9]]
w = np.linalg.inv(X.T @ X) @ X.T @ Y
Y (20,) был одномерный, применили reshape и сделали его вектор-столбцом (20, 1) чтобы работать с умножением. Также и x был (20,), а стал матрицей X с двумя столбцами (20, 2). ЕДИНИЧКИ мы добавили. потому что в Y у нас прописано -5.2 (это наш свободный член), вот его мы и учитываем (поэтому добавляем столбец единиц).⚙️ Затем мы решили вот это уравнение 🟰 w = (X.T @ X)^(-1) @ X.T @ Y 🟰и получили:
w = [[w0],
[w1]]
X.shape = (20, 2)
Y.shape = (20, 1)
w.shape = (2, 1)
X @ w = (20, 1) — наши предсказания!
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Какой матричной формулой находятся оптимальные веса w в задаче линейной регрессии?
Anonymous Quiz
8%
w = X^(-1) * y
17%
w = X.T * y
67%
w = (X.T @ X)^(-1) @ X.T @ y
8%
w = X @ X.T @ y
... которым описывается изображенная разделяющая линия в соответствии с выражением:
x1, y1 = -3, 1
x2, y2 = 3, 5
Пока что вам задание подставить значения и получить готовое уравнение прямой:
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Напомню, что в прошлый раз мы нашли точки:
Так вот, подставляем первую точку (-3, 1)
Please open Telegram to view this post
VIEW IN TELEGRAM
Какой из векторов весов НЕ соответствует уравнению прямой y = (2/3)x + 3?
Anonymous Quiz
44%
w = [1, 1, -1]
22%
w = [6, 4/3, -2]
22%
w = [3, 2/3, -1]
11%
w = [-9, -2, 3]
Что будет после выполнения?
import numpy as np a = np.array([1, 2, 3]) b = a b[0] = 99
import numpy as np a = np.array([1, 2, 3]) b = a b[0] = 99
Anonymous Quiz
23%
a = [1, 2, 3]
69%
a = [99, 2, 3]
0%
a = [0, 2, 3]
8%
Ошибка, нельзя присваивать массивы напрямую
⚙️ На каждой итерации берёт один случайный пример из датасета и делает шаг в направлении уменьшения ошибки.
Дальше будем считать градиенты, а пока спать
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM