Linear Discriminant Analysis (LDA) adalah metode penarikan batas yang dapat mendiskriminasikan antar kelas berdasarkan derajat kohesi data antar kelas dan derajat variabilitas data antar kelas untuk dua kelas data. Hal ini juga memungkinkan dilakukannya reduksi dimensionalitas data berdasarkan hasil yang diperoleh. Pada halaman ini, kita akan memvisualisasikan batas-batas keputusan yang diperoleh LDA dan memvisualisasikan hasil pengurangan dimensionalitas.
import numpy as np
import matplotlib.pyplot as plt
import japanize_matplotlib
from sklearn.datasets import make_blobs
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
n_samples = 200
X, y = make_blobs(n_samples=200, centers=2, n_features=2, cluster_std=2)
X[:, 0] -= np.mean(X[:, 0])
X[:, 1] -= np.mean(X[:, 1])
fig = plt.figure(figsize=(7, 7))
plt.title("Plot sebaran data", fontsize=20)
plt.scatter(X[:, 0], X[:, 1], c=y)
plt.show()
# Temukan batas keputusan
clf = LinearDiscriminantAnalysis(store_covariance=True)
clf.fit(X, y)
# Periksa batas keputusan
w = clf.coef_[0]
wt = -1 / (w[1] / w[0]) ## Temukan kemiringan yang tegak lurus terhadap w
xs = np.linspace(-10, 10, 100)
ys_w = [(w[1] / w[0]) * xi for xi in xs]
ys_wt = [wt * xi for xi in xs]
fig = plt.figure(figsize=(7, 7))
plt.title("Visualisasi kemiringan batas keputusan.", fontsize=20)
plt.scatter(X[:, 0], X[:, 1], c=y)
plt.plot(xs, ys_w, "-.", color="k", alpha=0.5) # orientasi dari W
plt.plot(xs, ys_wt, "--", color="k") # Orientasi tegak lurus terhadap w
plt.xlim(-10, 10)
plt.ylim(-10, 10)
plt.show()
# Lokasi data ketika memproyeksikan data dalam satu dimensi.
X_1d = clf.transform(X).reshape(1, -1)[0]
fig = plt.figure(figsize=(7, 7))
plt.title("Lokasi data ketika memproyeksikan data dalam satu dimensi.", fontsize=15)
plt.scatter(X_1d, [0 for _ in range(n_samples)], c=y)
plt.show()
X_3d, y_3d = make_blobs(n_samples=200, centers=3, n_features=3, cluster_std=3)
# Distribusi data sampel
fig = plt.figure(figsize=(7, 7))
plt.title("Distribusi data sampel", fontsize=20)
ax = fig.add_subplot(projection="3d")
ax.scatter(X_3d[:, 0], X_3d[:, 1], X_3d[:, 2], c=y_3d)
plt.show()
# Terapkan LDA
clf_3d = LinearDiscriminantAnalysis()
clf_3d.fit(X_3d, y_3d)
X_2d = clf_3d.transform(X_3d)
# Lokasi data ketika data diproyeksikan dalam dua dimensi
fig = plt.figure(figsize=(7, 7))
plt.title("Lokasi data ketika data diproyeksikan dalam dua dimensi", fontsize=15)
plt.scatter(X_2d[:, 0], X_2d[:, 1], c=y_3d)
plt.show()