๊ธฐ๋ณธ์ ์ธ PCA ๊ณต๋ถ๋ฅผ ๋ค์ ํด๋ดฃ๋ค... ์์ ์ ๋ฆฌํ๊ณ ์๋ ์ด์ํ์ง ๋ฆฌ๋ทฐ ๋ ผ๋ฌธ์์ ์ด์ํ์ง ๋ฐฉ๋ฒ๋ก ์ค์ ํ๋๋ก PCA๋ฅผ ํตํ ์ฐจ์์ถ์ ํ, ์ด ์ฐจ์ ์ถ์ PC ๊ฐ์ ์ด์ํ์ง์ ์ฌ์ฉํ๋ ๊ฑธ ์๊ธฐํ๊ณ ์์๋ค. ์ค๋๋ง์ ๊ธฐ์ต๋ ๋์ด๋ฆด ๊ฒธ ์ ๋ฆฌํด๋ณด๊ณ ์๋ค.
์ ์ ํ๋ rastgo's blog ์ ์ ์ ๋ฆฌ๋์ด ์์ด์, ๋ฐ๋ก ์ ๋ฆฌํ์ง ์๊ณ ์ต ์ค๋๋ง์ ์ฝ์ด ๋ณด์๋ค.
์ค์ํ ์ ์ ์ ๋ฆฌํ์๋ฉด,
โ
์ ํ๋ณํํ ๋ฐ์ดํฐ์ ๋ถ์ฐ์ด ํด ์ ์๊ฒ(์ฆ ๋ฐ์ดํฐ๊ฐ PC ์ถ์ ์ต๋ํ ํผ์ง๋๋ก) PC ์ถ์ ์ก์์ผ ํ๋ค.
โ
PCA ์ํ ๋ฐฉ๋ฒ :
โ
PCA์ ๋ชฉ์ ์ ์๋ฐ์ดํฐ ํ๋ ฌ X์ ๋ถ์ฐ์ ์ต๋ํ ๋ณด์กดํ๋ ๋ฐ ์๊ธฐ ๋๋ฌธ์ Z์ ๋ถ์ฐ ๋ํ ์ต๋ํ๋์ด์ผ ํฉ๋๋ค.
โ
๊ณต๋ถ์ฐํ๋ ฌ ฮฃ์ ์๋ก ๋ค๋ฅธ ๊ณ ์ ๋ฒกํฐ๋ผ๋ฆฌ๋ ์๋ก ์ง๊ต(orthogonal)ํจ์ ํ์ธํ ์ ์์ต๋๋ค.
โ
์๋ฐ์ดํฐ๋ฅผ ๊ณต๋ถ์ฐ ํ๋ ฌ์ ๊ณ ์ ๋ฒกํฐ๋ก ์ฌ์ํ๊ธฐ ์ ์๋ ๋ณ์ ๊ฐ ์ฐ๊ด์ฑ์ด ์์๋๋ผ๋ PCA ๋ณํ์ ์ํ์ฌ ์ขํ์ถ์ด ๋ฐ๋ ๋ฐ์ดํฐ๋ค์ ์๋ก ๋ฌด์๊ด(uncorrelated)์ด๊ฒ ๋ฉ๋๋ค.
1) Linear PCA: ์
๋ ฅ ๊ณต๊ฐ์์ ํ์ค ๋ด์ ์ ์ฌ์ฉํ์ฌ ์ฃผ์ฑ๋ถ์ ์ฐพ์ต๋๋ค.
2) Kernel PCA: ๋น์ ํ ์ปค๋ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์
๋ ฅ ๊ณต๊ฐ์ ๊ณ ์ฐจ์ ํผ์ฒ ๊ณต๊ฐ์ผ๋ก ๋งคํํ๊ณ , ๊ทธ ๊ณต๊ฐ์์ PCA๋ฅผ ์ํํฉ๋๋ค.
์ฐ์ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ์กด D์ฐจ์์์ ๋ ๊ณ ์ฐจ์์ธ M์ฐจ์์ผ๋ก ๋ณํํ ษธ(x)๋ฅผ ์์ ํฉ๋๋ค. ษธ(x)์ PCA๋ฅผ ์ ์ฉํ๋ฉด ์๋์ ๊ฐ์ด ์์ด ์ ๊ฐ๋ฉ๋๋ค.
๋ง์ง๋ง ์์ ษธ(x)์ ๋ํด ํ๋ฉด ์ฐ์ฐ์ด ๊ต์ฅํ ๋ณต์กํด์ง์ง๋ง, ์ปค๋ํธ๋ฆญ์ ์ด๋ฅผ โ์ปค๋ ํจ์โ๋ผ๊ณ ๋ถ๋ฆฌ๋ k(x, x) ๋ก ๋์ฒดํด ๋งค์ฐ ๊ฐ๋จํ ์ฐ์ฐ์ผ๋ก ์นํ์ํต๋๋ค. ์ค๊ฐ ์ ๋๊ณผ์ ์ ์๋ตํ๊ณ ์ฐ๋ฆฌ๊ฐ ์ฐพ๊ณ ์ ํ๋ ์ฃผ์ฑ๋ถ v๋ฅผ ๊ตฌํ๋ ์์ผ๋ก ์ ๋ฆฌํ๋ฉด ์๋์ ๊ฐ์ต๋๋ค.
์ฆ, ์ปค๋ํจ์๋ฅผ ํตํด ษธ(x)๋ฅผ ๋ช ์์ ์ผ๋ก ๊ตฌํ์ง ์๊ณ ์๋ ๋ฐ์ดํฐ๋ฅผ ๊ณ ์ฐจ์์ผ๋ก ์ฎ๊ธด ํ PCA๋ฅผ ์ ์ฉํ ๊ฐ์ ๊ตฌํ ์ ์๋ค๋ ๊ฒ ์ปค๋PCA์ ํต์ฌ์ ๋๋ค.
์ปค๋ํจ์๋ก๋ ๋ํ์ ์ผ๋ก 2๊ฐ์ง๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๋คํญ์ปค๋ํจ์(Polynomial kernel function)๊ณผ ๊ฐ์ฐ์์ ๋๋ RBF์ปค๋ํจ์์ ๋๋ค.
โ ์ค์ ๋ก ํผ์ฒ ๊ณต๊ฐ ๐น๋ก ๋ช ์์ ์ผ๋ก ๋งคํํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํ๋ฉฐ, Kernel PCA๋ ๊ณ ์ฐจ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ปค๋ ํจ์ ๐๋ฅผ ์ฌ์ฉ => Kernel PCA๋ ๋งค์ฐ ๋์ ์ฐจ์์ ๊ณต๊ฐ์์ ๋ด์ ์ ๊ณ์ฐํ๋ ๋์ , ์ปค๋ ํจ์ ํ๊ฐ๋ฅผ ํตํด ํจ์จ์ ์ผ๋ก ์ฃผ์ฑ๋ถ ๋ถ์์ ์ํํฉ๋๋ค.
# Kernel PCA with Polynomial kernel
def poly_kpca(X, degree, n_components, coef0=1):
K = (np.dot(X, X.T) + coef0) ** degree
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)
eigvals, eigvecs = eigh(K)
pc = np.column_stack((eigvecs[:, -i] for i in range(1, n_components + 1)))
return pc
pc = poly_kpca(X, 5, 2) #degree=5๋ก ์ค์
x1 = pc[:,0]
x2 = pc[:,1]
plt.figure(figsize=(6,6))
plt.scatter(x1[y==100], x2[y==100], c='b', alpha=0.5, label='Class1')
plt.scatter(x1[y==30], x2[y==30], c='r', alpha=0.5, label='Class2')
plt.legend()
plt.show()