์ ํ ํ๋ณ ๋ถ์(Linear Discriminant Analysis)์ ๊ท์ ๊ฐ ์๋ ๋ชจ๋ธ์์ ์ค๋ฒํผํ ์ ๋๋ฅผ ์ค์ด๊ณ ๊ณ์ฐ ํจ์จ์ ์ ๋์ด๊ธฐ ์ํด ์ฌ์ฉ๋๋ ํน์ฑ์ถ์ถ ๊ธฐ๋ฒ์ ๋๋ค.
LDA์ ๊ฐ๋ ์ PCA์ ์๋นํ ์ ์ฌํฉ๋๋ค. PCA๊ฐ ๋ฐ์ดํฐ์ ์ ๋ถ์ฐ์ด ์ต๋์ธ ์ฑ๋ถ์ถ์ ์ฐพ๋ ๊ฒ์ด ๋ชฉํ๋ผ๋ฉด LDA๋ ํด๋์ค๋ฅผ ์ต์ ์ผ๋ก ๊ตฌ๋ถํ ์ ์๋ ํน์ฑ ๋ถ๋ถ ๊ณต๊ฐ์ ์ฐพ๋ ๊ฒ์ ๋๋ค.
1. ์ฃผ์ฑ๋ถ ๋ถ์ vs ์ ํ ํ๋ณ ๋ถ์
PCA์ LDA ๋ชจ๋ ๋ฐ์ดํฐ์ ์ ์ฐจ์ ๊ฐ์๋ฅผ ์ค์ด๋ ์ ํ ๋ณํ ๊ธฐ๋ฒ์ด์ง๋ง PCA๋ ๋น์ง๋, LDA๋ ์ง๋ํ์ต์ด๋ผ๋ ์ ์์ ๋ค๋ฆ ๋๋ค. ์ฌ๊ธฐ์ ์ฌ๋ฌ๋ถ์ LDA๊ฐ ํด๋์ค ๊ตฌ๋ถ์ ์ํด ํน์ฑ ๋ถ๋ถ ๊ณต๊ฐ์ ์ฐพ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋ ๋ถ๋ฅ์ ๋ฐ์ด๋๋ค๊ณ ์๊ฐํ์ค ์ ์๋๋ฐ์, ์ฌ์ค์ ๊ทธ๋ ์ง๋ ์์ต๋๋ค.
๋ง๋ฅดํฐ๋ค์ค๋ PCA๋ฅผ ํตํ ์ ์ฒ๋ฆฌ๊ฐ ํน์ฑ ์ด๋ฏธ์ง ์ธ์ ์์ ์ ๋ ๋ฐ์ด๋ ๋ถ๋ฅ ๊ฒฐ๊ณผ๋ฅผ ๋ธ๋ค๊ณ ๋ณด๊ณ ํ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ๋ ๊ฐ์ ํด๋์ค ๋ ์ด๋ธ์ด ์๋ค๊ณ ๊ฐ์ ํด๋ณผ๊น์?
์ ๊ทธ๋ฆผ์์ x ์ถ, LD1์ ํฌ์๋๋ ์ ํ ํ๋ณ ๋ฒกํฐ๋ ๋ ๊ฐ์ง ํด๋์ค๋ฅผ ์ ๊ตฌ๋ถํด์ค๋๋ค. ํ์ง๋ง y์ถ, LD2๋ก ํฌ์๋๋ ์ ํ ํ๋ณ ๋ฐฑํฐ๋ ๋ถ์ฐ์ ์ก์๋ด๋ ํด๋์ค ํ๋ณ ์ ๋ณด๊ฐ ์์ด ์ข์ ์ ํ ํ๋ณ ๋ฒกํฐ๋ ์๋๋๋ค.
LDA๋ ๋ฐ์ดํฐ๊ฐ ์ ๊ท๋ถํฌ๋ผ๊ณ ๊ฐ์ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ํด๋์ค๋ ๋์ผํ ๊ณต๋ถ์ฐ ํ๋ ฌ์ ๊ฐ๊ณ ์ํ์ ์๋ก ํต๊ณ์ ์ผ๋ก ๋ ๋ฆฝ์ด๋ผ๊ณ ๊ฐ์ ํฉ๋๋ค. ํ์ง๋ง ์ด ๊ฐ์ ๋ค์ด ์กฐ๊ธ ์๋ฐ๋๋ค๊ณ ํ๋๋ผ๋ LDA๋ ์ฐจ์์ถ์๋ฅผ ์ ์ํํฉ๋๋ค.
2. ์ ํ ํ๋ณ ๋ถ์์ ๋ด๋ถ ๋์ ๋ฐฉ์
PCA์ ๋ง์ฐฌ๊ฐ์ง๋ก LDA์ ๋จ๊ณ๋ฅผ ์์ฝํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
-
d์ฐจ์ ๋ฐ์ดํฐ์ ์ ํ์คํ ์ ์ฒ๋ฆฌํฉ๋๋ค. (d = ํน์ฑ๊ฐ์)
-
๊ฐ ํด๋์น ๋ํด d์ฐจ์ ํ๊ท ๋ฒกํฐ๋ฅผ ๊ณ์ฐํฉ๋๋ค.
-
ํด๋์ค ๊ฐ์ ์ฐํฌ ํ๋ ฌ(scatter matrix) S(B)์ ํด๋์ค ๋ด๋ถ์ ์ฐํฌํ๋ ฌ S(W)๋ฅผ ๊ตฌ์ฑํฉ๋๋ค.
-
S(W)์ ์ญํ๋ ฌ๊ณผ S(B)์ ๊ณฑํ๋ ฌ์ ๊ณ ์ ๋ฒกํฐ์ ๊ณ ์ณ๊ฐ์ ๊ณ์ฐํฉ๋๋ค.
-
๊ณ ์ณ๊ฐ์ ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํด ์์๋ฅผ ๋งค๊น๋๋ค.
-
๊ณ ์ณ๊ฐ์ด ๊ฐ์ฅ ํฐ k๊ฐ์ ๊ณ ์ ๋ฒกํฐ๋ฅผ ์ ํํด d * k ์ฐจ์์ ๋ณํํ๋ ฌ W๋ฅผ ๊ตฌํฉ๋๋ค.
-
๋ณํ ํ๋ ฌ W๋ฅผ ์ฌ์ฉํด ์๋ก์ด ํน์ฑ ๋ถ๋ถ ๊ณต๊ฐ์ผ๋ก ํฌ์ํฉ๋๋ค.
์ด ๊ณผ์ ์ด ๊ต์ฅํ ๋ฏ์ต์ฃ ? LDA๋ ํ๋ ฌ์ ๊ณ ์ณ๊ฐ๊ณผ ๊ณ ์ ๋ฒกํฐ๋ก ๋ถํดํด์ ์๋ก์ด ์ ์ฒ์ ํน์ฑ ๊ณต๊ฐ์ ๊ตฌ์ฑํ๋ค๋ ์ ์์ ๋งค์ฐ PCA์ ๋น์ทํฉ๋๋ค. ๋ฌผ๋ก LDA๋ 2๋จ๊ณ์์ ํ๊ท ๋ฒกํฐ๋ฅผ ๋ง๋ค ๋ ํด๋์ค ๋ ์ด๋ธ ์ ๋ณด๋ฅผ ์ฌ์ฉํ๊ณ , ๋ ์ด๋ธ ๋ณ๋ก ๋ฐ์ดํฐ๋ฅผ ๋๋์ด ํ๊ท ์ ๊ตฌํ๋ค๋ ์ ์์ ๋ค๋ฅด์ง๋ง์.
3. ์ฐํฌ ํ๋ ฌ ๊ณ์ฐ
์ด์ ์ธ์ PCA์์ 1์ ๊ณผ์ ์ ์ด๋ฏธ ํด๋์๊ธฐ ๋๋ฌธ์, ํ๊ท ๋ฒกํฐ ๊ณ์ฐ๋ถํฐ ํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. ํ๊ท ๋ฒกํฐ๋ฅผ ์ฌ์ฉํด ํด๋์ค ๊ฐ ์ฐํฌ ํ๋ ฌ๊ณผ ํด๋์ค ๋ด๋ถ์ ์ฐํฌ ํ๋ ฌ์ ๊ตฌ์ฑํฉ๋๋ค. ํ๊ท ๋ฒกํฐ m์ ํด๋์ค i์ ์ํ์ ๋ํ ํ๊ท ๊ฐ ๋ฎค๋ฅผ ์ ์ฅํฉ๋๋ค.
์ด๋ ๊ฒ ํ๋ฉด ์ธ ๊ฐ์ ํธ๊ท ๋ฒกํฐ๊ฐ ๋ง๋ค์ด์ง๋๋ค. (Wine ๋ฐ์ดํฐ์ ๊ธฐ์ค, ํด๋์ค๊ฐ 3๊ฐ!)
np.set\_printoptions(precision=4)
mean\_vecs = \[\]
for label in range(1, 4):
[mean\_vecs.append(np.mean(X\_train\_std\[y\_train](mean_vecs.append(np.mean(X_train_std%5By_train) == label\], axis=0))
print('MV %s: %s\\n' % (label, mean\_vecs\[label - 1\]))
ํ๊ท ๋ฒกํฐ๋ฅผ ์ฌ์ฉํด์ ํด๋์ค ๋ด๋ถ ์ฐํฌ ํ๋ ฌ S(W)๋ฅผ ๊ณ์ฐํ ์ ์์ต๋๋ค.
์ฌ๊ธฐ์ ๊ฐ๋ณ ํด๋์ค i์ ์ฐํฌํ๋ ฌ S(i)๋ฅผ ๊ณ์ฐํ ์ ์์ต๋๋ค.
d = 13 # ํน์ฑ์ ์
S\_W = [np.zeros((d,](np.zeros((d,) d))
for label, mv in zip(range(1, 4), mean\_vecs):
class\_scatter = [np.zeros((d,](np.zeros((d,) d)) # scatter matrix for each class
for row in X\_train\_std\[y\_train == label\]:
row, mv = row.reshape(d, 1), mv.reshape(d, 1) # make column vectors
class\_scatter += (row - mv).dot((row - mv).T)
S\_W += class\_scatter # sum class scatter matrices
print('ํด๋์ค ๋ด์ ์ฐํฌ ํ๋ ฌ: %sx%s' % ([S\_W.shape\[0\],](S_W.shape%5B0%5D,) [S\_W.shape\[1\]))](S_W.shape%5B1%5D)))
์ฐํฌ ํ๋ ฌ์ ๊ณ์ฐํ ๋์๋ ํ๋ จ ์ธํธ์ ํด๋์ค ๋ ์ด๋ธ์ด ๊ท ๋ฑํ๊ฒ ๋ถํฌ๋์ด ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ํ์ง๋ง ํด๋์ค ๋ ์ด๋ธ ๊ฐ์๋ฅผ ์ถ๋ ฅํ๋ฉด ์ด ๊ฐ์ ์ด ํ๋ ธ๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
print('ํด๋์ค ๋ ์ด๋ธ ๋ถํฌ: %s'
% np.bincount(y\_train)\[1:\])
๊ฐ๋ณ ์ฐํฌ ํ๋ ฌ์ ์ ์ฒด์ ๋ํ๊ธฐ ์ ์ ์ค์ผ์ผ์ ์กฐ์ ํด์ฃผ์ด์ผ ํฉ๋๋ค. ์ฐํฌ ํ๋ ฌ์ ํด๋์ค ์ํ ๊ฐ์๋ก ๋๋๋ฉด ์ฐํฌ ํ๋ ฌ์ ๊ณ์ฐํ๋ ๊ฒ ๊ณต๋ถ์ฐ ํ๋ ฌ์ ๊ณ์ฐํ๋ ๊ฒ๊ณผ ๊ฐ์์ ์ ์ ์์ต๋๋ค. ์ฆ, ๊ณต๋ถ์ฐ ํ๋ ฌ์ ์ฐํฌ ํ๋ ฌ์ ์ ๊ทํ ๋ฒ์ ์ ๋๋ค!
d = 13 # ํน์ฑ์ ์
S\_W = [np.zeros((d,](np.zeros((d,) d))
for label, mv in zip(range(1, 4), mean\_vecs):
class\_scatter = [np.cov(X\_train\_std\[y\_train](np.cov(X_train_std%5By_train) == label\].T, bias=True)
S\_W += class\_scatter
print('์ค์ผ์ผ ์กฐ์ ๋ ํด๋์ค ๋ด์ ์ฐํฌ ํ๋ ฌ: %sx%s' % ([S\_W.shape\[0\],](S_W.shape%5B0%5D,)
[S\_W.shape\[1\]))](S_W.shape%5B1%5D)))
ํด๋์ค ๋ด๋ถ์ ์ฐํฌ ํ๋ ฌ์ ๊ณ์ฐํ ๋ค์, ๋ค์ ๋จ๊ณ๋ก ํด๋์ค ๊ฐ์ ์ฐํฌํ๋ ฌ์ ๊ณ์ฐํฉ๋๋ค. ์ฌ๊ธฐ์ m์ ๋ชจ๋ ํด๋์ค์ ์ํ์ ํฌํจํด ๊ณ์ฐํ ์ ์ฒด ํ๊ท ์ ๋๋ค.
mean\_overall = [np.mean(X\_train\_std,](np.mean(X_train_std,) axis=0)
mean\_overall = mean\_overall.reshape(d, 1) # ์ด ๋ฒกํฐ๋ก ๋ง๋ค๊ธฐ
d = 13 # ํน์ฑ์ ์
S\_B = [np.zeros((d,](np.zeros((d,) d))
for i, mean\_vec in enumerate(mean\_vecs):
n = X\_train\[y\_train == i + 1, :\].shape\[0\]
mean\_vec = mean\_vec.reshape(d, 1) # ์ด ๋ฒกํฐ๋ก ๋ง๋ค๊ธฐ
S\_B += n \* (mean\_vec - mean\_overall).dot((mean\_vec - mean\_overall).T)
print('ํด๋์ค ๊ฐ์ ์ฐํฌ ํ๋ ฌ: %sx%s' % ([S\_B.shape\[0\],](S_B.shape%5B0%5D,) [S\_B.shape\[1\]))](S_B.shape%5B1%5D)))
4. ์๋ก์ด ํน์ฑ ๋ถ๋ถ ๊ณต๊ฐ์ ์ํด ์ ํ ํ๋ณ ๋ฒกํฐ ์ ํ
๋จ์ ๋จ๊ณ๋ PCA์ ์ ์ฌํฉ๋๋ค. ์ด์ ๊ณต๋ถ์ฐ ํ๋ ฌ์ ๊ณ ์ณ๊ฐ์ ๋ถํดํ๋ ๋์ ํ๋ ฌ S(W)์ ์ญํ๋ ฌ๊ณผ S(B)์ ๊ณฑํ๋ ฌ์ ๊ณ ์ณ๊ฐ์ ๊ณ์ฐํด์ฃผ๋ฉด ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ณ ์ณ๊ฐ์ ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํฉ๋๋ค.
eigen\_vals, eigen\_vecs = [np.linalg.eig(np.linalg.inv(S\_W).dot(S\_B))](np.linalg.eig(np.linalg.inv(S_W).dot(S_B)))
...
(๊ณ ์ณ๊ฐ, ๊ณ ์ ๋ฒกํฐ) ํํ์ ๋ฆฌ์คํธ๋ฅผ ๋ง๋ญ๋๋ค.
eigen\_pairs = \[([np.abs(eigen\_vals\[i\]),](np.abs(eigen_vals%5Bi%5D),) eigen\_vecs\[:, i\])
for i in range(len(eigen\_vals))\]
# (๊ณ ์ณ๊ฐ, ๊ณ ์ ๋ฒกํฐ) ํํ์ ํฐ ๊ฐ์์ ์์ ๊ฐ ์์๋๋ก ์ ๋ ฌํฉ๋๋ค.
eigen\_pairs = sorted(eigen\_pairs, key=lambda k: k\[0\], reverse=True)
# ๊ณ ์ณ๊ฐ์ ์ญ์์ผ๋ก ์ฌ๋ฐ๋ฅด๊ฒ ์ ๋ ฌ๋์๋์ง ํ์ธํฉ๋๋ค.
print('๋ด๋ฆผ์ฐจ์์ ๊ณ ์ณ๊ฐ:\\n')
for eigen\_val in eigen\_pairs:
print(eigen\_val\[0\])
LDA์์ ์ ํ ํ๋ณ ๋ฒกํฐ๋ ์ต๋ c-1๊ฐ ์ ๋๋ค. c๋ ํด๋์ค ๋ ์ด๋ธ ๊ฐ์์ ๋๋ค.
์ด์ ์ ํ ํ๋ณ ๋ฒกํฐ๋ก ์ฐพ์ ํด๋์ค ํ๋ณ ์ ๋ณด๋ฅผ ์ธก์ ํ๊ธฐ ์ํด ๊ณ ์ณ๊ฐ ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ํ ํ๋ณ ๋ฒกํฐ๋ฅผ ๊ทธ๋ ค๋ณด๊ฒ ์ต๋๋ค.
tot = sum([eigen\_vals.real)](eigen_vals.real))
discr = \[(i / tot) for i in sorted([eigen\_vals.real,](eigen_vals.real,) reverse=True)\]
cum\_discr = [np.cumsum(discr)](np.cumsum(discr))
[plt.bar(range(1,](plt.bar(range(1,) 14), discr, alpha=0.5, align='center',
label='individual "discriminability"')
[plt.step(range(1,](plt.step(range(1,) 14), cum\_discr, where='mid',
label='cumulative "discriminability"')
[plt.ylabel('](plt.ylabel(')"discriminability" ratio')
[plt.xlabel('Linear](plt.xlabel('Linear) Discriminants')
[plt.ylim(\[-0.1,](plt.ylim(%5B-0.1,) 1.1\])
[plt.legend(loc='best')](plt.legend(loc='best'))
plt.tight\_layout()
[plt.show()](plt.show())
๊ทธ๋ํ์์ ํ์ธํ ์ ์๋ฏ ๋ ๊ฐ์ ์ ํ ํ๋ณ ๋ฒกํฐ๊ฐ Wine ๋ฐ์ดํฐ ์ ์ ์ ๋ณด๋์ 100%๋ฅผ ๋ด๋นํฉ๋๋ค.
์ด์ ๋ ๊ฐ์ ํ๋ณ ๋ฒกํฐ๋ฅผ ์ด๋ก ๋ง๋ค์ด ๋ณํ ํ๋ ฌ W๋ก ๋ง๋ค์ด์ฃผ๋ฉด ๋ฉ๋๋ค.
w = [np.hstack((eigen\_pairs\[0\]\[1\]\[:,](np.hstack((eigen_pairs%5B0%5D%5B1%5D%5B:,) np.newaxis\].real,
eigen\_pairs\[1\]\[1\]\[:, np.newaxis\].real))
print('ํ๋ ฌ W:\\n', w)
5. ์๋ก์ด ํน์ฑ ๊ณต๊ฐ์ผ๋ก ํฌ์
์ด์ ๋ณํ ํ๋ ฌ W๋ฅผ ํ๋ จ ์ธํธ์ ๊ณฑํด ๋ฐ์ดํฐ๋ฅผ ๋ณํํด์ค๋๋ค.
X\_train\_lda = [X\_train\_std.dot(w)](X_train_std.dot(w))
colors = \['r', 'b', 'g'\]
markers = \['s', 'x', 'o'\]
for l, c, m in zip([np.unique(y\_train),](np.unique(y_train),) colors, markers):
plt.scatter(X\_train\_lda\[y\_train == l, 0\],
X\_train\_lda\[y\_train == l, 1\] \* (-1),
c=c, label=l, marker=m)
[plt.xlabel('LD](plt.xlabel('LD) 1')
[plt.ylabel('LD](plt.ylabel('LD) 2')
[plt.legend(loc='lower](plt.legend(loc='lower) right')
plt.tight\_layout()
[plt.show()](plt.show())
์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ์ธ ๊ฐ์ ์์ธ ํด๋์ค๋ฅผ ์๋ก์ด ๋ถ๋ถ๊ณต๊ฐ์ ํฌ์ํ์์ต๋๋ค. ์ด์ ์ ํ์ ์ผ๋ก ๊ตฌ๋ถํ ์ ์์ต๋๋ค!
6. ์ฌ์ดํท๋ฐ์ LDA
์ง๊ธ๊น์ง ๋จ๊ณ๋ณ๋ก LDA๋ฅผ ๊ตฌํํด๋ณด์์ผ๋ ์ด์ ์ฌ์ดํท๋ฐ์ผ๋ก ๊ตฌํ๋ LDA ํด๋์ค๋ฅผ ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
from sklearn.discriminant\_analysis import LinearDiscriminantAnalysis as LDA
lda = LDA(n\_components=2)
X\_train\_lda = lda.fit\_transform(X\_train\_std, y\_train)
...
from sklearn.linear\_model import LogisticRegression
lr = LogisticRegression(solver='liblinear', multi\_class='auto')
lr = [lr.fit(X\_train\_lda,](lr.fit(X_train_lda,) y\_train)
plot\_decision\_regions(X\_train\_lda, y\_train, classifier=lr)
[plt.xlabel('LD](plt.xlabel('LD) 1')
[plt.ylabel('LD](plt.ylabel('LD) 2')
[plt.legend(loc='lower](plt.legend(loc='lower) left')
plt.tight\_layout()
[plt.show()](plt.show())
LDA๋ก ๋ณํํ ์ ์ฐจ์ ํ๋ จ ๋ฐ์ดํฐ์ ์ ๋ถ๋ฅ๊ธฐ๋ฅผ ๋์์์ผฐ์ ๋, ํด๋์ค 2์ ์ํ ํ๋๋ฅผ ์ ๋๋ก ๋ถ๋ฅํ์ง ๋ชปํ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค. ์ด๋ ๊ท์ ๊ฐ๋๋ฅผ ์ด์ง ๋ฎ์ถ์ด ๋ชจ๋ ์ํ์ ๋ถ๋ฅํ๋๋ก ํ ์ ์์ง๋ง, ์ผ๋จ ํ ์คํธ ์ธํธ์ ๊ฒฐ๊ณผ๋ฅผ ๋ณผ๊น์?
X\_test\_lda = lda.transform(X\_test\_std)
plot\_decision\_regions(X\_test\_lda, y\_test, classifier=lr)
[plt.xlabel('LD](plt.xlabel('LD) 1')
[plt.ylabel('LD](plt.ylabel('LD) 2')
[plt.legend(loc='lower](plt.legend(loc='lower) left')
plt.tight\_layout()
[plt.show()](plt.show())
๊ทธ๋ํ์์ ๋ณผ ์ ์๋ฏ ๋ถ๋ฅ๊ธฐ๊ฐ ํ ์คํธ ์ธํธ๋ฅผ ์๋ฒฝํ๊ฒ ๋ถ๋ฅํ์ต๋๋ค. ์ด ๊ฒฝ์ฐ์๋ ๊ตณ์ด ๊ณผ๋์ ํฉ์ ์ํ์ ์ฌ๋ฆฌ๋ฉด์๊น์ง ๊ท์ ๋ฅผ ๊ฐํํ ํ์๊ฐ ์์ต๋๋ค.
๋ง์ง๋ง์ผ๋ก ์ ๋ฆฌ๋ฅผ ํ ๋ฒ ํด๋ณผ๊น์? LDA๋ PCA์ ์๋นํ ์ ์ฌํฉ๋๋ค. ๋ค๋ง LDA์ ๋ชฉ์ ์ ํด๋์ค ๋ถ๋ฆฌ๋ฅผ ์ต๋ํํ๋ ์ฃผ์ถ์ ์ฐพ๋ ๊ฒ์ด๊ณ , ์ง๋ํ์ต์ด๋ผ ํด๋์ค ๋ ์ด๋ธ์ด ์๋ค๋ ์ ์ด์ฃ . ๋ฑ์ฅํ ์ฐํฌํ๋ ฌ์ ๊ณต๋ถ์ฐ ํ๋ ฌ์ ์ ๊ทํ ์ ๋จ๊ณ์ด๊ณ , ์ ํ ํ๋ณ ๋ฒกํฐ๋ ํด๋ ์ค ๋ ์ด๋ธ์ ๊ฐ์ - 1๋ณด๋ค ํด ์ ์์ต๋๋ค. PCA์ฒ๋ผ ๋ณํ ํ๋ ฌ์ ๋ง๋ค๊ณ ๊ณฑ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณํํด์ฃผ์ฃ .
์ฌ๊ธฐ๊น์ง ์ ํ ํ๋ณ ๋ถ์ LDA๋ฅผ ์์๋ณด์์ต๋๋ค. PCA์ ์ ๋ง ์ ์ฌํ์ฃ ? ์ ๋ณด๊ณ ์ค์ ๋ถ๋ค์ ์ด์ ์ธ์ ์ PCA๋ฅผ ๊ผญ ํ์ธํ๊ณ ์ค์๊ธฐ๋ฅผ ์ถ์ฒ๋๋ฆฝ๋๋ค. ๋ค์ ์ธ์ 15์์๋ PCA์ ์ฐ๊ฒฐ๋ ์ปค๋ PCA๋ฅผ ๋ค๋ฃฐ ์์ ์ด๋, 13, 14, 15๋ฒ์ ํจ๊ป ์ฝ๋ ๊ฒ์ ์ถ์ฒ๋๋ฆฝ๋๋ค. ๋ค์ ์ธ์ ์์ ๋ดฌ์!