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:
X, y
X*W+b
MSE
X.T*error
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
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
| Szenario | Bezug zu diesem Fall |
|---|---|
| Baseline-Modell | Das erste Modell für jede Regressionsaufgabe sollte die lineare Regression sein — einfach und interpretierbar |
| Die letzte Schicht eines neuronalen Netzwerks | Die Ausgabeschicht vieler Netzwerke ist eine lineare Schicht — im Wesentlichen lineare Regression |
| Feature-Wichtigkeitsanalyse | Betrachte nach dem Training die Größe von W — Merkmale mit größeren Absolutwerten haben einen größeren Einfluss auf das Ergebnis |