Тг не хочет брать так много ссылок на 1 пост, поэтому завтра будет 4 пост по навигации для ML, мы слишком далеко улетели ✈️
Please open Telegram to view this post
VIEW IN TELEGRAM
1 3 2
Пользуемся здесь: http://gemini.google.com
Please open Telegram to view this post
VIEW IN TELEGRAM
Gemini
Google Gemini
Meet Gemini, Google’s AI assistant. Get help with writing, planning, brainstorming, and more. Experience the power of generative AI.
import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import StandardScaler, PolynomialFeatures
from sklearn.metrics import mean_squared_error, r2_score, mean_absolute_error
np.random.seed(42)
X = 2 * np.random.rand(100, 1)
y = 4 + 3 * X + np.random.randn(100, 1)
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
def linear_gradient_descent(X, y, lr=0.1, epoches = 1000):
m = len(y)
w = np.random.randn()
b = np.random.randn()
losses = []
for _ in range(epoches):
y_pred = w * X.reshape(-1) + b # Предсказания
L = y_pred - y.reshape(-1) # (Loss)
📎y_pred = w * X.reshape(-1) + b📎 — кароч это наша предсказанная линиия, X.reshape(-1)📎 — превращает X в одномерный массив (это просто так удобно) = y_pred - y.reshape(-1)📎 — это типо ошибка, ну вы понялиdw = (2/m) * np.sum(L * X.reshape(-1)) # Градиент для w
db = (2/m) * np.sum(L) # Градиент для b
w -= lr * dw # Обновляем w
b -= lr * db # Обновляем b
return w, b
w -= lr * dw
b -= lr * db
losses.append(mean_squared_error(y, y_pred))
return w, b, losses
w, b, losses = linear_gradient_descent(X_scaled, y) # Обучение
y_pred_lin = w * X_scaled + b # Наши результаты
print("Линейная регрессия")
print("w:", w)
print("b:", b)
print("MSE:", mean_squared_error(y, y_pred_lin))
print("MAE:", mean_absolute_error(y, y_pred_lin))
print("R²:", r2_score(y, y_pred_lin))
plt.figure(figsize = (12, 5))
plt.subplot(1, 2, 1)
plt.scatter(X, y, color='black', label='Данные')
plt.plot(X, y_pred_lin, color='blue', label='Линейная регрессия')
plt.xlabel("X")
plt.ylabel("y")
plt.legend()
plt.title("Линейная регрессия")
plt.subplot(1, 2, 2)
plt.plot(range(len(losses)), losses, color='red', label="MSE")
plt.xlabel("Итерации")
plt.ylabel("Ошибка (MSE)")
plt.legend()
plt.title("График обучения градиентного спуска")
plt.show()🔗 Код корректирует эти шаги (корректирует w и b), пока ошибка не уменьшится
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
1 2 2 2
📱 Шум — это непредсказуемая ошибка, которая влияет на каждое измерение.
📱 Математическое ожидание (mean, ожидание среднего значения
— это просто среднее значение всех возможных шумов.
📱 Дисперсия показывает, насколько сильно значения разбросаны около среднего.⚙️ Если дисперсия маленькая (например, 0.01):🔵 Почти все значения шума близки к 0🔵 Шум почти не влияет на данные
Вывод: "Чем больше дисперсия, тем сильнее скачет шум"
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; 1] с шагом 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]) # модель
loss = lambda ax, y: (ax - y) ** 2 # квадратическая функция потерь
y = model_a(x, w) + np.random.normal(0, 0.1, len(x)) # целевые значения
🧠 Эмпирический риск — это средняя величина ошибки алгоритма на обучающей выборке.🟰 Q(a, X) = 1/n * ∑ loss(a, yᵢ)🟰 — Формула среднего эмпирического риска.🟰 loss(a, yᵢ) = (a(xᵢ , w) − yᵢ)²🟰 — Квадратическая функция потерь.🟰 a(x,w) = w₀ + w₁ ⋅ x🟰 — Параметрическая модель с параметрами w₀ = 0.5 w₁ = -0.3🟰 yᵢ = w₀ + w₁ * xᵢ + ϵᵢ🟰 i = 1, 2, ..., n🟰
x значений от -1.0 до (не включая) 1.0 с шагом 0.1, получаем [-1.0, -0.9, -0.8, ..., 0.9] и так 20 значений⚙️ "Берем x, умножаем на второй коэффициент w (то есть наклон), и прибавляем первый коэффициент (смещение)"
m_x = np.array([1, 2, 3])
m_w = [0.5, -0.3]
# Если мы подставим:
model_a(m_x, m_w) → (-0.3 * m_x + 0.5)
# Получаем:
y = -0.3 * np.array([1, 2, 3]) + 0.5
# Сами вычисления:
-0.3 * [1, 2, 3] = [-0.3, -0.6, -0.9]
[-0.3, -0.6, -0.9] + 0.5 = [0.2, -0.1, -0.4]
Please open Telegram to view this post
VIEW IN TELEGRAM
⚙️ Квадрат разницы между 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