[๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹] Session 15. ์ปค๋„ PCA๋ฅผ ์ด์šฉํ•œ ๋น„์„ ํ˜• ๋งคํ•‘

2020. 2. 24. 12:27ยท๐Ÿฌ ML & Data/๐ŸŽซ ๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹
728x90

C. ์ปค๋„ PCA๋ฅผ ์‚ฌ์šฉํ•œ ๋น„์„ ํ˜• ๋งคํ•‘

์—ฌํƒœ๊นŒ์ง€ ๋งŽ์€ ๋จธ์‹  ๋Ÿฌ๋‹ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ž…๋ ฅ ๋ฐ์ดํ„ฐ๊ฐ€ ์„ ํ˜•์ ์œผ๋กœ ๊ตฌ๋ถ„์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฐ€์ •์„ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์•Œ๊ณ ๋ฆฌ์ฆ˜๋“ค-์•„๋‹ฌ๋ฆฐ, ๋กœ์ง€์Šคํ‹ฑ ํšŒ๊ท€, SVM-์€ ์„ ํ˜•์ ์œผ๋กœ ์™„๋ฒฝํ•˜๊ฒŒ ๋ถ„๋ฆฌ๋˜์ง€ ์•Š๋Š” ์ด์œ ๋ฅผ ์žก์Œ๋•Œ๋ฌธ์ด๋ผ๊ณ  ์ด์•ผ๊ธฐํ•ฉ๋‹ˆ๋‹ค.

์‹ค์ „์—์„œ๋Š” ๋” ์ž์ฃผ ๋น„์„ ํ˜• ๋ฌธ์ œ๋“ค์„ ๋งž๋‹ฅ๋œจ๋ฆฝ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ์— ํ•ญ์ƒ PCA๋‚˜ LDA์™€ ๊ฐ™์€ ์ฐจ์› ์ถ•์†Œ ๊ธฐ๋ฒ•์ด ์ตœ์„ ์ด๋ผ๊ณ ๋Š” ๋งํ•  ์ˆ˜ ์—†๊ฒ ์ฃ . ์ด์ œ๋ถ€ํ„ฐ ์•Œ์•„๋ณผ ๊ฒƒ์€ PCA์˜ ์ปค๋„ํ™” ๋ฒ„์ „์ธ KPCA์ž…๋‹ˆ๋‹ค.

 

 

1. ์ปค๋„ ํ•จ์ˆ˜์™€ ์ปค๋„ ํŠธ๋ฆญ

์•ž์„  ์„ธ์…˜์—์„œ ์ปค๋„ SVM์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•œ ๊ฒƒ์„ ๋– ์˜ฌ๋ ค๋ณด๋ฉด, ๋น„์„ ํ˜• ๋ฌธ์ œ๋ฅผ ํ’€๊ธฐ ์œ„ํ•ด ๊ณ ์ฐจ์› ๊ณต๊ฐ„์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ํˆฌ์˜ํ•ด ํ’€์—ˆ์Šต๋‹ˆ๋‹ค. k ๊ณ ์ฐจ์› ๋ถ€๋ถ„ ๊ณต๊ฐ„์— ์žˆ๋Š” ์ƒ˜ํ”Œ์„ ๋ณ€ํ™˜ํ•˜๊ธฐ ์œ„ํ•ด ๋น„์„ ํ˜• ๋งคํ•‘ ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

 

 

์ด ํ•จ์ˆ˜๋ฅผ d์ฐจ์› ๋ณด๋‹ค ๋” ํฐ k์ฐจ์›์œผ๋กœ ๋งคํ•‘ํ•˜๊ธฐ ์œ„ํ•ด ์›๋ณธ ํŠน์„ฑ์˜ ๋น„์„ ํ˜• ์กฐํ•ฉ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. 2์ฐจ์›์˜ ํŠน์„ฑ๋ฒกํ„ฐ๋ฅผ ๋งคํ•‘ ๊ฐ€๋Šฅํ•œ 3์ฐจ์› ๊ณต๊ฐ„์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

 

์ค‘๊ฐ„ ์ •๋ฆฌ๋ฅผ ํ•˜๋ฉด, ์ปค๋„ PCA๋กœ ๋น„์„ ํ˜• ๋งคํ•‘์„ ์ˆ˜ํ–‰ํ•ด์„œ ๊ณ ์ฐจ์› ๊ณต๊ฐ„์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ณ , ํ‘œ์ค€ PCA๋กœ ์ƒ˜ํ”Œ์ด ์„ ํ˜• ๋ถ„๋ฅ˜๊ธฐ๋กœ ๊ตฌ๋ถ„๋  ์ˆ˜ ์žˆ๋Š” ์ €์ฐจ์›์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ํˆฌ์˜์‹œํ‚ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ๋ฐฉ์‹์˜ ๋‹จ์ ์€ ๊ณ„์‚ฐ ๋น„์šฉ์ด ๋งค์šฐ ๋น„์‹ธ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. ์ด ๋ถ€๋ถ„์—์„œ ์ปค๋„ ํŠธ๋ฆญ(kernel trick)์ด ๋“ฑ์žฅํ•ฉ๋‹ˆ๋‹ค. ์ปค๋„ ํŠธ๋ฆญ์„ ์‚ฌ์šฉํ•˜๋ฉด ์›๋ณธ ํŠน์„ฑ ๊ณต๊ฐ„์—์„œ ๋‘ ๊ณ ์ฐจ์› ํŠน์„ฑ ๋ฒกํ„ฐ์˜ ์œ ์‚ฌ๋„๋ฅผ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ปค๋„ ํŠธ๋ฆญ์˜ ์—ญํ• ์„ ์•Œ์•„๋ณด๊ธฐ ์ „์— ๋‹ค์‹œ PCA ๋ฐฉ์‹์˜ ์ˆ˜์‹์„ ์ƒ๊ฐํ•ด๋ณผ๊นŒ์š”?

ํŠน์„ฑ k์™€ j์˜ ๊ณต๋ถ„์‚ฐ์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

 

์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ๋Š” ํŠน์„ฑ ํ‰๊ท  ๋ฎค๋ฅผ 0์— ๋งž์ถ”์—ˆ์œผ๋ฏ€๋กœ ์•„๋ž˜์™€ ๊ฐ™์ด ๊ฐ„๋‹จํžˆ ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

์ด ์‹์€ ๋‘ ํŠน์„ฑ ๊ฐ„์˜ ๊ณต๋ถ„์‚ฐ์ž…๋‹ˆ๋‹ค. ์ด์ œ ๊ณต๋ถ„์‚ฐ ํ–‰๋ ฌ์˜ ์ผ๋ฐ˜์‹์œผ๋กœ ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค.

 

 

๋ฒ ๋ฅธํ•˜๋ฅดํŠธ ์А์ฝ”ํ”„๋Š” ์ด ๋ฐฉ์‹์„ ์ผ๋ฐ˜ํ™”ํ•ด ํŒŒ์ด๋ฅผ ํ†ตํ•œ ๋น„์„ ํ˜• ํŠน์„ฑ ์กฐํ•ฉ์œผ๋กœ ์›๋ณธ ํŠน์„ฑ๊ณต๊ฐ„์˜ ์ƒ˜ํ”Œ๊ฐ„ ์ ๊ณฑ์„ ๋Œ€์ฒดํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์‹์ด ์•„๋ž˜์™€ ๊ฐ™ ์Šต๋‹ˆ๋‹ค.

 

 

๊ทธ๋ฆฌ๊ณ  ๋‚˜์„œ ๊ณ ์œ ๋ฒกํ„ฐ๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด ์•„๋ž˜ ์‹์„ ํ’€์–ด์ค๋‹ˆ๋‹ค.

 

 

์—ฌ๊ธฐ์„œ ๋žŒ๋‹ค์™€ v๋Š” ๊ณต๋ถ„์‚ฐ ํ–‰๋ ฌ์˜ ๊ณ ์œณ๊ฐ’๊ณผ ๊ณ ์œ  ๋ฒกํ„ฐ์ž…๋‹ˆ๋‹ค. a๋Š” ์ปค๋„(์œ ์‚ฌ๋„) ํ–‰๋ ฌ K์˜ ๊ณ ์œ ๋ฒกํ„ฐ๋ฅผ ์ถ”์ถœํ•จ์œผ๋กœ์จ ๊ตฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

์ปค๋„ SVM์„ ์ƒ๊ฐํ•ด๋ณด๋ฉด ์ปค๋„ ํŠธ๋ฆญ์„ ์‚ฌ์šฉํ•ด ์ƒ˜ํ”Œ x๋ผ๋ฆฌ์˜ ํŒŒ์ด ํ•จ์ˆ˜ ์ ๊ณฑ์„ ์ปค๋„ ํ•จ์ˆ˜ K๋กœ ๋ฐ”๊ฟ” ๊ณ ์œ  ๋ฒกํ„ฐ๋ฅผ ๊ณ„์‚ฐํ•  ํ•„์š”๊ฐ€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

์ปค๋„ PCA๋Š” ๊ทธ๋ƒฅ PCA์ฒ˜๋Ÿผ ํˆฌ์˜ํ–‰๋ ฌ์„ ๊ตฌ์„ฑํ•œ ๊ฒŒ ์•„๋‹ˆ๋ผ ๊ฐ๊ฐ ์„ฑ๋ถ„์— ์ด๋ฏธ ํˆฌ์˜๋œ ์ƒ˜ํ”Œ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์ปค๋„์€ ๋‘ ๋ฒกํ„ฐ ์‚ฌ์ด์˜ ์ ๊ณฑ์„ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ์ฆ‰ ์œ ์‚ฌ๋„๋ฅผ ์ธก์ •ํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜์ธ ๊ฒƒ์ด์ฃ .

๊ฐ€์žฅ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ์ปค๋„์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

1. ๋‹คํ•ญ ํ„ฐ๋„ - ์„ธํƒ€๋Š” ์ž„๊ณ„๊ฐ’์ด๊ณ  P๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ง€์ •ํ•œ ๊ฑฐ๋“ญ์ œ๊ณฑ

 

 

2. ํ•˜์ดํผ๋ณผ๋ฆญ ํƒ„์  ํŠธ ์ปค๋„

 

 

3. ๋ฐฉ์‚ฌ ๊ธฐ์ € ํ•จ์ˆ˜ ํ˜น์€ ๊ฐ€์šฐ์‹œ์•ˆ ์ปค๋„

 

 

์ง€๊ธˆ๊นŒ์ง€ ๋ฐฐ์šด ๊ฒƒ์„ ์š”์•ฝํ•˜๋ฉด ์ปค๋„ PCA๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ ์„ธ ๋‹จ๊ณ„๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ์ปค๋„ ํ–‰๋ ฌ K๋ฅผ ๊ณ„์‚ฐํ•˜๊ณ  ์ƒ˜ํ”Œ์˜ ๋ชจ๋“  ์Œ์— ๋Œ€ํ•ด ๊ตฌํ•ฉ๋‹ˆ๋‹ค.

 

 

 

  1. ์•„๋ž˜ ์‹์„ ์‚ฌ์šฉํ•ด ์ปค๋„ ํ–‰๋ ฌ K๋ฅผ ์ค‘์•™์— ๋งž์ถฐ์ค๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์‚ฌ In์€ ๋ชจ๋“  ๊ฐ’์ด 1/n์ธ n * n ์ฐจ์› ํ–‰๋ ฌ์ž…๋‹ˆ๋‹ค.

 

 

3. ๊ณ ์œณ๊ฐ’ ํฌ๊ธฐ๋Œ€๋กœ ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌํ•ด์„œ ์ค‘์•™์— ๋งž์ถ˜ ์ปค๋„ ํ–‰๋ ฌ ์ค‘ ์ตœ์ƒ์œ„ k๊ฐœ ๋ฒกํ„ฐ๋ฅผ ๊ณ ๋ฆ…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๊ณ ์œ ๋ฒกํ„ฐ๋Š” ์ฃผ์„ฑ๋ถ„ ์ถ•์€ ์•„๋‹™๋‹ˆ๋‹ค.์ด๋ฏธ ์ด ์ถ•์— ํˆฌ์˜๋œ ์ƒ˜ํ”Œ์ž…๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ์™œ ์ปค๋„ ํ–‰๋ ฌ์„ ์ค‘์•™์— ๋งž์ถ”์—ˆ๋Š”์ง€ ๊ถ๊ธˆํ•˜์‹œ์ฃ ? ์•ž์„œ ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ํ‘œ์ค€ํ™” ์ „์ฒ˜๋ฆฌ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃฌ๋‹ค๊ณ  ๊ฐ€์ •ํ–ˆ๊ณ , ๊ณต๋ถ„์‚ฐ ํ–‰๋ ฌ ๊ตฌ์„ฑ ํ›„ ๋น„์„ ํ˜• ํŠน์„ฑ ์กฐํ•ฉ์˜ ์ ๊ณฑ์„ ํŒŒ์ด๋ฅผ ์ด์šฉํ•œ ๋น„์„ ํ˜• ํŠน์„ฑ ์กฐํ•ฉ์œผ๋กœ ์ ๊ณฑ ๋Œ€์ฒดํ•  ๋•Œ ๋ชจ๋“  ํŠน์„ฑ ํ‰๊ท ์ด 0์ž„์„ ๊ธฐ์–ตํ•˜์‹œ์ฃ ?

ํ•˜์ง€๋งŒ ์ƒˆ๋กœ์€ ํŠน์„ฑ ๊ณต๊ฐ„์„ ๊ณ„์‚ฐํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ด ํŠน์„ฑ ๊ณต๊ฐ„์ด ์ค‘์•™์ธ์ง€ ํ™•์‹ ํ•  ์ˆ˜๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

2. ํŒŒ์ด์ฌ์œผ๋กœ ์ปค๋„ PCA ๊ตฌํ˜„ํ•˜๊ธฐ

์‚ฌ์ดํŒŒ์ด์™€ ๋„˜ํŒŒ์ด ํ—ฌํผ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด ์ปค๋„ PCA๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

from scipy.spatial.distance import pdist, squareform
from scipy import exp
from scipy.linalg import eigh
import numpy as np

def rbf_kernel_pca(X, gamma, n_components):
    # MxN ์ฐจ์›์˜ ๋ฐ์ดํ„ฐ์…‹์—์„œ ์ƒ˜ํ”Œ ๊ฐ„์˜ ์œ ํด๋ฆฌ๋””์•ˆ ๊ฑฐ๋ฆฌ์˜ ์ œ๊ณฑ์„ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.
    sq_dists = pdist(X, 'sqeuclidean')

    # ์ƒ˜ํ”Œ ๊ฐ„์˜ ๊ฑฐ๋ฆฌ๋ฅผ ์ •๋ฐฉ ๋Œ€์นญ ํ–‰๋ ฌ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
    mat_sq_dists = squareform(sq_dists)

    # ์ปค๋„ ํ–‰๋ ฌ์„ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.
    K = exp(-gamma * mat_sq_dists)

    # ์ปค๋„ ํ–‰๋ ฌ์„ ์ค‘์•™์— ๋งž์ถฅ๋‹ˆ๋‹ค.
    N = K.shape[0]
    one_n = np.ones((N, N)) / N
    K = K - one_n.dot(K) - K.dot(one_n) + one_n.dot(K).dot(one_n)

    # ์ค‘์•™์— ๋งž์ถฐ์ง„ ์ปค๋„ ํ–‰๋ ฌ์˜ ๊ณ ์œณ๊ฐ’๊ณผ ๊ณ ์œ ๋ฒกํ„ฐ๋ฅผ ๊ตฌํ•ฉ๋‹ˆ๋‹ค.
    # scipy.linalg.eigh ํ•จ์ˆ˜๋Š” ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
    eigvals, eigvecs = eigh(K)
    eigvals, eigvecs = eigvals[::-1], eigvecs[:, ::-1]

    # ์ตœ์ƒ์œ„ k ๊ฐœ์˜ ๊ณ ์œ ๋ฒกํ„ฐ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค(๊ฒฐ๊ณผ๊ฐ’์€ ํˆฌ์˜๋œ ์ƒ˜ํ”Œ์ž…๋‹ˆ๋‹ค).
    X_pc = np.column_stack([eigvecs[:, i]
                            for i in range(n_components)])

    return X_pc

์ฐจ์› ์ถ•์†Œ์— RBF ์ปค๋„ PCA๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋‹จ์ ์€ ์‚ฌ์ „์— ๋žŒ๋‹ค ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ง€์ •ํ•ด์•ผ ํ•˜๋Š”๋ฐ, ์ ์ ˆํ•œ ๊ฐ’์„ ์ฐพ๊ธฐ ์œ„ํ•ด ์‹คํ—˜์ด ํ•„์š”ํ•˜๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. ์ด ๋‹ค์Œ ์„ธ์…˜๋“ค์—์„œ ์†Œ๊ฐœํ•  ๊ทธ๋ฆฌ๋“œ ์„œ์น˜์™€ ๊ฐ™์€ ํŠœ๋‹ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ตœ์„ ์ž…๋‹ˆ๋‹ค.

์ด์ œ ์˜ˆ์ œ ๋‘ ๊ฐ€์ง€๋ฅผ ์‚ฌ์šฉํ•ด ์‹คํ—˜ํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ, ๋ฐ˜๋‹ฌ๋ชจ์–‘ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์ž…๋‹ˆ๋‹ค. ๋จผ์ € ๋ฐ์ดํ„ฐ ์…‹์„ ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค.

import matplotlib.pyplot as plt
from sklearn.datasets import make_moons

X, y = make_moons(n_samples=100, random_state=123)

plt.scatter(X[y == 0, 0], X[y == 0, 1], color='red', marker='^', alpha=0.5)
plt.scatter(X[y == 1, 0], X[y == 1, 1], color='blue', marker='o', alpha=0.5)

plt.tight_layout()
plt.show()

 

 

ํ™•์‹คํžˆ ๋น„์„ ํ˜• ๋ฐ์ดํ„ฐ์ด์ฃ ? ์ด์ œ ์ปค๋„ PCA๋กœ ํŽผ์ณ์„œ ์„ ํ˜• ๋ถ„๋ฅ˜๊ธฐ์— ์ ํ•ฉํ•˜๊ฒŒ ๋งŒ๋“ค์–ด ์ค๋‹ˆ๋‹ค. ๋จผ์ €, ๊ธฐ๋ณธ PCA์— ํˆฌ์˜ํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ณด์ด๋Š”์ง€๋ถ€ํ„ฐ ํ™•์ธํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

from sklearn.decomposition import PCA

scikit_pca = PCA(n_components=2)
X_spca = scikit_pca.fit_transform(X)

fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(7, 3))

ax[0].scatter(X_spca[y == 0, 0], X_spca[y == 0, 1],
              color='red', marker='^', alpha=0.5)
ax[0].scatter(X_spca[y == 1, 0], X_spca[y == 1, 1],
              color='blue', marker='o', alpha=0.5)

ax[1].scatter(X_spca[y == 0, 0], np.zeros((50, 1)) + 0.02,
              color='red', marker='^', alpha=0.5)
ax[1].scatter(X_spca[y == 1, 0], np.zeros((50, 1)) - 0.02,
              color='blue', marker='o', alpha=0.5)

ax[0].set_xlabel('PC1')
ax[0].set_ylabel('PC2')
ax[1].set_ylim([-1, 1])
ax[1].set_yticks([])
ax[1].set_xlabel('PC1')

plt.tight_layout()
plt.show()

 

 

ํ™•์‹คํžˆ ์˜ค๋ฅธ์ชฝ ๊ทธ๋ฆผ์€ ์ž˜ ํŽด์ง€๊ธฐ๋Š” ํ–ˆ์ง€๋งŒ ์„ ํ˜•์ ์œผ๋กœ ๊ตฌ๋ถ„ํ•˜๊ธฐ๋Š” ํž˜๋“ค์–ด ๋ณด์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ฒน์นœ ๋ถ€๋ถ„์„ ์ž˜ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด์„œ ์ปค๋„ PCA ํ•จ์ˆ˜ rbf_kernel_pca๋ฅผ ์ ์šฉํ•ด๋ด…์‹œ๋‹ค.

X_kpca = rbf_kernel_pca(X, gamma=15, n_components=2)

fig, ax = plt.subplots(nrows=1,ncols=2, figsize=(7,3))
ax[0].scatter(X_kpca[y==0, 0], X_kpca[y==0, 1], 
            color='red', marker='^', alpha=0.5)
ax[0].scatter(X_kpca[y==1, 0], X_kpca[y==1, 1],
            color='blue', marker='o', alpha=0.5)

ax[1].scatter(X_kpca[y==0, 0], np.zeros((50,1))+0.02, 
            color='red', marker='^', alpha=0.5)
ax[1].scatter(X_kpca[y==1, 0], np.zeros((50,1))-0.02,
            color='blue', marker='o', alpha=0.5)

ax[0].set_xlabel('PC1')
ax[0].set_ylabel('PC2')
ax[1].set_ylim([-1, 1])
ax[1].set_yticks([])
ax[1].set_xlabel('PC1')

plt.tight_layout()
plt.show()

 

 

์ด๋ ‡๊ฒŒ ์˜ˆ์œ ๋ฐ์ดํ„ฐ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‘ ๋ฒˆ์งธ ์˜ˆ์ œ๋Š” ์›์„ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ผ๋‹จ ๋ฐ์ดํ„ฐ๋ฅผ ํ™•์ธํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

from sklearn.datasets import make_circles

X, y = make_circles(n_samples=1000, random_state=123, noise=0.1, factor=0.2)

plt.scatter(X[y == 0, 0], X[y == 0, 1], color='red', marker='^', alpha=0.5)
plt.scatter(X[y == 1, 0], X[y == 1, 1], color='blue', marker='o', alpha=0.5)

plt.tight_layout()
plt.show()

 

 

์—ฌ๊ธฐ์„œ๋„ ๋จผ์ € ๊ธฐ๋ณธ PCA๋ฅผ ์ ์šฉํ•ด๋ด…์‹œ๋‹ค.

scikit_pca = PCA(n_components=2)
X_spca = scikit_pca.fit_transform(X)

fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(7, 3))

ax[0].scatter(X_spca[y == 0, 0], X_spca[y == 0, 1],
              color='red', marker='^', alpha=0.5)
ax[0].scatter(X_spca[y == 1, 0], X_spca[y == 1, 1],
              color='blue', marker='o', alpha=0.5)

ax[1].scatter(X_spca[y == 0, 0], np.zeros((500, 1)) + 0.02,
              color='red', marker='^', alpha=0.5)
ax[1].scatter(X_spca[y == 1, 0], np.zeros((500, 1)) - 0.02,
              color='blue', marker='o', alpha=0.5)

ax[0].set_xlabel('PC1')
ax[0].set_ylabel('PC2')
ax[1].set_ylim([-1, 1])
ax[1].set_yticks([])
ax[1].set_xlabel('PC1')

plt.tight_layout()
plt.show()

 

 

์—ฌ๊ธฐ์„œ๋„ ๊ธฐ๋ณธ PCA๋Š” ์„ ํ˜• ๋ถ„๋ฅ˜๊ธฐ์— ์ ํ•ฉํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋‚ผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด์ œ ์ ์ ˆํ•œ ๋žŒ๋‹ค ๊ฐ’์„ ์ฃผ๊ณ  RBF ์ปค๋„ PCA ๊ตฌํ˜„์„ ์‚ฌ์šฉํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

X_kpca = rbf_kernel_pca(X, gamma=15, n_components=2)

fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(7, 3))
ax[0].scatter(X_kpca[y == 0, 0], X_kpca[y == 0, 1],
              color='red', marker='^', alpha=0.5)
ax[0].scatter(X_kpca[y == 1, 0], X_kpca[y == 1, 1],
              color='blue', marker='o', alpha=0.5)

ax[1].scatter(X_kpca[y == 0, 0], np.zeros((500, 1)) + 0.02,
              color='red', marker='^', alpha=0.5)
ax[1].scatter(X_kpca[y == 1, 0], np.zeros((500, 1)) - 0.02,
              color='blue', marker='o', alpha=0.5)

ax[0].set_xlabel('PC1')
ax[0].set_ylabel('PC2')
ax[1].set_ylim([-1, 1])
ax[1].set_yticks([])
ax[1].set_xlabel('PC1')

plt.tight_layout()
plt.show()

 

 

3. ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ ํˆฌ์˜

์ด์ œ๊นŒ์ง€๋Š” ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ์…‹์„ ์ƒˆ๋กœ์šด ํŠน์„ฑ์— ํˆฌ์˜ํ–ˆ์ง€๋งŒ, ์‹ค์ „์—์„œ๋Š” ๋ณ€ํ™˜ํ•ด์•ผํ•  ๋ฐ์ดํ„ฐ์…‹์ด ํ•˜๋‚˜ ์ด์ƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ํ›ˆ๋ จ๊ณผ ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ์ฒ˜๋Ÿผ ๋ง์ด์ฃ .

PCA์—์„œ๋Š” ๋ณ€ํ™˜ํ–‰๋ ฌ W์™€ ์ž…๋ ฅ ์ƒ˜ํ”Œ์˜ ์ ๊ณฑ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ํˆฌ์˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์ปค๋„ PCA๋Š” ์–ด๋–จ๊นŒ์š”? ์ปค๋„ PCA๋Š” ์ค‘์‹ฌ์„ ๋งž์ถ˜ ์ปค๋„ ํ–‰๋ ฌ์˜ ๊ณ ์œ ๋ฒกํ„ฐ๋ฅผ ๊ตฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ƒ˜ํ”Œ์€ ์ด๋ฏธ ์ฃผ์„ฑ๋ถ„ ์ถ•์ธ v์— ๋“ค์–ด์žˆ์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ์ƒ˜ํ”Œ x'๋ฅผ ํˆฌ์˜ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์•„๋ž˜๋ฅผ ๊ณ„์‚ฐํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

 

 

๋‹คํ–‰ํžˆ ์šฐ๋ฆฌ๋Š” ์ปค๋„ ํŠธ๋ฆญ์„ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ์ด๊ฒƒ์„ ๊ณ„์‚ฐํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜ PCA์™€ ์ปค๋„ PCA์˜ ๋‹ค๋ฅธ ์ ์€ ๋ฉ”๋ชจ๋ฆฌ ๊ธฐ๋ฐ˜์ด๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฆ‰ ์ƒˆ๋กœ์šด ์ƒ˜ํ”Œ์„ ํˆฌ์˜ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋งค๋ฒˆ ์›๋ณธ ํ›ˆ๋ จ ์„ธํŠธ๋ฅผ ์žฌ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

ํ›ˆ๋ จ ์„ธํŠธ์˜ i๋ฒˆ์งธ ์ƒ˜ํ”Œ๊ณผ ์ƒˆ๋กœ์šด ์ƒ˜ํ”Œ x'์‚ฌ์ด์˜ RBF ์œ ์‚ฌ๋„๋ฅผ ๊ณ„์‚ฐํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

 

 

์ปค๋„ ํ–‰๋ ฌ K์˜ ๊ณ ์œ ๋ฒกํ„ฐ a์™€ ๊ณ ์œณ๊ฐ’ ๋žŒ๋‹ค๋Š” ์•„๋ž˜ ๊ด€๊ณ„๋ฅผ ๋งŒ์กฑํ•ฉ๋‹ˆ๋‹ค.

 

 

from scipy import exp
from scipy.linalg import eigh
import numpy as np

def rbf_kernel_pca(X, gamma, n_components):
    # MxN ์ฐจ์›์˜ ๋ฐ์ดํ„ฐ์…‹์—์„œ ์ƒ˜ํ”Œ ๊ฐ„์˜ ์œ ํด๋ฆฌ๋””์•ˆ ๊ฑฐ๋ฆฌ์˜ ์ œ๊ณฑ์„ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.
    sq_dists = pdist(X, 'sqeuclidean')

    # ์ƒ˜ํ”Œ ๊ฐ„์˜ ๊ฑฐ๋ฆฌ๋ฅผ ์ •๋ฐฉ ๋Œ€์นญ ํ–‰๋ ฌ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
    mat_sq_dists = squareform(sq_dists)

    # ์ปค๋„ ํ–‰๋ ฌ์„ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.
    K = exp(-gamma * mat_sq_dists)

    # ์ปค๋„ ํ–‰๋ ฌ์„ ์ค‘์•™์— ๋งž์ถฅ๋‹ˆ๋‹ค.
    N = K.shape[0]
    one_n = np.ones((N, N)) / N
    K = K - one_n.dot(K) - K.dot(one_n) + one_n.dot(K).dot(one_n)

    # ์ค‘์•™์— ๋งž์ถฐ์ง„ ์ปค๋„ ํ–‰๋ ฌ์˜ ๊ณ ์œณ๊ฐ’๊ณผ ๊ณ ์œ  ๋ฒกํ„ฐ๋ฅผ ๊ตฌํ•ฉ๋‹ˆ๋‹ค.
    # scipy.linalg.eigh ํ•จ์ˆ˜๋Š” ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
    eigvals, eigvecs = eigh(K)
    eigvals, eigvecs = eigvals[::-1], eigvecs[:, ::-1]

    # ์ตœ์ƒ์œ„ k ๊ฐœ์˜ ๊ณ ์œ  ๋ฒกํ„ฐ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค(ํˆฌ์˜ ๊ฒฐ๊ณผ).
    alphas = np.column_stack([eigvecs[:, i]
                              for i in range(n_components)])

    # ๊ณ ์œ  ๋ฒกํ„ฐ์— ์ƒ์‘ํ•˜๋Š” ๊ณ ์œณ๊ฐ’์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
    lambdas = [eigvals[i] for i in range(n_components)]

    return alphas, lambdas

์ƒˆ๋กœ์šด ๋ฐ˜๋‹ฌ ๋ฐ์ดํ„ฐ์…‹์„ ๋งŒ๋“ค๊ณ  ์ˆ˜์ •๋œ ์ปค๋„ PCA ๊ตฌํ˜„์œผ๋กœ 1์ฐจ์› ๋ถ€๋ถ„๊ณต๊ฐ„์— ํˆฌ์˜ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

X, y = make_moons(n_samples=100, random_state=123)
alphas, lambdas = rbf_kernel_pca(X, gamma=15, n_components=1)

์ƒˆ๋กœ์šด ์ƒ˜ํ”Œ์„ ํˆฌ์˜ํ•˜๊ธฐ ์ „์— 26๋ฒˆ์งธ ํฌ์ธํŠธ๊ฐ€ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ x'๋ผ๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

x_new = X[25]
x_new
#array([1.8713, 0.0093])

x_proj = alphas[25] # ์›๋ณธ ํˆฌ์˜
x_proj
#array([0.0788])


def project_x(x_new, X, gamma, alphas, lambdas):
    pair_dist = np.array([np.sum((x_new - row)**2) for row in X])
    k = np.exp(-gamma * pair_dist)
    return k.dot(alphas / lambdas)

# ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐํฌ์ธํŠธ๋ฅผ ํˆฌ์˜ํ•ฉ๋‹ˆ๋‹ค.
x_reproj = project_x(x_new, X, gamma=15, alphas=alphas, lambdas=lambdas)
x_reproj
#array([0.0788])

๋งˆ์ง€๋ง‰์œผ๋กœ ํˆฌ์˜ํ•œ ๊ฒƒ์„ ๊ทธ๋ž˜ํ”„๋กœ ๊ทธ๋ ค๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

plt.scatter(alphas[y == 0, 0], np.zeros((50)),
            color='red', marker='^', alpha=0.5)
plt.scatter(alphas[y == 1, 0], np.zeros((50)),
            color='blue', marker='o', alpha=0.5)
plt.scatter(x_proj, 0, color='black',
            label='original projection of point X[25]', marker='^', s=100)
plt.scatter(x_reproj, 0, color='green',
            label='remapped point X[25]', marker='x', s=500)
plt.legend(scatterpoints=1)

plt.tight_layout()
plt.show()

 

 

์ด๋ ‡๊ฒŒ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ x'๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ํˆฌ์˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

4. ์‚ฌ์ดํ‚ท๋Ÿฐ์˜ ์ปค๋„ PCA

์‚ฌ์ดํ‚ท๋Ÿฐ์€ sklearn.decomposition ๋ชจ๋“ˆ ์•„๋ž˜์— ์ปค๋„ PCA๋ฅผ ๊ตฌํ˜„ํ•ด๋‘์—ˆ์Šต๋‹ˆ๋‹ค. kernel ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ปค๋„ ์ข…๋ฅ˜๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๊ฐ€ ๊ตฌํ˜„ํ•œ ์ปค๋„ PCA์™€ ๋น„๊ต๋ฅผ ์œ„ํ•ด ๋ณ€ํ™˜๋œ ๋ฐ˜๋‹ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋‘ ๊ฐœ ์ฃผ์„ฑ๋ถ„์— ๊ทธ๋ ค๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

from sklearn.decomposition import KernelPCA

X, y = make_moons(n_samples=100, random_state=123)
scikit_kpca = KernelPCA(n_components=2, kernel='rbf', gamma=15)
X_skernpca = scikit_kpca.fit_transform(X)

plt.scatter(X_skernpca[y == 0, 0], X_skernpca[y == 0, 1],
            color='red', marker='^', alpha=0.5)
plt.scatter(X_skernpca[y == 1, 0], X_skernpca[y == 1, 1],
            color='blue', marker='o', alpha=0.5)

plt.xlabel('PC1')
plt.ylabel('PC2')
plt.tight_layout()
plt.show()

 

 

์œ„ ๊ทธ๋ž˜ํ”„๋ฅผ ํ†ตํ•ด ์‚ฌ์ดํ‚ท๋Ÿฐ์˜ kernelPCA ๊ฒฐ๊ณผ๋Š” ์ง์ ‘ ๊ตฌํ˜„ํ•œ ๊ฒƒ๊ณผ ๊ฐ™์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 


 ์—ฌ๊ธฐ๊นŒ์ง€ ์ปค๋„ PCA๋ฅผ ์•Œ์•„๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค ์ €๋Š” ์•„์ง๋„ ๊ณ„์‚ฐ ๋น„์šฉ์„ ์ค„์ด๋Š” ์ปค๋„ ํŠธ๋ฆญ์— ๋Œ€ํ•ด์„œ ์ œ๋Œ€๋กœ ์ดํ•ด๊ฐ€ ๋˜์ง€ ์•Š์•˜๋Š”๋ฐ์š”ใ…œใ…œ ์ด ๋ถ€๋ถ„์— ๋Œ€ํ•ด์„œ๋Š” ์ดํ›„์— ๊ณต๋ถ€ํ•ด์„œ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ์ถ”๊ฐ€๋กœ ์—…๋กœ๋“œ(์ˆ˜์ •) ํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.(2020.02.20) ๋‹ค์Œ ์„ธ์…˜์—์„œ๋Š” ๋ชจ๋ธ์„ ํ‰๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ๋‹ค๋ฃจ๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ์„ธ์…˜์—์„œ ๋ดฌ์š”!

 

 

728x90

'๐Ÿฌ ML & Data > ๐ŸŽซ ๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹] Session 17. ํ•™์Šต๊ณผ ๊ฒ€์ฆ ๊ณก์„ , ๊ทธ๋ฆฌ๊ณ  ๊ทธ๋ฆฌ๋“œ ์„œ์น˜  (0) 2020.02.28
[๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹] Session 16. ํŒŒ์ดํ”„๋ผ์ธ์œผ๋กœ ๋ฌถ๊ณ , ๊ต์ฐจ ๊ฒ€์ฆ์œผ๋กœ ๋ชจ๋ธ์„ ํ‰๊ฐ€ํ•˜์ž!  (0) 2020.02.26
[๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹] Session 14. LDA๋ฅผ ํ†ตํ•œ ์ง€๋„ํ•™์Šต๋ฐฉ์‹ ๋ฐ์ดํ„ฐ ์••์ถ•  (0) 2020.02.21
[๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹] Session 13. ๋น„์ง€๋„ ์ฐจ์›์ถ•์†Œ! PCA!  (0) 2020.02.18
[๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹] Session 12. ์ˆœ์ฐจ ํŠน์„ฑ ์„ ํƒ ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ๋žœ๋ค ํฌ๋ ˆ์ŠคํŠธ ํŠน์„ฑ ์ค‘์š”๋„ ์‚ฌ์šฉ  (0) 2020.02.16
'๐Ÿฌ ML & Data/๐ŸŽซ ๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹] Session 17. ํ•™์Šต๊ณผ ๊ฒ€์ฆ ๊ณก์„ , ๊ทธ๋ฆฌ๊ณ  ๊ทธ๋ฆฌ๋“œ ์„œ์น˜
  • [๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹] Session 16. ํŒŒ์ดํ”„๋ผ์ธ์œผ๋กœ ๋ฌถ๊ณ , ๊ต์ฐจ ๊ฒ€์ฆ์œผ๋กœ ๋ชจ๋ธ์„ ํ‰๊ฐ€ํ•˜์ž!
  • [๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹] Session 14. LDA๋ฅผ ํ†ตํ•œ ์ง€๋„ํ•™์Šต๋ฐฉ์‹ ๋ฐ์ดํ„ฐ ์••์ถ•
  • [๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹] Session 13. ๋น„์ง€๋„ ์ฐจ์›์ถ•์†Œ! PCA!
darly213
darly213
ํ˜ธ๋ฝํ˜ธ๋ฝํ•˜์ง€ ์•Š์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜์–ด๋ณด์ž
  • darly213
    ERROR DENY
    darly213
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (97)
      • ๐Ÿฌ ML & Data (50)
        • ๐ŸŒŠ Computer Vision (2)
        • ๐Ÿ“ฎ Reinforcement Learning (12)
        • ๐Ÿ“˜ ๋…ผ๋ฌธ & ๋ชจ๋ธ ๋ฆฌ๋ทฐ (8)
        • ๐Ÿฆ„ ๋ผ์ดํŠธ ๋”ฅ๋Ÿฌ๋‹ (3)
        • โ” Q & etc. (5)
        • ๐ŸŽซ ๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹ (20)
      • ๐Ÿฅ Web (21)
        • โšก Back-end | FastAPI (2)
        • โ›… Back-end | Spring (5)
        • โ” Back-end | etc. (9)
        • ๐ŸŽจ Front-end (4)
      • ๐ŸŽผ Project (8)
        • ๐ŸงŠ Monitoring System (8)
      • ๐Ÿˆ Algorithm (0)
      • ๐Ÿ”ฎ CS (2)
      • ๐Ÿณ Docker & Kubernetes (3)
      • ๐ŸŒˆ DEEEEEBUG (2)
      • ๐ŸŒ  etc. (8)
      • ๐Ÿ˜ผ ์‚ฌ๋‹ด (1)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ๋ฐฉ๋ช…๋ก
    • GitHub
    • Notion
    • LinkedIn
  • ๋งํฌ

    • Github
    • Notion
  • ๊ณต์ง€์‚ฌํ•ญ

    • Contact ME!
  • 250x250
  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.3
darly213
[๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹] Session 15. ์ปค๋„ PCA๋ฅผ ์ด์šฉํ•œ ๋น„์„ ํ˜• ๋งคํ•‘
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”