Search
๐Ÿ—ƒ๏ธ

Dimensionality Reduction

์ƒ์„ฑ์ผ
2025/03/25 18:05
ํƒœ๊ทธ
๋ฐ์ดํ„ฐ๋งˆ์ด๋‹
์ž‘์„ฑ์ž

Introduction

โ€ข
๋ณ€์ˆ˜์˜ ์ˆ˜๊ฐ€ ๋Š˜์–ด๋‚˜๋Š” ๊ฒฝ์šฐ
โ—ฆ
๋ฒ”์ฃผํ˜• ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ๊ฐ€๋ณ€์ˆ˜ ์ž‘์„ฑ
โ—ฆ
๋ณ€์ˆ˜ ๋ณ€ํ™˜ (ex. log ๋ณ€ํ™˜ ๋“ฑ.)
โ‡’ ๋ณ€์ˆ˜ ์‚ฌ์ด์— ๋†’์€ ์ƒ๊ด€๊ด€๊ณ„๋ฅผ ๊ฐ€์งˆ ๊ฐ€๋Šฅ์„ฑ์ด ์ปค์ง€๋ฉฐ, ์ด๋Š” ๊ณผ์ ํ•ฉ ํ˜„์ƒ์˜ ์›์ธ์ด ๋œ๋‹ค.

์ฐจ์›์˜ ์ €์ฃผ

โ€ข
๋ชจ๋ธ์˜ ์ฐจ์›
โ—ฆ
๋ชจ๋ธ์ด ์‚ฌ์šฉํ•œ ๋…๋ฆฝ ๋ณ€์ˆ˜์˜ ๊ฐœ์ˆ˜
โ€ข
์ฐจ์›์˜ ์ €์ฃผ
โ—ฆ
๋‹ค๋ณ€๋Ÿ‰ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ์— ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•จ์œผ๋กœ์จ ์•ผ๊ธฐ๋˜๋Š” ๋ฌธ์ œ
โ—ฆ
๋ณ€์ˆ˜๊ฐ€ ์ถ”๊ฐ€๋จ์— ๋”ฐ๋ผ ๋ฐ์ดํ„ฐ ๊ณต๊ฐ„์ด ์ค„์–ด๋“ค๊ณ , ์ด์— ๋”ฐ๋ผ ๋ถ„๋ฅ˜/์˜ˆ์ธก ๋ชจ๋ธ์„ ๊ตฌํ•˜๋Š” ๊ฒƒ์ด ์–ด๋ ค์›Œ์ง„๋‹ค.
โ–ช
์˜ˆ๋ฅผ ๋“ค์–ด ์–ด๋–ค 2์ฐจ์› ๊ณต๊ฐ„์—์„œ ํŠน์ • ๋‘ ์ ์€ ๋งค์šฐ ๊ฐ€๊น๊ณ  ๋‹ค๋ฅธ ์ ๊ณผ์˜ ๊ฑฐ๋ฆฌ๋Š” ์ƒ๋‹นํžˆ ๋ฉ€ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์„ 100์ฐจ์› ๊ณต๊ฐ„์œผ๋กœ ํ™•์žฅํ•œ๋‹ค๋ฉด ๋ชจ๋“  ์ ์ด ๋น„์Šทํ•˜๊ฒŒ ๋ฉ€์–ด์ง€๋Š” ํ˜•ํƒœ๋ฅผ ์ด๋ฃจ๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค. ์ด๋Š” ๋” ์ด์ƒ ๊ฑฐ๋ฆฌ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์œ ์‚ฌ์„ฑ์„ ํŒ๋‹จํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“œ๋Š” ์›์ธ์ด ๋œ๋‹ค.
โ‡’ ์ •ํ™•๋„์˜ ํฌ์ƒ์„ ์ตœ์†Œ๋กœ ํ•˜์—ฌ ๋…๋ฆฝ ๋ณ€์ˆ˜์˜ ์ฐจ์›์„ ์ถ•์†Œํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค.

๋ฐ์ดํ„ฐ ์š”์•ฝ

โ€ข
ํ†ต๊ณ„๋ž‘ ํ™•์ธ
โ—ฆ
๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ˆ˜์น˜์  ์š”์•ฝ์€ ๋ฐ์ดํ„ฐ ์ถ•์•ฝ์—์„œ ์ค‘์š”ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
import numpy as np import pandas as pd from sklearn import preprocessing import matplotlib.pylab as plt df = pd.read_csv('dmba/BostonHousing.csv') df = df.rename(columns={'CAT. MEDV':'CAT_MEDV'}) # ๋ชจ๋“  ๋ณ€์ˆ˜์˜ ๊ฐœ์š” # ๊ด€์ธก์น˜ ๊ฐœ์ˆ˜, ํ‰๊ท , ํ‘œ์ค€ ํŽธ์ฐจ, ์ตœ์†Ÿ๊ฐ’, ์ตœ๋Œ“๊ฐ’, ์‚ฌ๋ถ„์œ„ ์ˆ˜ ์ œ๊ณต df.describe() # ๊ทน๋‹จ๊ฐ’ ๊ฒ€์ถœ m = df.CRIM.min() M = df.CRIM.max() # ๋ณ€์ˆ˜์˜ ์ค‘์‹ฌ๊ฐ’์— ๋Œ€ํ•œ ์ •๋ณด ์ œ๊ณต # ํ‰๊ท ๊ณผ ์ค‘์•™๊ฐ’ ๊ฐ„์˜ ํŽธ์ฐจ๊ฐ€ ํฌ๋‹ค = ๋ฐ์ดํ„ฐ๊ฐ€ ์น˜์šฐ์ณ์ ธ ์žˆ๋‹ค # ex. ํ‰๊ท  > ์ค‘์•™๊ฐ’ : ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๊ผฌ๋ฆฌ๊ฐ€ ๊ธด ๋ถ„ํฌ med = df.CRIM.median() mea = df.CRIM.mean() # ๋ฐ์ดํ„ฐ๊ฐ€ ํผ์ง„ ์ •๋„์— ๋Œ€ํ•œ ์ •๋ณด -> ํ‘œ์ค€ํŽธ์ฐจ std_ = df.CRIM.std() # ๊ฒฐ์ธก์น˜ ์ •๋ณด n = df.CRIM.isnull().sum() print('Max:', M, 'Min:', m , 'Median:', med, 'Mean:', mea, 'Std:', std_, 'Null:', n )
Python
๋ณต์‚ฌ
โ€ข
์ƒ๊ด€๊ณ„์ˆ˜
โ—ฆ
๋‘ ๋ณ€์ˆ˜ ์‚ฌ์ด์˜ ์ƒ๊ด€ ์—ฌ๋ถ€๋ฅผ ํŒŒ์•…ํ•˜๊ธฐ ์œ„ํ•ด ์ƒ๊ด€ ๊ณ„์ˆ˜๋ฅผ ํ™•์ธํ•œ๋‹ค.
โ€ข
Pivot Table์„ ํ†ตํ•œ ๋ฐ์ดํ„ฐ ํƒ์ƒ‰
โ—ฆ
์ด์ง„ ๋ถ„๋ฅ˜ ๋ฌธ์ œ์—์„œ ํด๋ž˜์Šค ๊ตฌ๋ณ„์— ํ•„์ˆ˜์ ์ธ ๋ณ€์ˆ˜๋ฅผ ํŒŒ์•…ํ•˜๊ณ ์ž ํ•  ๋•Œ ์œ ์šฉํ•˜๋‹ค.
โ–ช
์˜ˆ๋ฅผ ๋“ค์–ด, ์–ด๋–ค ๋ณ€์ˆ˜์˜ ํ‰๊ท  ๊ฐ’์ด ๋‘ ๊ฐœ์˜ ํด๋ž˜์Šค์— ๋”ฐ๋ผ ํฌ๊ฒŒ ๋‹ค๋ฅด๋‹ค๋ฉด ๊ทธ ๋ณ€์ˆ˜๋Š” ์ค‘์š”ํ•œ ๋ณ€์ˆ˜์ผ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๋‹ค.
# groupby() ์ด์šฉ # ์ง€์—ญ๋‹น ํ‰๊ท  ๋ฐฉ์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌ๊ฐ„ ๋ณ„๋กœ ๋‚˜๋ˆ” df['RM_bin'] = pd.cut(df.RM, range(0,10), labels=False) # ์ฐฐ์Šค ๊ฐ• ๊ฒฝ๊ณ„, ๊ตฌ๊ฐ„ํ™”๋œ ํ‰๊ท  ๋ฐฉ์˜ ๊ฐœ์ˆ˜์˜ ์กฐํ•ฉ์œผ๋กœ ๊ทธ๋ฃน์„ ๋‚˜๋ˆ„๊ณ  # ๊ฐ ๊ทธ๋ฃน์—์„œ ์ฃผํƒ ๊ฐ€๊ฒฉ์˜ ์ค‘์•™๊ฐ’์˜ ํ‰๊ท ์„ ํ™•์ธ df.groupby(['RM_bin','CHAS'])['MEDV'].mean()
Python
๋ณต์‚ฌ
# pivot_table() ์ด์šฉ # margins=True์˜ ์˜๋ฏธ: ํ”ผ๋ฒ—ํ…Œ์ด๋ธ”์˜ ๋งˆ์ง€๋ง‰ ํ–‰๊ณผ ๋งˆ์ง€๋ง‰ ์—ด์— 'All' ์ด๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ์ „์ฒด ์š”์•ฝ ๊ฐ’์„ ์ถ”๊ฐ€ pd.pivot_table(df, values='MEDV', index=['RM_bin'], columns=['CHAS'], aggfunc=np.mean, margins=True)
Python
๋ณต์‚ฌ

์ƒ๊ด€๋ถ„์„

โ€ข
์ƒ๊ด€ ํ–‰๋ ฌ
โ—ฆ
์ฃผ์–ด์ง„ ๋ชจ๋“  ๋ณ€์ˆ˜์˜ ์Œ์œผ๋กœ๋ถ€ํ„ฐ ๊ตฌํ•œ ์ƒ๊ด€๊ณ„์ˆ˜๋ฅผ ๋ณด์—ฌ์ค€๋‹ค.
โ—ฆ
๋งค์šฐ ๊ฐ•ํ•œ ์ƒ๊ด€๊ด€๊ณ„๊ฐ€ ์žˆ๋Š” ๋ณ€์ˆ˜ ์Œ์€ ์ •๋ณด์˜ ๋งŽ์€ ๋ถ€๋ถ„์ด ๊ฒน์น˜๋ฏ€๋กœ, ํ•˜๋‚˜๋ฅผ ์ œ๊ฑฐํ•˜์—ฌ ์ถ•์†Œ ๊ฐ€๋Šฅํ•˜๋‹ค.
โ–ช
๋‹ค์ค‘ ๊ณต์„ ์„ฑ ๋ฌธ์ œ ํ•ด๊ฒฐ ๊ฐ€๋Šฅ
โ–ช
์ฃผ์˜ํ•  ์  : ์ƒ๊ด€๊ณ„์ˆ˜๋Š” ๋‘ ๋ณ€์ˆ˜ ์‚ฌ์ด์˜ ์„ ํ˜• ๊ด€๊ณ„์˜ ์—ฌ๋ถ€๋งŒ์„ ํŒ๋‹จํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์ƒ๊ด€๊ณ„์ˆ˜๊ฐ€ 0์— ๊ฐ€๊น๋‹ค๋Š” ๊ฒƒ์€ ๋‘ ๋ณ€์ˆ˜ ์‚ฌ์ด์˜ ์„ ํ˜• ๊ด€๊ณ„๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ด์ง€, ์ด๊ฒƒ์ด ๋‘ ๋ณ€์ˆ˜๊ฐ€ ์„œ๋กœ ์—ฐ๊ด€์ด ์•„์˜ˆ ์—†์Œ์„ ์˜๋ฏธํ•˜์ง€๋Š” ์•Š๋Š”๋‹ค.
df.corr().round(2)
Python
๋ณต์‚ฌ

๋ฒ”์ฃผํ˜• ๋ณ€์ˆ˜์˜ ๋ฒ”์ฃผ ๊ฐœ์ˆ˜ ์ถ•์†Œ

โ€ข
๊ฐ€๋ณ€์ˆ˜ ๋ณ€ํ™˜
โ—ฆ
๋ฒ”์ฃผํ˜• ๋ณ€์ˆ˜๊ฐ€ ๋…๋ฆฝ ๋ณ€์ˆ˜์ธ ๊ฒฝ์šฐ ์ด๋ฅผ ๊ฐ€๋ณ€์ˆ˜๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.
โ—ฆ
์ด๋•Œ ๊ฐ ๋ณ€์ˆ˜์˜ ๋ฒ”์ฃผ์˜ ๊ฐœ์ˆ˜๊ฐ€ ๋งŽ๋‹ค๋ฉด, ๋ณ€์ˆ˜์˜ ๊ฐœ์ˆ˜๊ฐ€ ๋Š˜์–ด๋‚˜๊ฒŒ ๋œ๋‹ค.
โ–ช
์˜ˆ๋ฅผ ๋“ค์–ด m๊ฐœ์˜ ๋ฒ”์ฃผ๋ฅผ ๊ฐ€์ง„ ๋ณ€์ˆ˜์˜ ๊ฒฝ์šฐ ๊ฐ€๋ณ€์ˆ˜ ๋ณ€ํ™˜์„ ๊ฑฐ์นœ ์ดํ›„ ๋ณ€์ˆ˜์˜ ๊ฐœ์ˆ˜๋Š” m-1๊ฐœ๊ฐ€ ๋ชจ๋ธ์— ์‚ฌ์šฉ๋œ๋‹ค.
โ—ฆ
์œ ์‚ฌํ•œ ๋ฒ”์ฃผ๋ฅผ ํ•˜๋‚˜๋กœ ํ•ฉ์นจ์œผ๋กœ์จ ๋ฒ”์ฃผ์˜ ์ˆ˜๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.
โ–ช
Pivot-table์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์–‘ํ•œ ๋ฒ”์ฃผ์—์„œ ์ข…์† ๋ณ€์ˆ˜๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ฐ˜์‘ํ•˜๋Š”์ง€๋ฅผ ํŒŒ์•…ํ•˜์—ฌ ๋ฒ”์ฃผ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.
โ–ช
๋˜๋Š” ๊ด€์ธก์น˜ ๊ฐœ์ˆ˜๊ฐ€ ์ ์€ ๋ฒ”์ฃผ๋“ค์„ โ€˜๊ธฐํƒ€โ€™ ๋ฒ”์ฃผ๋กœ ํ†ตํ•ฉํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.
โ–ช
์ด์ง„ ๋ถ„๋ฅ˜ ๋ฌธ์ œ์—์„œ, ๋…๋ฆฝ ๋ณ€์ˆ˜์˜ ๊ฐ ๋ฒ”์ฃผ์— ๋Œ€ํ•œ ์ข…์† ๋ณ€์ˆ˜์˜ ๋ถ„ํฌ๋ฅผ ํŒŒ์•…ํ•˜์—ฌ ๋ถ„๋ฅ˜์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š” ๋ฒ”์ฃผ๋ฅผ ํŒŒ์•…ํ•˜์—ฌ ํ•˜๋‚˜์˜ ๋ฒ”์ฃผ๋กœ ๊ฒฐํ•ฉํ•  ์ˆ˜ ์žˆ๋‹ค.
โ€ข
์‹œ๊ณ„์—ด ๋ถ„์„
โ—ฆ
๊ฐ ๋ถ„๊ธฐ๊ฐ€ ๋…๋ฆฝ ๋ณ€์ˆ˜์ธ ๊ฒฝ์šฐ, ์œ ์‚ฌํ•œ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ถ„๊ธฐ๋ฅผ ํ†ตํ•ฉํ•  ์ˆ˜ ์žˆ๋‹ค.
โ–ช
์˜ˆ๋ฅผ ๋“ค์–ด, 1~3๋ถ„๊ธฐ ์‹ค์ ์€ ๋งค๋…„ ์œ ์‚ฌํ•˜์ง€๋งŒ 4๋ถ„๊ธฐ ์‹ค์ ์—์„œ๋Š” ์ฐจ์ด๋ฅผ ๋ณด์ด๋Š” ๊ฒฝ์šฐ 1~3๋ถ„๊ธฐ๋ฅผ ํ•˜๋‚˜์˜ ๋ณ€์ˆ˜๋กœ ํ†ตํ•ฉํ•  ์ˆ˜ ์žˆ๋‹ค.
โ€ข
์ˆ˜์น˜ํ˜• ๋ณ€์ˆ˜ ๋ณ€ํ™˜
โ—ฆ
๊ตฌ๊ฐ„์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฒ”์ฃผ์ธ ๊ฒฝ์šฐ ๋ฒ”์ฃผํ˜• ๊ฐ’์„ ๊ตฌ๊ฐ„์˜ ์ค‘๊ฐ„๊ฐ’์œผ๋กœ ๋Œ€์ฒดํ•˜์—ฌ ๊ฐ€๋ณ€์ˆ˜ ๋ณ€ํ™˜ ์—†์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
โ–ช
๋งŒ์•ฝ ๊ฐ€๋ณ€์ˆ˜ ๋ณ€ํ™˜์„ ํ•œ๋‹ค๋ฉด ๋ฒ”์ฃผ์ˆ˜-1๊ฐœ์˜ ๋ณ€์ˆ˜๊ฐ€ ๋ชจ๋ธ์— ์‚ฌ์šฉ๋˜์ง€๋งŒ, ์ด ๊ฒฝ์šฐ ๋ณ€์ˆ˜๋ฅผ 1๊ฐœ๋งŒ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค.

PCA(Principal Component Analysis)

โ€ข
PCA
โ—ฆ
๋ฐ์ดํ„ฐ ๋ถ„ํฌ๋ฅผ ๊ฐ€์žฅ ์ž˜ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋Š” ์ถ•, ๋ถ„์‚ฐ์ด ์ตœ๋Œ€๊ฐ€ ๋˜๋Š” ์ถ•์„ ์ฐพ๋Š” ๊ฒƒ
โ—ฆ
๋ฐ์ดํ„ฐ์˜ ๋ถ„์‚ฐ์ด ํฌ๋‹ค๋Š” ๊ฒƒ์€, ๊ทธ ๋ฐฉํ–ฅ์œผ๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์ด ํผ์ ธ ์žˆ๋‹ค๋Š” ๊ฒƒ
โ–ช
์ด๋Š” ํ•ด๋‹น ์ถ•์„ ๋ฐ”ํƒ•์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ํŒŒ์•…ํ•œ๋‹ค๋ฉด ๋” ๋งŽ์€ ์ •๋ณด๋ฅผ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์˜๋ฏธ
โ–ช
์˜ˆ๋ฅผ ๋“ค์–ด, ์–ด๋–ค ๋ฐฉํ–ฅ์—์„œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฑฐ์˜ ํ•œ ์ ์— ๋ชฐ๋ ค ์žˆ๋‹ค๋ฉด, ๊ทธ ์ถ•์€ ๋ฐ์ดํ„ฐ์˜ ๋ณ€๋ณ„๋ ฅ์ด ์—†๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
โ–ช
๋ฐ˜๋ฉด์— ์–ด๋–ค ์ถ•์—์„œ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์ซ™ ํผ์ ธ ์žˆ๋‹ค๋ฉด ๊ทธ ๋ฐฉํ–ฅ์œผ๋กœ ๋ณด๋ฉด ๋ฐ์ดํ„ฐ ๊ฐ„ ์ฐจ์ด๊ฐ€ ๋” ๋šœ๋ ทํ•˜๊ฒŒ ๋‚˜ํƒ€๋‚œ๋‹ค.
โ—ฆ
๊ทธ๋ž˜์„œ PCA๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฐ€์žฅ ์ž˜ ํผ์ ธ ์žˆ๋Š” ์ถ•(=๋ถ„์‚ฐ์ด ํฐ ์ถ•) ์„ ์ฐพ๋Š” ๊ฒƒ์„ ๋ชฉ์ ์œผ๋กœ ํ•œ๋‹ค.
โ–ช
์ „์ฒด ๋ณ€๋™์— ๊ฐ ๋ณ€์ˆ˜๊ฐ€ ๋ฏธ์น˜๋Š” ๊ธฐ์—ฌ๋„๋ฅผ ์ตœ๋Œ€ํ•œ ํ™œ์šฉํ•˜๋ฉด์„œ๋„ ๋ณ€์ˆ˜์˜ ์ˆ˜๋ฅผ ์ถ•์†Œํ•˜๋Š” ๋ฐฉ์‹์ด๋ผ๊ณ  ํ•ด์„ํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.
โ—ฆ
์ผ๋ฐ˜์ ์ธ PCA์™€ Kernel PCA๊ฐ€ ์กด์žฌํ•จ.
โ—ฆ
์—ฐ์†์ ์ธ ์ž ์žฌ ๋ณ€์ˆ˜(latent variable)์— ๋Œ€ํ•ด ์‚ฌ์šฉ
โ€ข
Latent variable
โ—ฆ
๊ฐ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด ํ• ๋‹น๋˜์–ด์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ์•Œ๋ ค์ง€์ง€ ์•Š์€ ๋ณ€์ˆ˜
โ—ฆ
PCA์—์„œ๋Š” ๊ฐ ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ๋ฅผ ๋ช‡ ๊ฐœ์˜ ์ž ์žฌ์ ์ธ ์—ฐ์† ๋ณ€์ˆ˜(latent continuous variables)์˜ ์กฐํ•ฉ์œผ๋กœ ํ‘œํ˜„
โ—ฆ
๊ฐ ์ฃผ์„ฑ๋ถ„ ์ถ• (principal component axis)์€ ๊ณ ์ •๋œ ๋ฐฉํ–ฅ ๋ฒกํ„ฐ
โ—ฆ
PCA๋Š” ์ด ์ถ•๋“ค์„ ๋”ฐ๋ผ ๋ฐ์ดํ„ฐ๋ฅผ ํˆฌ์˜ํ•ด์„œ, ๊ฐ ๋ฐ์ดํ„ฐ๊ฐ€ ์ด ์ถ• ์œ„์—์„œ ์–ผ๋งˆ๋งŒํผ์˜ ๊ฐ’์„ ๊ฐ€์ง€๋Š”์ง€(=์ขŒํ‘œ)๋ฅผ ๊ณ„์‚ฐ
โ—ฆ
์—ฌ๊ธฐ์„œ ์ขŒํ‘œ ๊ฐ’๋“ค์€ ์—ฐ์†์ ์ธ ์‹ค์ˆ˜ ๊ฐ’์ด๊ธฐ ๋•Œ๋ฌธ์—, ๊ฒฐ๊ตญ ๊ฐ ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ๋Š” ์—ฐ์†์ ์ธ ์‹ค์ˆ˜๊ฐ’๋“ค์„ ๊ฐ–๋Š” ์ž ์žฌ๋ณ€์ˆ˜์˜ ์กฐํ•ฉ์œผ๋กœ ํ‘œํ˜„๋จ
โ€ข
๋ชฉ์ : ๋ฐ์ดํ„ฐ์˜ ๋ถ„์‚ฐ์ด ์ตœ๋Œ€ํ™” ๋˜๋Š” ์ถ•์„ ์ฐพ๋Š”๋‹ค
โ—ฆ
ํˆฌ์‚ฌํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ถ„์‚ฐ์ด ์ตœ๋Œ€๊ฐ€ ๋˜๋„๋กํ•˜๋Š” ์ถ•์„ ์ฐพ๋Š” ๊ฒƒ
โ—ฆ
์•„๋ž˜ ๊ทธ๋ฆผ์—์„œ ๊ฐ ๋ฐ์ดํ„ฐ๋ฅผ uu ๋ฒกํ„ฐ๋กœ ํˆฌ์‚ฌํ–ˆ์„ ๋•Œ xsx_s ๋“ค์˜ ๋ถ„์‚ฐ์ด ์ตœ๋Œ€๊ฐ€ ๋˜์–ด์•ผ ํ•œ๋‹ค (2์ฐจ์› โ‡’ 1์ฐจ์› ์ถ•์†Œ)
โ€ข
๋‚ด์  = Projection
โ—ฆ
๊ธฐํ•˜ํ•™์  ์ •์˜ : aโ‹…b=โˆฃaโˆฃโˆฃbโˆฃcos(ฮธ)a \cdot b = |a| |b| cos(\theta)
โ—ฆ
p=โˆฃxโˆฃ=โˆฃbโˆฃcos(ฮธ)p = |x| = |b|cos(\theta)
โ—ฆ
x=โˆฃbโˆฃcos(ฮธ)aโˆฃaโˆฃ=aโ‹…baโˆฃaโˆฃ2x = |b|cos(\theta) \frac {a}{|a|} = a \cdot b \frac {a}{|a|^2}
โ–ช
ํˆฌ์‚ฌ๋œ ๋ฒกํ„ฐ xx๋Š” ๋‚ด์ ์˜ ํฌ๊ธฐ๋งŒํผ ๋‹จ์œ„ ๋ฒกํ„ฐ๋ฅผ ์ด๋™์‹œํ‚จ ๋ฒกํ„ฐ์ด๋‹ค.
โ€ข
๋ถ„์‚ฐ์„ ์ตœ๋Œ€ํ™” ์‹œํ‚ค๋Š” ๊ฒƒ์˜ ์ˆ˜์‹ํ™”
โ—ฆ
๋ฐ์ดํ„ฐ์˜ ๋ถ„์‚ฐ-๊ณต๋ถ„์‚ฐ ํ–‰๋ ฌ ๊ตฌํ•˜๊ธฐ
โ—ฆ
์–ด๋–ค ๋ฒกํ„ฐ u1u_1์œผ๋กœ ํˆฌ์‚ฌ ํ›„์˜ ๋ถ„์‚ฐ์„ ์ตœ๋Œ€ํ™”
โ‡’ ๊ฒฐ๊ณผ์ ์œผ๋กœ Su1=ฮป1u1Su_1 = \lambda_1 u_1์„ ๋งŒ์กฑํ•˜๋Š” u1u_1์„ ์ฐพ๋Š” ๋ฌธ์ œ์ด๋ฉฐ, ๊ณ ์œณ๊ฐ’ ๋ถ„ํ•ด(Eigenvalue Decomposition)์„ ํ†ตํ•ด ํ’€์ดํ•  ์ˆ˜ ์žˆ๋‹ค.
โ€ข
๊ณ ์œณ๊ฐ’ ๋ถ„ํ•ด(Eigenvalue Decomposition)
A:nร—nA: n \times n (์ •์‚ฌ๊ฐํ–‰๋ ฌ) ์ด๊ณ  ๋ฒกํ„ฐ vv๊ฐ€ Av=ฮปvAv = \lambda v ๋ฅผ ๋งŒ์กฑํ•˜๋ฉฐ ์˜๋ฒกํ„ฐ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด, vv๋Š” ๊ณ ์œ ๋ฒกํ„ฐ(Eigen-vector) ฮป\lambda๋Š” ๊ณ ์œณ๊ฐ’(Eigen-value)์ด๋ผ ํ•œ๋‹ค.
โ€ข
๊ณ ์œณ๊ฐ’ ๋ถ„ํ•ด์˜ ๊ธฐํ•˜ํ•™
โ—ฆ
ํ–‰๋ ฌ A๋ฅผ ์ด์šฉํ•œ ์–ด๋–ค ๋ฒกํ„ฐ์˜ ๋ณ€ํ™˜์ด ๊ณ ์œณ๊ฐ’์„ ํ†ตํ•ด ์ด ๋ฒกํ„ฐ๋ฅผ ์Šค์ผ€์ผ๋งํ•œ ๊ฒƒ๊ณผ ๊ฐ™๋‹ค. ๋‹ค์‹œ ๋งํ•ด, ์„ ํ˜• ๋ณ€ํ™˜์„ ํ•˜๋”๋ผ๋„ ๋ณธ์ธ์˜ ๋ฐฉํ–ฅ์œผ๋กœ ๋Œ์•„์˜ค๋„๋ก ๋งŒ๋“œ๋Š” ๋ฒกํ„ฐ๋ฅผ ๋งํ•˜๋ฉฐ ์ด๋ฅผ ๊ณ ์œ  ๋ฒกํ„ฐ๋ผ๊ณ  ํ•œ๋‹ค.
โ€ข
๊ณ ์œณ๊ฐ’ ๋ถ„ํ•ด์˜ ๊ณ„์‚ฐ ๊ณผ์ •
โ€ข
๊ณ ์œณ๊ฐ’ ๋ถ„ํ•ด ์˜ˆ์ œ
โ€ข
๊ฒฐ๋ก 
โ—ฆ
๋ถ„์‚ฐ์„ ์ตœ๋Œ€๋กœ ํ•˜๋Š” ์ถ•(๋ฒกํ„ฐ)๋Š” ๋ถ„์‚ฐ-๊ณต๋ถ„์‚ฐ ํ–‰๋ ฌ์˜ ๊ณ ์œ ๋ฒกํ„ฐ์ด๋ฏ€๋กœ, PCA๋Š” ๋ถ„์‚ฐ-๊ณต๋ถ„์‚ฐ ํ–‰๋ ฌ์˜ ๊ณ ์œณ๊ฐ’ ๋ถ„ํ•ด๋ฅผ ํ†ตํ•ด ์–ป์€ ๊ณ ์œ ๋ฒกํ„ฐ ์ค‘ ์ผ๋ถ€๋ฅผ ์‚ฌ์šฉํ•ด(๊ณ ์œ ๊ฐ’์ด ํฐ ์ˆœ์„œ๋Œ€๋กœ ๊ณ ์œ ๋ฒกํ„ฐ๋ฅผ ์„ ํƒ) ์ฐจ์›์„ ์ถ•์†Œํ•œ๋‹ค.
โ—ฆ
๊ณ ์œณ๊ฐ’์€ ๋ถ„์‚ฐ์˜ ํฌ๊ธฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๊ธฐ ๋•Œ๋ฌธ์—, ์ •๋ณด ๋ณด์กด์˜ ์ธก๋ฉด์—์„œ ์ด๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๊ณ ์œ ๋ฒกํ„ฐ๋ฅผ ์„ ํƒํ•œ๋‹ค.
โ€ข
๋ฐœ์ „
โ—ฆ
Kernel์„ ์‚ฌ์šฉํ•œ Kernel PCA๋„ ์กด์žฌํ•˜๋‚˜, Kernel Method์— ๋Œ€ํ•ด ๋‹ค๋ฃฌ ์ดํ›„ ์ •๋ฆฌํ•˜๋„๋ก ํ•˜๊ฒ ๋‹ค.
โ€ข
์ฃผ์„ฑ๋ถ„ ์ ์ˆ˜(์ƒˆ๋กœ์šด ์ขŒํ‘œ)
โ—ฆ
PCA์—์„œ๋Š” ๋ถ„์‚ฐ์ด ๊ฐ€์žฅ ํฐ ๋ฐฉํ–ฅ(=๊ณ ์œ ๋ฒกํ„ฐ, ์ฃผ์„ฑ๋ถ„ ์ถ•)์„ ์ฐพ์€ ํ›„, ๊ฐ ๋ฐ์ดํ„ฐ๋ฅผ ํ•ด๋‹น ์ถ•์— ์‚ฌ์˜(projection) ํ•ด์„œ ์ƒˆ๋กœ์šด ์ขŒํ‘œ(=์ฃผ์„ฑ๋ถ„ ์ ์ˆ˜)๋ฅผ ๊ตฌํ•œ๋‹ค.
โ—ฆ
์ด๋•Œ, ๋ฐ์ดํ„ฐ์˜ ๋ถ„์‚ฐ ๋ฐฉํ–ฅ์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ํŒŒ์•…ํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ ๋ฐ์ดํ„ฐ์—์„œ ํ‰๊ท ์„ ๋จผ์ € ๋บ€ ํ›„, ๊ณ ์œ ๋ฒกํ„ฐ์™€ ๋‚ด์ ํ•˜์—ฌ ์ฃผ์„ฑ๋ถ„ ์ ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•œ๋‹ค.
โ—ฆ
์ƒˆ๋กœ์šด ์ถ•์—์„œ์˜ ์ขŒํ‘œ (์ฃผ์„ฑ๋ถ„ ์ ์ˆ˜) : z(n)=uโŠค(x(n)โˆ’xห‰)z^{(n)} = \mathbf{u}^\top (\mathbf{x}^{(n)} - \bar{\mathbf{x}})
โ—ฆ
์ƒˆ๋กญ๊ฒŒ ์ƒ์„ฑ๋œ ์ฃผ์„ฑ๋ถ„๋“ค์€ ์„œ๋กœ ์ƒ๊ด€๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฏ€๋กœ, ์ƒˆ๋กœ์šด ์ถ•์œผ๋กœ ์‚ฌ์˜ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ํšŒ๊ท€ ๋ชจ๋ธ์„ ๋งŒ๋“ค๋ฉด, ๋‹ค์ค‘ ๊ณต์„ ์„ฑ ๋ฌธ์ œ์—์„œ ์ž์œ ๋กœ์šธ ์ˆ˜ ์žˆ๋‹ค.
from sklearn.decomposition import PCA import pandas as pd cereal = pd.read_csv('dmba/Cereals.csv') pcs = PCA(n_components=2) pcs.fit(cereal[['calories','rating']]) # 2๊ฐœ์˜ ๋ณ€์ˆ˜๋กœ PCA ์ˆ˜ํ–‰ pcs.fit(cereal.iloc[:,3:].dropna(axis=0)) # ์ „์ฒด ์ˆ˜์น˜ํ˜• ๋ณ€์ˆ˜๋กœ PCA, ์—ด์—์„œ ๊ฒฐ์ธก์น˜ ์ œ๊ฑฐ pcs.components_ # ์ƒˆ๋กœ์šด ์ถ•(๋ฒกํ„ฐ) score = pcs.transform(cereal[['calories','rating']]) # ์‚ฌ์˜
Python
๋ณต์‚ฌ
โ€ข
๋ฐ์ดํ„ฐ ์ •๊ทœํ™”
โ—ฆ
์›๋ž˜์˜ ๋ณ€์ˆ˜๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ ๋‹จ์œ„๋กœ ์ธก์ •๋˜์—ˆ๋‹ค๋ฉด, ์ฃผ์„ฑ๋ถ„ ๊ตฌ์„ฑ์— ์žˆ์–ด ํ•ด๋‹น ๋ณ€์ˆ˜์˜ ์˜ํ–ฅ์ด ์ปค์งˆ ์ˆ˜ ์žˆ๋‹ค.
โ—ฆ
๋”ฐ๋ผ์„œ PCA๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์ „ ๋ฐ์ดํ„ฐ๋ฅผ ์ •๊ทœํ™”ํ•˜๋Š” ๊ฒƒ์ด ํ•„์š”ํ•˜๋‹ค.
โ—ฆ
์ •๊ทœํ™”๋œ ๋ฐ์ดํ„ฐ์—์„œ์˜ ๊ฐ€์ค‘์น˜(๊ณ ์œ ๋ฒกํ„ฐ์˜ ์„ฑ๋ถ„)๋Š” ํ•ด๋‹น ์ฃผ์„ฑ๋ถ„์— ์–ด๋–ค ๋ณ€์ˆ˜๊ฐ€ ๋ฏธ์น˜๋Š” ์˜ํ–ฅ๋ ฅ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.