์ฃผ์ฑ๋ถ ๋ถ์Principal Component Analysis
- ๋ฐ์ดํฐ์ ์๋ ๋ถ์ฐ๋ฐ์ดํฐ๊ฐ ๋๋ฆฌ ํผ์ ธ์๋ ์ ๋ ์ด ํฐ ๋ฐฉํฅ์ ์ฐพ๋ ๊ฒ
- ๊ณ ์ฐจ์์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฐจ์์ผ๋ก ์ถ์์ํค๋ ๋ํ์ ์ธ ์ฐจ์ ์ถ์ ์๊ณ ๋ฆฌ์ฆ ์ค ํ๋
- ๋ฐ์ดํฐ๋ค์ ์ ์ฌ์ ์์ผ ์ฐจ์์ ๋ฎ์ถ๋ค๋ฉด ์ด๋ค ๋ฒกํฐ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฌ์ ์์ผ์ผ ์๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ ์ผ ์ ์ ์งํ ์ ์์๊น
- ๊ธฐ์กด์ ๋ฐ์ดํฐ ํฌ์ธํธ๋ค๊ณผ ๋ฎ์ถ ์ฐจ์์ ๋ฐ์ดํฐ ๊ตฌ์กฐ์์ ์ฐจ๊ฐ ๊ฐ์ฅ ์๊ฒ ํ๋ ๋ฐฉ์์ผ๋ก ์งํ
- ๋ณ์๊ฐ ๋๋ฌด ๋ง์ ์ด๋ค ์ค ์ค์ํ๋ค๊ณ ํ๋จ๋๋ ๋ณ์๋ค ๋ช ๊ฐ๋ง ๋ฝ์ ๋ชจ๋ธ๋ง์ ํ๋ ค๊ณ ํ ๋ ์ฃผ๋ก PCA๋ฅผ ์ฌ์ฉํ๋ค.
PCA๊ฐ ํ์ํ ์ด์
1) ์ฐจ์์ ์ ์ฃผ
-
๋ฐ์ดํฐ์ ์ feature๊ฐ ๋ง์์ง๋ฉด ์ฐจ์ ๋ํ ์ฆ๊ฐ
-
๋ฐ์ดํฐ์ ์ฐจ์์ด ์ฆ๊ฐํ ์๋ก ๋ฐ์ดํฐ ๊ณต๊ฐ์ ๋ถํผ๊ฐ ๊ธฐํ๊ธ์์ ์ผ๋ก ์ฆ๊ฐ -> ๋ฐ์ดํฐ์ ๋ฐ๋๋ ์ฐจ์์ด ์ฆ๊ฐํ ์๋ก ํฌ์ํด์ง
-
๋ฐ์ดํฐ์ ์ฐจ์์ด ์ฆ๊ฐํ ์๋ก ๋ฐ์ดํฐ ํฌ์ธํธ ๊ฐ์ ๊ฑฐ๋ฆฌ๋ ์ฆ๊ฐ -> ๋ชจ๋ธ์ด ๋ณต์กํด์ ธ ์ค๋ฒํผํ ์ํ ์ปค์ง
2) ๋ค์ค ๊ณต์ฐ์ฑ ๋ฌธ์
- ํ๊ท๋ถ์์ ์ ์ ์กฐ๊ฑด. ๋ ๋ฆฝ๋ณ์๊ฐ์ ์๊ด๊ด๊ณ๊ฐ ๋์ผ๋ฉด ์๋จ
- ์๋ก ์์กด์ฑ์ด ๋์ feature๋ค์ ํจ๊ป ํ์ต์ํค๋ฉด ์ค๋ฒํผํ ๋๋ ๊ฒฝ์ฐ ์๊น
PCA ๊ณผ์
1) ๊ธฐ์กด์ ๋ฐ์ดํฐ ์ถ์
- x1์ถ์ผ๋ก ์ถ์๋ฅผ ํ ์๋ x2์ถ์ผ๋ก ์ถ์๋ฅผ ํ ์๋ ์์
- ์ด ๊ณผ์ ์์ ๋ฐ์ดํฐ๊ฐ ๊ฒน์น๋ ๋ฌธ์ ๋ฐ์ -> ์ ๋ณด ์ ์ค
2) ์๋ก์ด ์ถ ์ฐพ๊ธฐ
- x1๊ณผ x2์ถ์ด ์๋ ์๋ก์ด ์ถ์ ์ฐพ์์ผํจ
- ์ถ์ ๊ฐ ์ ๋ค์ด ํผ์ ธ์๋ ์ ๋์ธ ๋ถ์ฐ์ด ๊ฐ์ฅ ํฌ๊ฒ ๋๋๋ก ์ก์์ผํจ
- ์ด ์ถ์ ๋ฒกํฐ๋ฅผ ์ฃผ์ฑ๋ถ(principal component) ์ด๋ผ๊ณ ํ๋ค.
์๋ณธ ๋ฐ์ดํฐ๋ฅผ ์ด๋ค ๋ฒกํฐ์ ๋ด์ ํ๋ ๊ฒ์ด ์ต์ ์ ๊ฒฐ๊ณผ๋ฅผ ๋ด์ฃผ๋๊ฐ
Example
billboard hot100 chart audio-feature (feature 11๊ฐ)
trackdf
11๊ฐ feature๋ฅผ ์ฃผ์ฑ๋ถ๋ถ์์ ํ์ฉํ์ฌ 2๊ฐ๋ก ์ค์ฌ์ ํ์ฌ ๋ฐ์ดํฐ ํํํ๊ธฐ
featurelist = list(trackdf.columns)[1:]
tracktrain = trackdf[featurelist]
tracktrain
tracktrain ์ ๊ทํ
Scaler = StandardScaler()
tracktrain = Scaler.fit_transform(tracktrain)
tracktrain = pd.DataFrame(tracktrain,columns=featurelist)
tracktrain
PCA -> 2์ฐจ์ ๋ฐ์ดํฐ๋ก ๋ง๋ค๊ธฐ
pca = PCA(n_components=2)
principal = pca.fit(tracktrain)
principaltransform = pca.fit_transform(tracktrain)
pc = principal.components_
principalDF = pd.DataFrame(data = principaltransform, columns = ['principalcomponent01','principalcomponent02'])
์ฃผ์ฑ๋ถ๋ฒกํฐ
pc
array([[-0.30323406, -0.5291131 , -0.06083497, -0.45635198, 0.10039601,
-0.01568293, 0.49884875, -0.13077555, -0.0150439 , -0.36232136,
0.09137661],
[ 0.44035325, -0.22264418, 0.33311453, -0.33782897, -0.39143413,
0.41255903, 0.0387862 , 0.30700042, -0.27256214, 0.17523132,
0.08514396]])
principalDF
๋ค๋ฅธ ์๊ณ ๋ฆฌ์ฆ ํ์ฉํ๊ธฐ
์ ํ ํ๊ท ๋ถ์
- ํน์ฑ๊ณผ ํ๊ฒ์ฌ์ด์ ๊ด๊ณ๋ฅผ ๊ฐ์ฅ ์ ๋ํ๋ด๋ ์ ํ๋ฐฉ์ ์ ์ฐพ๊ธฐ
line_filter = LinearRegression()
p_component01 = np.array(principalDF["principalcomponent01"])
p_component02 = np.array(principalDF["principalcomponent02"])
p_component01 = p_component01.reshape(-1,1)
line_filter.fit(p_component01, p_component02)
print("z = {}*x + {}".format(line_filter.coef_[0], line_filter.intercept_))
z = 5.296358786892319e-16*x + -4.440892098500625e-17
plt.scatter(principalDF["principalcomponent01"],principalDF["principalcomponent02"])
plt.plot([-3,5],[(-3)*line_filter.coef_+line_filter.intercept_, 5*line_filter.coef_+line_filter.intercept_],color="r")
plt.ylim(-5,5)
plt.xlabel("principalcomponent01")
plt.ylabel("principalcomponent02")
plt.show()