Metode Kuadrat Terkecil

最終更新: 3 分で読めます このページを編集

Kuadrat terkecil mencari koefisien fungsi yang paling pas terhadap pasangan observasi (x_i, y_i) dengan meminimalkan jumlah kuadrat residual. Kita fokus pada kasus paling sederhana, garis lurus y = wx + b, dan meninjau intuisi serta implementasi praktisnya.

Rumus ditampilkan dengan KaTeX. $\hat y$ adalah prediksi model dan $\epsilon$ adalah noise.

Tujuan #

  • Mempelajari garis $\hat y = wx + b$ yang paling pas dengan data.
  • “Paling pas” berarti meminimalkan jumlah kuadrat error (SSE): $\displaystyle L(w,b) = \sum_{i=1}^n (y_i - (w x_i + b))^2$

Buat dataset sederhana #

Kita buat garis lurus dengan noise dan tetapkan seed agar hasil dapat direproduksi.

import numpy as np
import matplotlib.pyplot as plt
import japanize_matplotlib  # opsional untuk label Jepang

rng = np.random.RandomState(42)
n_samples = 200

# Garis sebenarnya (kemiringan 0.8, intersep 0.5) dengan noise
X = np.linspace(-10, 10, n_samples)
epsilon = rng.normal(loc=0.0, scale=1.0, size=n_samples)
y = 0.8 * X + 0.5 + epsilon

# Ubah ke 2D untuk scikit-learn: (n_samples, 1)
X_2d = X.reshape(-1, 1)

plt.figure(figsize=(10, 5))
plt.scatter(X, y, marker="x", label="observasi", c="orange")
plt.xlabel("$x$")
plt.ylabel("$y$")
plt.legend()
plt.show()

png

Di scikit-learn, fitur selalu berbentuk array 2D: baris = sampel, kolom = fitur. Gunakan X.reshape(-1, 1) untuk satu fitur.

Periksa noise #

Mari lihat distribusi epsilon.

plt.figure(figsize=(10, 5))
plt.hist(epsilon, bins=30)
plt.xlabel("$\\epsilon$")
plt.ylabel("jumlah")
plt.show()

png

Regresi linear (kuadrat terkecil) dengan scikit-learn #

Kita gunakan sklearn.linear_model.LinearRegression.

from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score

model = LinearRegression()  # fit_intercept=True secara default
model.fit(X_2d, y)

print("kemiringan w:", model.coef_[0])
print("intersep b:", model.intercept_)

y_pred = model.predict(X_2d)

# Metrik
mse = mean_squared_error(y, y_pred)
r2 = r2_score(y, y_pred)
print("MSE:", mse)
print("R^2:", r2)

# Plot
plt.figure(figsize=(10, 5))
plt.scatter(X, y, marker="x", label="observasi", c="orange")
plt.plot(X, y_pred, label="garis terpasang", c="C0")
plt.xlabel("$x$")
plt.ylabel("$y$")
plt.legend()
plt.show()

png

Penskalaan tidak wajib untuk OLS, tetapi membantu pada kasus multivariat dan regularisasi.

Solusi bentuk tertutup (referensi) #

Untuk $\hat y = wx + b$:

  • $\displaystyle w = \frac{\operatorname{Cov}(x,y)}{\operatorname{Var}(x)}$
  • $\displaystyle b = \bar y - w,\bar x$

Verifikasi dengan NumPy:

x_mean, y_mean = X.mean(), y.mean()
w_hat = ((X - x_mean) * (y - y_mean)).sum() / ((X - x_mean) ** 2).sum()
b_hat = y_mean - w_hat * x_mean
print(w_hat, b_hat)

Jebakan umum #

  • Bentuk array: X harus (n_samples, n_features). Untuk satu fitur, gunakan reshape(-1, 1).
  • Bentuk target: y bisa (n_samples,). (n,1) juga berfungsi; perhatikan broadcasting.
  • Intersep: default fit_intercept=True. Jika fitur dan target sudah dicenter, False juga baik.
  • Reproducibility: gunakan seed tetap via np.random.RandomState atau np.random.default_rng.

Lanjut (multivariat) #

Untuk banyak fitur, pertahankan X sebagai (n_samples, n_features). Pipeline memadukan pra-pemrosesan dan estimator.

from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler

X_multi = rng.normal(size=(n_samples, 2))
y_multi = 1.0 * X_multi[:, 0] - 2.0 * X_multi[:, 1] + 0.3 + rng.normal(size=n_samples)

pipe = make_pipeline(StandardScaler(), LinearRegression())
pipe.fit(X_multi, y_multi)

Kode untuk pembelajaran; gambar sudah dirender sebelumnya untuk situs.