Kebanyakan masalah yang kita temui memiliki beberapa cara untuk diselesaikan. Misalnya, jika kita ingin berpindah dari satu sisi ruangan ke sisi lainnya, kita bisa memutuskan untuk berjalan memutari ruangan hingga tiba di sisi seberang, atau kita bisa memotong langsung.
Persamaan normal menekankan konsep ini. Ini hanyalah cara lain untuk menyelesaikan sebuah masalah. Masalah apa, Anda tanya? Kita akan membahasnya di sisa artikel ini. Untuk saat ini, yang perlu Anda ketahui adalah ini merupakan pendekatan yang efektif yang dapat membantu Anda menghemat banyak waktu saat menerapkan regresi linear dalam kondisi tertentu.
Mari kita selami lebih dalam…
Apa itu Persamaan Normal?
Persamaan normal adalah solusi bentuk tertutup yang digunakan untuk menemukan nilai θ yang meminimalkan fungsi biaya untuk regresi linear ordinary least squares. Cara lain untuk menggambarkan persamaan normal adalah sebagai pendekatan analitis untuk mencari koefisien yang meminimalkan fungsi loss. Keduanya benar, tetapi apa sebenarnya maknanya?
Regresi linear membuat prediksi, y_hat, dengan menghitung jumlah berbobot dari fitur masukan ditambah sebuah bias. Secara matematis, ini dapat direpresentasikan sebagai berikut:

Di mana θ merepresentasikan parameter dan n adalah jumlah fitur.
Pada dasarnya, yang terjadi dalam persamaan di atas adalah hasil dot product dari θ dan x dijumlahkan. Jadi, cara yang lebih ringkas untuk merepresentasikannya adalah menggunakan bentuk vektornya:

h(θ) adalah fungsi hipotesis.
Dengan fungsi target aproksimasi ini, kita dapat menggunakan model untuk membuat prediksi. Untuk menentukan apakah model kita telah belajar dengan baik, penting untuk mengukur kinerja model pada data latih. Untuk tujuan ini, kita menghitung fungsi loss. Tujuan dari proses pelatihan adalah menemukan nilai theta (θ) yang meminimalkan fungsi loss.
Berikut cara kita merepresentasikan fungsi loss secara matematis:

Dalam persamaan di atas, theta (θ) adalah vektor berdimensi n + 1, dan fungsi loss kita adalah fungsi dari nilai vektor tersebut. Akibatnya, turunan parsial dari fungsi loss, J, harus diambil terhadap setiap parameter θ_j secara bergiliran. Semuanya harus bernilai nol. Mengikuti proses ini dan menyelesaikan semua nilai θ dari θ_0 hingga θ_n akan menghasilkan nilai θ yang meminimalkan fungsi loss.
Menyelesaikan parameter dari θ_0 hingga θ_n menggunakan proses yang dijelaskan di atas menghasilkan prosedur penurunan yang sangat rumit. Memang ada solusi yang lebih cepat.
Lihatlah rumus persamaan normal:

Di mana:
θ → Parameter yang meminimalkan fungsi loss X → Nilai fitur masukan untuk setiap instance y → Vektor nilai keluaran untuk setiap instance
Persamaan Normal vs Gradient Descent
Meskipun kedua metode bertujuan menemukan parameter theta (θ) yang meminimalkan fungsi loss, pendekatan yang digunakan sangat berbeda.
Karena kita sudah membahas cara kerja persamaan normal pada bagian sebelumnya, kita akan menyinggung sekilas tentang gradient descent lalu menjelaskan perbedaan keduanya.
Gradient Descent
Gradient descent adalah salah satu algoritma yang paling sering digunakan dalam machine learning. Algoritma ini digunakan secara iteratif untuk menemukan parameter theta (θ) yang meminimalkan fungsi loss.
Prosesnya dimulai dengan mengevaluasi kinerja model. Selanjutnya, turunan parsial dihitung dari fungsi loss yang digunakan untuk mereferensikan kemiringan pada titik saat ini. Terakhir, kita mengambil langkah yang proporsional dengan gradien negatif untuk turun menuju minimum fungsi loss dengan memperbarui himpunan parameter saat ini — lihat rumus di bawah.

Proses ini diulangi hingga konvergen pada minimum fungsi loss.
Apa Perbedaannya?
Cara paling jelas di mana persamaan normal berbeda dari gradient descent adalah sifatnya yang analitis. Gradient descent menggunakan pendekatan iteratif yang berarti parameter diperbarui secara bertahap hingga konvergen. Perbedaan halus lainnya yang terkait adalah bahwa gradient descent mengharuskan kita mendefinisikan laju pembelajaran yang mengontrol ukuran langkah menuju minimum fungsi loss. Persamaan normal tidak mengharuskan kita mendefinisikan laju pembelajaran karena kita tidak mengambil langkah iteratif — hasilnya diperoleh langsung.
Selain itu, penskalaan fitur tidak diperlukan saat kita menggunakan pendekatan persamaan normal; biasanya kita melakukan penskalaan fitur untuk memastikan fitur memiliki rentang nilai yang serupa. Ini karena gradient descent sensitif terhadap rentang titik data kita. Kegagalan menormalisasi fitur saat menggunakan gradient descent dapat memperkenalkan kemencengan pada contour plot fungsi loss, tetapi persamaan normal tidak mengalami masalah ini.
Menentukan Kapan Menggunakan Persamaan Normal
Cara terbaik untuk mengetahui apakah Anda harus menggunakan persamaan normal dibandingkan gradient descent adalah dengan memahami kelemahannya.
Menghitung persamaan normal menjadi menantang secara komputasi ketika jumlah fitur dalam dataset kita besar. Alasannya adalah untuk menyelesaikan parameter θ, perlu dihitung suku (X’ X)^-1. Menghitung X’ X menghasilkan matriks n x n, dan untuk sebagian besar implementasi komputer, operasi invers matriks bertumbuh kira-kira seiring pangkat tiga dari dimensi matriks. Ini berarti operasi invers berjalan dengan kompleksitas waktu O(n^3), yang membuat persamaan normal berjalan sangat lambat ketika n sangat besar — pelajari lebih lanjut tentang kompleksitas waktu.
Oleh karena itu, lebih baik menggunakan gradient descent ketika jumlah fitur dalam dataset besar. Andrew Ng, pakar machine learning dan AI terkemuka, merekomendasikan untuk mempertimbangkan penggunaan gradient descent ketika jumlah fitur, n, lebih dari 10.000. Untuk 10.000 fitur atau kurang, Anda mungkin lebih baik menggunakan pendekatan analitis seperti persamaan normal karena Anda tidak perlu memilih nilai laju pembelajaran, yang berarti ada satu hyperparameter lebih sedikit untuk dituning. Namun, perlu kami sampaikan bahwa bahasa pemrograman seperti R atau Python sebenarnya menggunakan dekomposisi QR untuk menemukan koefisien regresi linear ordinary least squares karena dekomposisi QR lebih stabil secara numerik dan lebih efisien dibandingkan persamaan normal.
Persamaan Normal dari Nol di Python
Mari kita buat sebuah masalah regresi untuk menguji persamaan ini:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_regression
# Generate a regression problem
X, y = make_regression(
n_samples=100,
n_features=2,
n_informative=2,
noise = 10,
random_state=25
)
# Visualize feature at index 1 vs target
plt.subplots(figsize=(8, 5))
plt.scatter(X[:, 1], y, marker='o')
plt.xlabel("Feature at Index 1")
plt.ylabel("Target")
plt.show()

Di sinilah kita akan mengimplementasikan persamaan normal:
# adds x0 = 1 to each instance
X_b = np.concatenate([np.ones((len(X), 1)), X], axis=1)
# calculate normal equation
theta_best = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(y)
# best values for theta
intercept, *coef = theta_best
print(f"Intercept: {intercept}\n\
Coefficients: {coef}")
Intercept: 0.35921242677977794
Coefficients: [6.129199175400593, 96.44309685893134]
Mari uji model kita dengan membuat sebuah prediksi:
# making a new sample
new_sample = np.array([[-2, 0.25]])
# adding a bias term to the instance
new_sample_b = np.concatenate([np.ones((len(new_sample), 1)), new_sample], axis=1)
# predicting the value of our new sample
new_sample_pred = new_sample_b.dot(theta_best)
print(f"Prediction: {new_sample_pred}")
Prediction: [12.21158829]
Kapan pun Anda mengimplementasikan algoritma machine learning dari nol, selalu membantu untuk memiliki metode validasi solusi; Scikit-learn adalah salah satu pustaka machine learning paling populer di Python. Pustaka ini menyediakan beberapa implementasi berbagai algoritma, termasuk regresi linear, yang akan kita gunakan untuk memvalidasi persamaan normal kita.
from sklearn.linear_model import LinearRegression
lr = LinearRegression()
lr.fit(X, y)
print(f"Intercept: {lr.intercept_}\n\
Coefficients: {lr.coef_}")
print(f"Prediction: {lr.predict(new_sample)}")
Intercept: 0.3592124267797807
Coefficients: [ 6.12919918 96.44309686]
Prediction: [12.21158829]
Solusinya kurang lebih sama, sehingga kita dapat memastikan bahwa solusi kita benar.
Pertanyaan yang Sering Diajukan (FAQ)
Apa itu persamaan normal dalam machine learning?
Persamaan normal adalah pendekatan analitis untuk menemukan nilai θ yang meminimalkan fungsi loss tanpa harus melakukan iterasi.
Kapan saya harus menggunakan persamaan normal alih-alih gradient descent?
Lebih baik menggunakan persamaan normal ketika kita memiliki sedikit fitur. Menghitung persamaan normal menjadi menantang secara komputasi ketika jumlah fitur dalam dataset kita besar.
Apakah persamaan normal dapat digunakan untuk regresi logistik?
Sayangnya tidak. Hanya ada satu model kondisional dalam teori klasifikasi yang memiliki solusi bentuk tertutup — regresi linear.
Apa perbedaan antara persamaan normal dan gradient descent?
Perbedaan yang jelas antara persamaan normal dan gradient descent adalah bahwa persamaan normal menggunakan pendekatan analitis untuk menemukan minimum dari fungsi loss, sedangkan gradient descent menggunakan pendekatan iteratif. Perbedaan lainnya adalah Anda tidak perlu menyetel laju pembelajaran untuk menghitung persamaan normal karena hanya satu langkah yang diambil untuk menemukan parameter θ.
