Eine multiple lineare Regression von Grund auf schreiben

Matrixoperationen + Gradientenabstieg + MSE umfassend anwenden und den gesamten Prozess von "Daten → Modell → Training → Vorhersage" vollständig durchgehen.

Nach der Bearbeitung dieses Falls werden Sie verstehen:Ein lauffähiges Machine-Learning-Modell ist im Wesentlichen eine Kombination aus linearer Algebra + Analysis + Optimierung.


Einführung in den Alltag

Immobilienpreise schätzen — nicht nur die Fläche

Hauspreise hängen nicht nur von der Fläche ab, sondern auch von der Anzahl der Schlafzimmer, der Etage, der Nähe zur U-Bahn, dem Gebäudealter ... Jeder Faktor hat sein eigenes Gewicht.

Multiple lineare Regression ist:Gib jedem Faktor ein Gewicht w, multipliziere alle Faktoren mit ihren Gewichten und summiere sie, dann addiere einen Grundpreis b.Dann verwende historische Transaktionsdaten, um diese Gewichte abzuleiten — das ist Training.


Intuitive Vorstellung

Die vollständige fünfstufige Machine-Learning-Schleife:

Daten vorbereiten
X, y
Vorwärtsvorhersage
X*W+b
Verlust berechnen
MSE
Gradienten berechnen
X.T*error
Parameter aktualisieren
W-=lr*dW

Diese fünf Schritte werden in jeder Iteration in einer Schleife ausgeführt, bis der Verlust konvergiert. Die fit()-Methode in PyTorch/TensorFlow ist intern genau diese Schleife.


Mathematische Definition

\[ \hat{y} = XW + b, \quad L = \frac{1}{n}\sum(\hat{y}_i - y_i)^2 \] \[ \frac{\partial L}{\partial W} = \frac{2}{n} X^T (XW + b - y), \quad \frac{\partial L}{\partial b} = \frac{2}{n} \sum (XW + b - y) \]

Praktische Python-Übung

Beispiel

import numpy as np
np.random.seed(0)


class LinearRegressionFromScratch:
    """Vollständig mit NumPy-Matrixoperationen + Gradientenabstieg implementiert"""

    def __init__(self, lr=0.01, epochs=500):
        self.lr = lr
        self.epochs = epochs
        self.W = None
        self.b = None
        self.loss_history = []

    def fit(self, X, y):
        n_samples, n_features = X.shape
        self.W = np.zeros(n_features)
        self.b = 0.0

        for epoch in range(self.epochs):
            y_pred = X @ self.W + self.b
            error = y_pred - y
            loss = np.mean(error ** 2)
            self.loss_history.append(loss)

            dW = (2 / n_samples) * (X.T @ error)
            db = (2 / n_samples) * np.sum(error)

            self.W -= self.lr * dW
            self.b -= self.lr * db

            if epoch % 100 == 0:
                print(f"BEISPIEL Epoche {epoch:4d} loss={loss:.4f}")

    def predict(self, X):
        return X @ self.W + self.b


# Daten konstruieren: y = 3*x1 - 2*x2 + 5 + Rauschen
X = np.random.uniform(-5, 5, size=(200, 2))
true_W = np.array([3.0, -2.0])
true_b = 5.0
y = X @ true_W + true_b + np.random.randn(200) * 1.5

model = LinearRegressionFromScratch(lr=0.01, epochs=500)
model.fit(X, y)

print(f"\nBEISPIEL gelernt: W={np.round(model.W, 3)}, b={round(model.b, 3)}")
print(f"Wahr: W={true_W}, b={true_b}")
print(f"Verlust: {model.loss_history[0]:.1f} -> {model.loss_history[-1]:.2f}")

# Neue Stichproben vorhersagen
X_new = np.array([[1.0, 1.0], [-2.0, 3.0]])
print(f"Vorhersage: {np.round(model.predict(X_new), 2)}")
EXAMPLE epoch    0  loss=157.0828
EXAMPLE epoch  100  loss=2.6062
EXAMPLE epoch  200  loss=2.3077
EXAMPLE epoch  300  loss=2.2581
EXAMPLE epoch  400  loss=2.2475

EXAMPLE 学到的: W=[ 3.014 -2.017], b=4.737
真实的:       W=[ 3. -2.], b=5.0
损失: 157.1 -> 2.25
预测: [5.73 -4.18]

Anwendungsszenarien in der KI

SzenarioBezug zu diesem Fall
Baseline-ModellDas erste Modell für jede Regressionsaufgabe sollte die lineare Regression sein — einfach und interpretierbar
Die letzte Schicht eines neuronalen NetzwerksDie Ausgabeschicht vieler Netzwerke ist eine lineare Schicht — im Wesentlichen lineare Regression
Feature-WichtigkeitsanalyseBetrachte nach dem Training die Größe von W — Merkmale mit größeren Absolutwerten haben einen größeren Einfluss auf das Ergebnis
Weitere Erweiterungen