๐Ÿ›ธ ์ฐจ์› ์ถ•์†Œ(Dimensionality Reduction): PCA ยท LDA ยท Kernel PCA

okorionยท2025๋…„ 10์›” 29์ผ

1๏ธโƒฃ ์ฐจ์› ์ถ•์†Œ๋ž€?

์ฐจ์› ์ถ•์†Œ(Dimensionality Reduction) ๋Š”
๊ณ ์ฐจ์› ๋ฐ์ดํ„ฐ์˜ ํŠน์ง•์„ ์†์‹ค์„ ์ตœ์†Œํ™”ํ•˜๋ฉฐ ์ €์ฐจ์›์œผ๋กœ ์••์ถ•ํ•˜๋Š” ๊ธฐ๋ฒ•์ด๋‹ค.

๋ชฉ์ ์„ค๋ช…
์‹œ๊ฐํ™”2Dยท3D ๊ณต๊ฐ„์—์„œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ํ™•์ธ
์†๋„ ํ–ฅ์ƒํ•™์Šตยท์˜ˆ์ธก ์‹œ๊ฐ„ ๋‹จ์ถ•
๋…ธ์ด์ฆˆ ์ œ๊ฑฐ๋ถˆํ•„์š”ํ•œ ๋ณ€์ˆ˜ ์ œ๊ฑฐ
๊ณผ์ ํ•ฉ ๋ฐฉ์ง€๋‹จ์ˆœํ™”๋œ ๋ชจ๋ธ ๊ตฌ์กฐ๋กœ ์ผ๋ฐ˜ํ™” ์„ฑ๋Šฅ ํ–ฅ์ƒ

๐Ÿ’ก ์‹ค์ œ ๋ฐ์ดํ„ฐ์…‹(์˜ˆ: 100๊ฐœ ๋ณ€์ˆ˜)์€ ์ค‘๋ณต ์ •๋ณด๊ฐ€ ๋งŽ๋‹ค.
PCA, LDA, Kernel PCA๋Š” ์ด๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์š”์•ฝํ•œ๋‹ค.


2๏ธโƒฃ ์ฃผ์„ฑ๋ถ„ ๋ถ„์„ (PCA: Principal Component Analysis)

๐Ÿ’ก ๊ฐœ๋…

๋ฐ์ดํ„ฐ์˜ ๋ถ„์‚ฐ์ด ๊ฐ€์žฅ ํฐ ๋ฐฉํ–ฅ์„ ์ฐพ์•„
์ƒˆ๋กœ์šด ์ถ•(์ฃผ์„ฑ๋ถ„, Principal Component)์œผ๋กœ ํšŒ์ „์‹œ์ผœ ํ‘œํ˜„ํ•˜๋Š” ์„ ํ˜• ์ฐจ์› ์ถ•์†Œ ๊ธฐ๋ฒ•.

์ฆ‰, ์›๋ž˜์˜ ๋ณ€์ˆ˜๋“ค์„ ์„ ํ˜• ๊ฒฐํ•ฉํ•ด ์ •๋ณด ์†์‹ค ์ตœ์†Œํ™”.


โš™๏ธ ์›๋ฆฌ

  1. ๋ฐ์ดํ„ฐ ํ‰๊ท ์„ 0์œผ๋กœ ๋งž์ถค (์ค‘์‹ฌํ™”)
  2. ๊ณต๋ถ„์‚ฐ ํ–‰๋ ฌ ๊ณ„์‚ฐ
  3. ๊ณ ์œ ๊ฐ’(eigenvalue)ยท๊ณ ์œ ๋ฒกํ„ฐ(eigenvector) ๊ณ„์‚ฐ
  4. ๊ฐ€์žฅ ํฐ ๊ณ ์œ ๊ฐ’์— ํ•ด๋‹นํ•˜๋Š” ์ถ•์œผ๋กœ ํˆฌ์˜
  5. ์ฃผ์š” ์ถ• ๋ช‡ ๊ฐœ๋งŒ ์„ ํƒํ•ด ์ฐจ์› ์ถ•์†Œ
maximizeย Var(Z)s.t.ย Z=WTX,WTW=1\text{maximize } Var(Z) \quad \text{s.t. } Z = W^TX, \quad W^TW = 1
  • XX: ์ž…๋ ฅ ๋ฐ์ดํ„ฐ
  • WW: ํˆฌ์˜ ๋ฒกํ„ฐ (๊ณ ์œ ๋ฒกํ„ฐ)
  • ZZ: ๋ณ€ํ™˜๋œ ๋ฐ์ดํ„ฐ (์ฃผ์„ฑ๋ถ„)

๐Ÿงฉ ์ง๊ด€

2์ฐจ์› ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ๊ฐํ•ด๋ณด๋ฉด,
๋ถ„์‚ฐ์ด ๊ฐ€์žฅ ํฐ ๋ฐฉํ–ฅ(์ฆ‰, ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฐ€์žฅ ํผ์ง„ ์ถ•)์„ ์ƒˆ ์ขŒํ‘œ์ถ•์œผ๋กœ ํšŒ์ „์‹œํ‚จ๋‹ค.
โ†’ ์‹œ๊ฐํ™” ์‹œ ๋ฐ์ดํ„ฐ์˜ ๋ณธ์งˆ์  ๊ตฌ์กฐ๋ฅผ ๋” ๋ช…ํ™•ํžˆ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.


๐Ÿงช Python ์‹ค์Šต

from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler

sc = StandardScaler()
X_scaled = sc.fit_transform(X)

pca = PCA(n_components=2)
X_pca = pca.fit_transform(X_scaled)

print(pca.explained_variance_ratio_)

๐Ÿ’ก explained_variance_ratio_ ๋Š” ๊ฐ ์ฃผ์„ฑ๋ถ„์ด ์„ค๋ช…ํ•˜๋Š” ๋ถ„์‚ฐ ๋น„์œจ.
์˜ˆ: [0.72, 0.18] โ†’ ์ฒซ ๋ฒˆ์งธ ์ฃผ์„ฑ๋ถ„์ด 72% ์„ค๋ช….


๐Ÿงช ์‹œ๊ฐํ™”

import matplotlib.pyplot as plt
plt.scatter(X_pca[:,0], X_pca[:,1], c=y, cmap='rainbow')
plt.title('PCA Visualization (2 Components)')
plt.xlabel('PC1')
plt.ylabel('PC2')
plt.show()

๊ฒฐ๊ณผ:
๊ณ ์ฐจ์› ๋ฐ์ดํ„ฐ๋ฅผ 2D ํ‰๋ฉด์—์„œ ์‹œ๊ฐํ™” โ€”
ํด๋ž˜์Šค ๊ฐ„ ๊ตฌ์กฐ๋‚˜ ๊ตฐ์ง‘ ํ˜•ํƒœ๊ฐ€ ์ง๊ด€์ ์œผ๋กœ ๋“œ๋Ÿฌ๋‚œ๋‹ค.


๐Ÿงช R ์‹ค์Šต

dataset = scale(dataset[, -3])
pca = prcomp(dataset)
summary(pca)
biplot(pca)

biplot()์œผ๋กœ ๊ฐ ๋ณ€์ˆ˜์™€ ์ฃผ์„ฑ๋ถ„ ๊ฐ„ ๊ด€๊ณ„๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ํ™•์ธ ๊ฐ€๋Šฅ.


3๏ธโƒฃ ์„ ํ˜• ํŒ๋ณ„ ๋ถ„์„ (LDA: Linear Discriminant Analysis)

๐Ÿ’ก ๊ฐœ๋…

PCA๊ฐ€ ๋น„์ง€๋„ํ•™์Šต(ํด๋ž˜์Šค ์ •๋ณด ์—†์Œ) ์ด๋ผ๋ฉด,
LDA๋Š” ์ง€๋„ํ•™์Šต ๊ธฐ๋ฐ˜ ์ฐจ์› ์ถ•์†Œ ๊ธฐ๋ฒ•์ด๋‹ค.

๋ชฉํ‘œ:
ํด๋ž˜์Šค ๊ฐ„ ๋ถ„์‚ฐ(๋ถ„๋ฆฌ๋„)์„ ๊ทน๋Œ€ํ™”ํ•˜๊ณ ,
ํด๋ž˜์Šค ๋‚ด ๋ถ„์‚ฐ์„ ์ตœ์†Œํ™”ํ•˜๋Š” ์ถ•์„ ์ฐพ๋Š”๋‹ค.

Wโˆ—=argโกmaxโกWโˆฃWTSBWโˆฃโˆฃWTSWWโˆฃW^* = \arg\max_W \frac{|W^TS_BW|}{|W^TS_WW|}
  • SBS_B: ํด๋ž˜์Šค ๊ฐ„ ๋ถ„์‚ฐ ํ–‰๋ ฌ
  • SWS_W: ํด๋ž˜์Šค ๋‚ด ๋ถ„์‚ฐ ํ–‰๋ ฌ

โš™๏ธ ๋น„๊ต

ํ•ญ๋ชฉPCALDA
์ง€๋„ ์—ฌ๋ถ€๋น„์ง€๋„์ง€๋„
๋ชฉํ‘œ๋ถ„์‚ฐ ์ตœ๋Œ€ํ™”ํด๋ž˜์Šค ๋ถ„๋ฆฌ ์ตœ๋Œ€ํ™”
์ถœ๋ ฅ ์ถ•๋ฐ์ดํ„ฐ ๋ฐฉํ–ฅํด๋ž˜์Šค ๊ตฌ๋ถ„ ๋ฐฉํ–ฅ
์ ์šฉ ์‹œ์ ํ”ผ์ฒ˜ ์ถ”์ถœ๋ถ„๋ฅ˜ ์ „ ๋‹จ๊ณ„

๐Ÿงช Python ์‹ค์Šต

from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA

lda = LDA(n_components=2)
X_lda = lda.fit_transform(X_scaled, y)

plt.scatter(X_lda[:,0], X_lda[:,1], c=y, cmap='rainbow')
plt.title('LDA Projection')
plt.show()

๊ฒฐ๊ณผ:
ํด๋ž˜์Šค ๊ฐ„ ๊ฒฝ๊ณ„๊ฐ€ ๋ช…ํ™•ํ•˜๊ฒŒ ๊ตฌ๋ถ„๋œ 2์ฐจ์› ํ‰๋ฉด์ด ์ƒ์„ฑ๋œ๋‹ค.


๐Ÿงช R ์‹ค์Šต

library(MASS)
lda_model = lda(Class ~ ., data = dataset)
lda_pred = predict(lda_model, dataset)
plot(lda_pred$x, col=dataset$Class)

๐Ÿ’ก R์˜ lda()๋Š” ์‹œ๊ฐํ™”๊นŒ์ง€ ์ž๋™ ์ฒ˜๋ฆฌ.
๊ฐ ํด๋ž˜์Šค๊ฐ€ ์–ผ๋งˆ๋‚˜ ์ž˜ ๋ถ„๋ฆฌ๋˜๋Š”์ง€ ์ง๊ด€์ ์œผ๋กœ ํ™•์ธ ๊ฐ€๋Šฅ.


4๏ธโƒฃ ์ปค๋„ PCA (Kernel Principal Component Analysis)

๐Ÿ’ก ๊ฐœ๋…

PCA๋Š” ์„ ํ˜• ๋ฐ์ดํ„ฐ์—๋งŒ ์œ ํšจํ•˜์ง€๋งŒ,
Kernel PCA ๋Š” ๋น„์„ ํ˜• ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋„ ๋ฐ˜์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•ต์‹ฌ ์•„์ด๋””์–ด:
๋ฐ์ดํ„ฐ๋ฅผ ๊ณ ์ฐจ์› ๊ณต๊ฐ„์œผ๋กœ ๋งคํ•‘ ํ›„,
๊ทธ ๊ณต๊ฐ„์—์„œ ์„ ํ˜• PCA ์ˆ˜ํ–‰.


โš™๏ธ ์ปค๋„ ํ•จ์ˆ˜

์ปค๋„์ˆ˜์‹ํŠน์ง•
LinearK(xi,xj)=xiโ‹…xjK(x_i, x_j) = x_i \cdot x_j์ผ๋ฐ˜ PCA
Polynomial(xiโ‹…xj+1)d(x_i \cdot x_j + 1)^d๊ณก์„  ๊ด€๊ณ„ ํ‘œํ˜„
RBF (Gaussian)( e^{-\gamma

๐Ÿงช Python ์‹ค์Šต

from sklearn.decomposition import KernelPCA

kpca = KernelPCA(n_components=2, kernel='rbf')
X_kpca = kpca.fit_transform(X_scaled)

plt.scatter(X_kpca[:,0], X_kpca[:,1], c=y, cmap='rainbow')
plt.title('Kernel PCA (RBF)')
plt.show()

๐Ÿ’ก RBF ์ปค๋„์€ ๋น„์„ ํ˜• ๊ฒฝ๊ณ„๋ฅผ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ํ‘œํ˜„ํ•ด
โ€œ๊ณก์„ ํ˜• ๋ถ„๋ฆฌโ€๊ฐ€ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ์—์„œ ๊ฐ•๋ ฅํ•œ ํšจ๊ณผ๋ฅผ ๋‚ธ๋‹ค.


๐Ÿงช R ์‹ค์Šต

library(kernlab)
kpca_model = kpca(~., data=dataset, kernel="rbfdot", features=2)
pcv = rotated(kpca_model)
plot(pcv[,1], pcv[,2], col=dataset$Class)

5๏ธโƒฃ ์„ธ ๊ธฐ๋ฒ• ๋น„๊ต ์š”์•ฝ

๊ตฌ๋ถ„PCALDAKernel PCA
์ง€๋„/๋น„์ง€๋„๋น„์ง€๋„์ง€๋„๋น„์ง€๋„
์ ์šฉ ๋Œ€์ƒ์„ ํ˜• ๋ฐ์ดํ„ฐ๋ถ„๋ฅ˜ ๋ฐ์ดํ„ฐ๋น„์„ ํ˜• ๋ฐ์ดํ„ฐ
๋ชฉ์ ๋ถ„์‚ฐ ์ตœ๋Œ€ํ™”ํด๋ž˜์Šค ๋ถ„๋ฆฌ๋น„์„ ํ˜• ํŒจํ„ด ํ•™์Šต
์ปค๋„ ์‚ฌ์šฉโœ—โœ—โœ“
๊ฒฐ๊ณผ ํ•ด์„์ง๊ต ์ฃผ์„ฑ๋ถ„๋ถ„๋ฆฌ ์ถ•๋งคํ•‘๋œ ๊ณต๊ฐ„ ์ถ•

6๏ธโƒฃ ํ™œ์šฉ ์‚ฌ๋ก€

๋ถ„์•ผ์ ์šฉ ์˜ˆ์‹œ
๋ฐ์ดํ„ฐ ์‹œ๊ฐํ™”๊ณ ์ฐจ์› ๋ฐ์ดํ„ฐ์˜ 2D ํ‘œํ˜„
์ด๋ฏธ์ง€ ์••์ถ•ํ”ฝ์…€ ์ฐจ์› ์ถ•์†Œ
์ด์ƒ ํƒ์ง€๋…ธ์ด์ฆˆ ์ œ๊ฑฐ, ์ด์ƒ์น˜ ๊ฒ€์ถœ
๋ถ„๋ฅ˜ ์‚ฌ์ „์ฒ˜๋ฆฌ์ฐจ์› ์ถ•์†Œ ํ›„ SVM, KNN, ANN ์ ์šฉ

7๏ธโƒฃ Python ํ†ตํ•ฉ ํ…œํ”Œ๋ฆฟ

from sklearn.decomposition import PCA, KernelPCA
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA

# 1. PCA
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X_scaled)

# 2. LDA
lda = LDA(n_components=2)
X_lda = lda.fit_transform(X_scaled, y)

# 3. Kernel PCA
kpca = KernelPCA(n_components=2, kernel='rbf')
X_kpca = kpca.fit_transform(X_scaled)

8๏ธโƒฃ ๊ฒฐ๋ก 

์ฐจ์› ์ถ•์†Œ๋Š” ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹จ์ˆœํ™”ํ•˜์—ฌ
๋ชจ๋ธ ํšจ์œจ์„ฑยท์‹œ๊ฐํ™”ยท์ผ๋ฐ˜ํ™” ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ํ•ต์‹ฌ ์ „์ฒ˜๋ฆฌ ๋‹จ๊ณ„๋‹ค.

๐Ÿ“˜ ํ•ต์‹ฌ ์š”์•ฝ

๊ธฐ๋ฒ•ํ•ต์‹ฌ ๊ฐœ๋…์žฅ์ ๋‹จ์ 
PCA๋ถ„์‚ฐ ๊ทน๋Œ€ํ™” ์ถ• ์ฐพ๊ธฐ๋‹จ์ˆœ, ๋น ๋ฆ„ํด๋ž˜์Šค ์ •๋ณด ๋ฏธ์‚ฌ์šฉ
LDAํด๋ž˜์Šค ๊ฐ„ ๋ถ„๋ฆฌ ๊ทน๋Œ€ํ™”๋ถ„๋ฅ˜ ์ •ํ™•๋„ ํ–ฅ์ƒ๋น„์„ ํ˜• ๋ฐ์ดํ„ฐ์— ์•ฝํ•จ
Kernel PCA์ปค๋„ ๊ธฐ๋ฐ˜ ๋น„์„ ํ˜• ์ถ•์†Œ๋ณต์žกํ•œ ํŒจํ„ด ํ‘œํ˜„๊ณ„์‚ฐ๋Ÿ‰ ํผ
profile
Tech Blog

0๊ฐœ์˜ ๋Œ“๊ธ€