TelegramПерейти в канал
Sofiia Nazaryshyna
Merged · Machine Learning

Лінійна та Логістична регресія

На цьому уроці розберемо базові принципи лінійної та логістичної регресії. З нуля реалізуємо обидва алгоритми, детально проаналізуємо градієнтний та стохастичний градієнтний спуск, евклідову норму, а також усі ключові компоненти моделей, щоб чітко розуміти, як і чому вони працюють.

Код і результати

Опублікована версія після 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
Результат комірки 1
Python · 2

Рев’ю спільноти

Anar LavrenovApprove

Дякую, чудова робота, прийнято, можна мерджати