Лінійна та Логістична регресія
На цьому уроці розберемо базові принципи лінійної та логістичної регресії. З нуля реалізуємо обидва алгоритми, детально проаналізуємо градієнтний та стохастичний градієнтний спуск, евклідову норму, а також усі ключові компоненти моделей, щоб чітко розуміти, як і чому вони працюють.
Код і результати
Опублікована версія після Merge. Результати збережені автором; код на цій сторінці не запускається.
Python · 1
import numpy as np
import matplotlib.pyplot as plt
def predict(X, w, b):
return b + X * w
def mse(y_hat, y):
return 0.5 * np.mean((y_hat - y) ** 2)
def compute_gradient(y_hat, y, X):
error = y_hat - y
dw = np.mean(error * X)
db = np.mean(error)
return dw, db
def update_params(w, b, dw, db, lr):
w = w - lr * dw
b = b - lr * db
return w, b
def fit(X, y, lr=0.001, epochs=100):
w = 0.0
b = 0.0
loss_history = []
for _ in range(epochs):
y_hat = predict(X, w, b)
loss = mse(y_hat, y)
loss_history.append(loss)
dw, db = compute_gradient(y_hat, y, X)
w, b = update_params(w, b, dw, db, lr)
return w, b, loss_history
def plot_graphics(X, y, w, b, loss_history):
fig, axes = plt.subplots(1, 3, figsize=(12, 4))
axes[0].scatter(X, y)
axes[0].set_title('(X, y)')
axes[0].set_xlabel('x')
axes[0].set_ylabel('y')
x_line = np.linspace(X.min(), X.max(), 100)
axes[1].scatter(X, y, label="дані")
axes[1].plot(x_line, predict(x_line, w, b), color="red", label="модель")
axes[1].set_title("Підігнана пряма")
axes[1].set_xlabel("x")
axes[1].set_ylabel("y")
axes[1].legend()
axes[2].plot(loss_history)
axes[2].set_yscale("log")
axes[2].set_title('loss')
axes[2].set_xlabel('epoch')
axes[2].set_ylabel('loss')
plt.tight_layout()
plt.show()
X = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], dtype=float)
y = np.array([
5.2,
7.5,
11.3,
13.8,
16.1,
19.4,
22.0,
24.3,
28.1,
29.5
])
w, b, loss_history = fit(X, y, lr=0.001, epochs=300)
print(w, b)
print(loss_history[-1])
plot_graphics(X, y, w, b, loss_history)
Результат, збережений автором у Colab
3.0438553373092936 0.567262964413635 0.501542429867536
Python · 2
Рев’ю спільноти
Дякую, чудова робота, прийнято, можна мерджати
