
์ฐจ์ ์ถ์
๋งค์ฐ ๋ง์ ํผ์ฒ๋ก ๊ตฌ์ฑ๋ ๋ค์ฐจ์ ๋ฐ์ดํฐ ์ธํธ์ ์ฐจ์์ ์ถ์ํด ์๋ก์ด ์ฐจ์์ ๋ฐ์ดํฐ ์ธํธ๋ฅผ ์์ฑํ๋ ๊ฒ
(๊ธฐ์กด์ ๋ฌธ์ ์ )
์ฐจ์์ด ํด์๋ก ๋ฐ์ดํฐ ํฌ์ธํธ ๊ฐ ๊ฑฐ๋ฆฌ๊ฐ ๊ธฐํ๊ธ์์ ์ผ๋ก ๋ฉ์ด์ ธ ํฌ์ํ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ฒ ๋จ -> ์์ธก ์ ๋ขฐ๋๊ฐ ๋จ์ด์ง
๊ฐ๋ณ ํผ์ฒ ๊ฐ์ ์๊ด๊ด๊ณ๊ฐ ๋์ ๊ฐ๋ฅ์ฑ์ด ํผ (์ ํํ๊ท ๋ชจ๋ธ์์ ๋ค์ค๊ณต์ฐ์ฑ ๋ฌธ์ ๋ฐ์)
- ํผ์ฒ ์๋ฅผ ์ค์ด๋ฉด ๋ ์ง๊ด์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ํด์ํ ์ ์์
- ์๊ฐ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์์ถํด์ ํํ ๊ฐ๋ฅ
- ํ์ต์ ํ์ํ ์ฒ๋ฆฌ ๋ฅ๋ ฅ๋ ์ค์ผ ์ ์์
์ฐจ์ ์ถ์๋ฅผ ํตํด ์ข ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ค๋ช ํ ์์๋ ์ ์ฌ์ ์ธ ์์๋ฅผ ์ถ์ถ
์ฌ๋ฌ ๋ณ์ ๊ฐ์ ์กด์ฌํ๋ ์๊ด ๊ด๊ณ๋ฅผ ์ด์ฉํด ์ด๋ฅผ ๋ํํ๋ ์ฃผ์ฑ๋ถ์ ์ถ์ถํด ์ฐจ์์ ์ถ์
์ฃผ์ฑ๋ถ (๊ฐ์ฅ ๋์ ๋ถ์ฐ์ ๊ฐ์ง๋ ๋ฐ์ดํฐ ์ถ์ ์ฐพ์ ์ด ์ถ์ผ๋ก ์ฐจ์์ ์ถ์)

๋ฐ์ดํฐ ๋ณ๋์ฑ์ด ๊ฐ์ฅ ํฐ ๋ฐฉํฅ์ผ๋ก ์ถ์ ์์ฑํ๊ณ , ์๋กญ๊ฒ ์์ฑ๋ ์ถ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ํฌ์

๋ฒกํฐ ์ถ์ ๊ฐ์๋งํผ์ ์ฐจ์์ผ๋ก ์๋ณธ ๋ฐ์ดํฐ ์ฐจ์ ์ถ์๋จ
๊ณ ์ ๋ฒกํฐ๊ฐ PCA์ ์ฃผ์ฑ๋ถ ๋ฒกํฐ๋ก์ ์ ๋ ฅ ๋ฐ์ดํฐ์ ๋ถ์ฐ์ด ํฐ ๋ฐฉํฅ์ ๋ํ๋
๊ณ ์ณ๊ฐ์ ์ ๋ ฅ ๋ฐ์ดํฐ์ ๋ถ์ฐ์ ๋ํ๋
1. ์ ํ ๋ณํ
ํน์ ๋ฒกํฐ๋ฅผ ํ๋์ ๊ณต๊ฐ์์ ๋ค๋ฅธ ๊ณต๊ฐ์ผ๋ก ํฌ์
๊ณต๋ถ์ฐ์ ๋ ๋ณ์ ๊ฐ์ ๋ณ๋(๋ถ์ฐ)์ ์๋ฏธ
2. ๊ณ ์ ๋ฒกํฐ
ํ๋ ฌ A๋ฃฐ ๊ณฑํ๋๋ผ๋ ๋ฐฉํฅ์ด ๋ณํ์ง ์๊ณ ๊ทธ ํฌ๊ธฐ๋ง ๋ณํ๋ ๋ฒกํฐ๋ฅผ ์ง์นญ
Ax = ax (a๋ ๊ณ ์ณ๊ฐ, x๋ ๊ณ ์ ๋ฒกํฐ)
3. ๊ณต๋ถ์ฐ ํ๋ ฌ
์ ๋ฐฉํ๋ ฌ์ด์ ๋์นญํ๋ ฌ

e1์ ๊ฐ์ฅ ๋ถ์ฐ์ด ํฐ ๋ฐฉํฅ์ ๊ฐ์ง ๊ณ ์ ๋ฒกํฐ์ด๋ฉฐ, e2๋ e1์ ์์ง์ด๋ฉด์ ๋ค์์ผ๋ก ๊ฐ์ฅ ๋ถ์ฐ์ด ํฐ ๋ฐฉํฅ์ ๊ฐ์ง ๊ณ ์ ๋ฒกํฐ
PCA ์ ์์ ์ด์ฉํด ๋ถํด๋ ๊ณ ์ ๋ฒกํฐ๋ฅผ ๊ตฌํ๊ณ ์ฐพ์ ๊ณ ์ ๋ฒกํฐ๋ฅผ ์ด์ฉํด ์ ๋ ฅ ๋ฐ์ดํฐ๋ฅผ ์ ํ ๋ณํํ๋ ๋ฐฉ์
1. ์ ๋ ฅ ๋ฐ์ดํฐ ์ธํธ์ ๊ณต๋ถ์ฐ ํ๋ ฌ์ ์์ฑ
2. ๊ณต๋ถ์ฐ ํ๋ ฌ์ ๊ณ ์ ๋ฒกํฐ์ ๊ณ ์ ๊ฐ์ ๊ณ์ฐ
3. ๊ณ ์ ๊ฐ์ด ๊ฐ์ฅ ํฐ ์์ผ๋ก K๊ฐ ๋งํผ ๊ณ ์ ๋ฒกํฐ๋ฅผ ์ถ์ถ
4. ๊ณ ์ ๊ฐ์ด ๊ฐ์ฅ ํฐ ์์ผ๋ก ์ถ์ถ๋ ๊ณ ์ ๋ฒกํฐ๋ฅผ ์ด์ฉํด ์๋กญ๊ฒ ์ ๋ ฅ๋ฐ์ดํฐ๋ฅผ ๋ณํ

์์ฌ์ ๋ถํฌํ๊ธฐ ๋๋ฌธ์ length/width๋ก ํ์ข
๋ถ๋ฅ ์ด๋ ค์
-> 4๊ฐ์ ์์ฑ(sepal_length, sepal_width, petal_length, petal_width)์ 2๊ฐ์ PCA ์์ฑ์ผ๋ก ์์ถ
1. ์ค์ผ์ผ๋ง
์ฌ๋ฌ ์์ฑ์ ๊ฐ์ ์ฐ์ฐํด์ผ ๋๋ฏ๋ก StandardScaler๋ฅผ ์ด์ฉํด ์ ๊ท๋ถํฌ๋ก ์ค์ผ์ผ๋ง
from sklearn.preprocessing import StandardScaler
# Target ๊ฐ์ ์ ์ธํ ๋ชจ๋ ์์ฑ ๊ฐ์ StandardScaler๋ฅผ ์ด์ฉํด ํ์ค ์ ๊ท ๋ถํฌ๋ฅผ ๊ฐ์ง๋ ๊ฐ๋ค๋ก ๋ณํ
iris_scaled= StandardScaler().fit_transform(irisDF.iloc[:, :-1])
2. PCA ํ๋ จ
from sklearn.decomposition import PCA
pca = PCA(n_components=2)
# fit()๊ณผ transform()์ ํธ์ถํด PCA ๋ณํ ๋ฐ์ดํฐ ๋ฐํ
pca.fit(iris_scaled)
iris_pca = pca.transform(iris_scaled)
print(iris_pca.shape)
PCA๊ฐ ๋ถ์ฐ์ ๊ณ ๋ ค ์๋ก์ด component(์์ถ๋ ํผ์ฒ)๋ฅผ ์์ฑ

PCA ์ปดํฌ๋ํธ๋ณ๋ก ์ฐจ์งํ๋ ๋ณ๋์ฑ ๋น์จ์ ์ ๊ณต
print(pca.explained_variance_ratio_)
[Output]
[0.72962445 0.22850762]
pca_component_1์ด ์ ์ฒด ๋ณ๋์ฑ์ ์ฝ 72.9% ์ฐจ์ง, pca_component_2๊ฐ ์ฝ 22.8% ์ฐจ์ง

read_excel ์๋ฌ ๋ฐ์ํด์ csv๋ก ๋ณํ
'default payment next month' ์์ฑ์ด Target ๊ฐ์ผ๋ก '์ฐ์ฒด'์ผ ๊ฒฝ์ฐ 1, '์ ์ ๋ฉ๋ถ'์ผ ๊ฒฝ์ฐ 0
>> ํ๊น๊ฐ์ ๋ถ๋ฅ ์์ธก(์ฐ์ฒด์ธ ๊ฒฝ์ฐ/ ์ ์๋ฉ๋ถ์ธ ๊ฒฝ์ฐ๋ก ๋ถ๋ฅ)
24๊ฐ์ ์์ฑ๋ผ๋ฆฌ ์๊ด๋๊ฐ ๋งค์ฐ ๋์

BILL_AMT1~BILL_AMT6 ์์ฑ ๋ผ๋ฆฌ ์๊ด๋๊ฐ ๋งค์ฐ ๋์
6๊ฐ์ ์์ฑ์ 2๊ฐ์ component๋ก PCA ๋ณํ
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
โ
#BILL_AMT1 ~ BILL_AMT6๊น์ง 6๊ฐ์ ์์ฑ๋ช
๊ฐ์ง
cols_bill = ['BILL_AMT'+str(i) for i in range(1, 7)]
print('๋์ ์์ฑ๋ช
:', cols_bill)
โ
#2๊ฐ์ PCA ์์ฑ์ ๊ฐ์ง PCA ๊ฐ์ฒด ์์ฑํ๊ณ , explained_variance_ratio_ ๊ณ์ฐ์ ์ํด fit() ํธ์ถ
scaler = StandardScaler()
df_cols_scaled = scaler.fit_transform(X_features[cols_bill])
pca = PCA(n_components = 2)
pca.fit(df_cols_scaled)
print('PCA Component ๋ณ ๋ณ๋์ฑ:', pca.explained_variance_ratio_)
[Output]
๋์ ์์ฑ๋ช
: ['BILL_AMT1', 'BILL_AMT2', 'BILL_AMT3', 'BILL_AMT4', 'BILL_AMT5', 'BILL_AMT6']
PCA Component ๋ณ ๋ณ๋์ฑ: [0.90555253 0.0509867 ]
2๊ฐ์ PCA ์ปดํฌ๋ํธ ๋ง์ผ๋ก 6๊ฐ ์์ฑ ๋ณ๋์ฑ์ ์ฝ 95% ์ด์ ์ค๋ช ํ ์ ์์.
์ต์ข ์์ธก ๊ฒฐ๊ณผ๋ ์๋ณธ๊ณผ ๋น๊ตํด 1~2% ์ ๋์ ์์ธก ์ฑ๋ฅ ์ ํ๋ง ๋ฐ์
PCA์ ๋ฐ์ด๋ ์์ถ ๋ฅ๋ ฅ์ ๋ณด์ฌ์ค
์ ํ ํ์ด ๋ถ์๋ฒ, PCA์ ์ ์ฌํ์ง๋ง ์ง๋ํ์ต์ ๋ถ๋ฅ์์ ์ฌ์ฉํ๊ธฐ ์ฝ๋๋ก ๊ฐ๋ณ ํด๋์ค๋ฅผ ๋ถ๋ณํ ์ ์๋ ๊ธฐ์ค์ ์ต๋ํ ์ ์งํ๋ฉด์ ์ฐจ์์ ์ถ์

ํด๋์ค ๊ฐ ๋ถ์ฐ๊ณผ ํด๋์ค ๋ด๋ถ ๋ถ์ฐ ๋น์จ์ ์ต๋ํํ๋ ๋ฐฉ์์ผ๋ก ์ฐจ์์ ์ถ์
ํด๋์ค ๊ฐ ๋ถ์ฐ์ ์ต๋ํ ํฌ๊ฒ ๊ฐ์ ธ๊ฐ๊ณ , ํด๋์ค ๋ด๋ถ์ ๋ถ์ฐ์ ์ต๋ํ ์๊ฒ ๊ฐ์ ธ๊ฐ๋ ๋ฐฉ์
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import load_iris
iris = load_iris()
iris_scaled = StandardScaler().fit_transform(iris.data)
lda = LinearDiscriminantAnalysis(n_components=2)
lda.fit(iris_scaled, iris.target)
iris_lda = lda.transform(iris_scaled)
print(iris_lda.shape)
iris.target ํด๋์ค์ ๊ฒฐ์ ๊ฐ์ด ๋ณํ ์์ ํ์
PCA์ ์ ์ฌํ ํ๋ ฌ ๊ธฐ๋ฒ์ ์ ์ฉํ์ง๋ง SVD๋ ์ ๋ฐฉํ๋ ฌ ๋ฟ๋ง ์๋๋ผ ํ๊ณผ ์ด์ ํฌ๊ธฐ๊ฐ ๋ค๋ฅธ ํ๋ ฌ์๋ ์ ์ฉ ๊ฐ๋ฅ

SVD(ํน์ด๊ฐ ๋ถํด), U์ V์ ์ํ ๋ฒกํฐ๋ ํน์ด ๋ฒกํฐ
Trincated SVD
ํน์ด๊ฐ ์ค ์์ ์ผ๋ถ ๋ฐ์ดํฐ๋ง ์ถ์ถํด ๋ถํดํ๋ ๋ฐฉ์
์ธ์์ ์ผ๋ก ๋ ์์ ์ฐจ์์ U, Sigma, V^T๋ก ๋ถํดํ๊ธฐ ๋๋ฌธ์ ์๋ณต ํ๋ ฌ์ ์ ํํ๊ฒ ๋ค์ ์๋ณตํ ์๋ ์์. ์๋ ์ฐจ์์ ์ฐจ์์ ๊ฐ๊น๊ฒ ์๋ผ๋ผ์๋ก ์๋ณตํ๋ ฌ์ ๋ ๊น๊น๊ฒ ๋ณต์
Normal SVD๋ก ๋ถํดํด ๋ถํด๋ ํ๋ ฌ์ ์ฐจ์๊ณผ Sigma ํ๋ ฌ ๋ด์ ํน์ด๊ฐ์ ํ์ธ ํ๋ค ๋ค์ Truncated SVD๋ก ๋ถํด๋ ํ๋ ฌ์ ๋ด์ ์ ๊ณ์ฐํ์ฌ ๋ค์ ๋ณต์๋ ๋ฐ์ดํฐ์ ์๋ณธ ๋ฐ์ดํฐ๋ ์ฐจ์ด ์กด์ฌ
๋ฐ์ดํฐ ์ธํธ๊ฐ ์ค์ผ์ผ๋ง์ผ๋ก ๋ฐ์ดํฐ ์ค์ฌ์ด ๋์ผํด์ง๋ฉด ์ฌ์ดํท๋ฐ SVD์ PCA๋ ๋์ผํ ๋ณํ์ ์ํ.
PCA๋ ๋ฐ์ง ํ๋ ฌ์ ๋ํ ๋ณํ๋ง ๊ฐ๋ฅ, SVD๋ ํฌ์ ํ๋ ฌ์ ๋ํ ๋ณํ๋ ๊ฐ๋ฅ.
(๋ชจ๋ ์์ ๊ฐ์ด ๋ชจ๋ ์์๋ผ๋ ๊ฒ ๋ณด์ฅ๋์ด์ผ ํจ)
๋ฎ์ ๋ญํฌ๋ฅผ ํตํ ํ๋ ฌ ๊ทผ์ฌ ๋ฐฉ์์ ๋ณํ
X = WH
W(์๋ณธ ํ๋ ฌ๊ณผ ํ ํฌ๊ธฐ๋ ๋์ผํ๊ณ ์ด ํฌ๊ธฐ๋ ์์ ํ๋ ฌ)์ H(์๋ณธ ํ๋ ฌ์ ํํฌ ํฌ๊ธฐ๋ณด๋ค ์๊ณ ์ด ํฌ๊ธฐ๋ ๊ฐ์ ํ๋ ฌ)๋ก ํ๋ ฌ ๋ถํด


์ NMF๋ฅผ ์ฐ๋ ๊ฒ์ด ์ ์ฉํ ์ ์์๊น?
non-negative ๋ฐ์ดํฐ๋ non-negative feature๋ก ์ค๋ช ํ๋ ๊ฒ์ด ์ข๋ค.
NMF๊ฐ ์ ์ฉํ ์ด์ ์ค ํ๋๋ ์ถ์ถํ๊ฒ ๋๋ feature๋ค์ด ๋ชจ๋ non-negative feature์ด๊ธฐ ๋๋ฌธ์ด๋ค.
...
๊ทธ๋ฐ๋ฐ, ๋ง์ ๊ฒฝ์ฐ์ ์ฌ์ฉ๋๋ matrix factorization ๋ฐฉ๋ฒ๋ค(๊ฐ๋ น, SVD)์ด๋ ์ฐจ์ ๊ฐ์ ๋ฐฉ๋ฒ(์์ธ ๋ถ์, ์ฃผ์ฑ๋ถ ๋ถ์, cluster ๋ถ์ ๋ฑ)์์๋ ํ๋ํ ์ ์๋ feature๋ค์ด ์์์ด๋ฉด ์๋๋ค๋์ง ํ๋ ์ ํ์ฌํญ๊ฐ์ ๊ฒ์ ์๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ์ ํน์ฑ์ธ non-negativity๋ฅผ ๋ณด์กดํ ์ ์๋ค๋ ๋ณด์ฅ์ ๋ฐ์ ์ ์๋ค๋ ํ๊ณ์ ์ด ์๋ค. -(Angelo's Math Notes)
from sklearn.decomposition import NMF
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt
%matplotlib inline
iris = load_iris()
iris_ftrs = iris.data
nmf = NMF(n_components=2)
nmf.fit(iris_ftrs)
iris_nmf = nmf.transform(iris_ftrs)
plt.scatter(x=iris_nmf[:,0], y= iris_nmf[:,1], c= iris.target)
plt.xlabel('NMF Component 1')
plt.ylabel('NMF Component 2')
plt.show()
