๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
1๏ธโƒฃ AI•DS/๐Ÿ“• ๋จธ์‹ ๋Ÿฌ๋‹

[06. ์ฐจ์›์ถ•์†Œ] PCA, LDA, SVD, NMF

by isdawell 2022. 4. 24.
728x90

01. ์ฐจ์›์ถ•์†Œ


๐Ÿ‘€ ๊ฐœ์š” 

 

  • ๋งค์šฐ ๋งŽ์€ ํ”ผ์ฒ˜๋กœ ๊ตฌ์„ฑ๋œ ๋‹ค์ฐจ์› ๋ฐ์ดํ„ฐ ์„ธํŠธ์˜ ์ฐจ์›์„ ์ถ•์†Œํ•ด ์ƒˆ๋กœ์šด ์ฐจ์›์˜ ๋ฐ์ดํ„ฐ ์„ธํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ 
  • PCA, LDA, SVD, NMF ์•Œ๊ณ ๋ฆฌ์ฆ˜ 

 

์ฐจ์›์ด ํฐ ๊ฒฝ์šฐ ์ฐจ์›์ด ์ž‘์€ ๊ฒฝ์šฐ
sparse ํ•œ ๊ตฌ์กฐ ๐Ÿ‘‰ ์˜ˆ์ธก ์‹ ๋ขฐ๋„ ํ•˜๋ฝ  ์‹œ๊ฐํ™”๊ฐ€ ๊ฐ€๋Šฅํ•ด ์ง๊ด€์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ํ•ด์„ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ด์ง„๋‹ค. 
ํ”ผ์ฒ˜๋ณ„ ์ƒ๊ด€๊ด€๊ณ„๊ฐ€ ๋†’์„ ์ˆ˜ ์žˆ์Œ ๐Ÿ‘‰ ๋‹ค์ค‘ ๊ณต์„ ์„ฑ ๋ฌธ์ œ๋กœ ์˜ˆ์ธก ์„ฑ๋Šฅ ์ €ํ•˜  ํ•™์Šต์— ํ•„์š”ํ•œ ์ฒ˜๋ฆฌ ๋Šฅ๋ ฅ์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค. 

 

๐Ÿ“Œ ํ”ผ์ฒ˜ ์„ ํƒ vs ํ”ผ์ฒ˜ ์ถ”์ถœ 

 

  • ํ”ผ์ฒ˜ ์„ ํƒ : ํŠน์ • ํ”ผ์ฒ˜์— ์ข…์†์„ฑ์ด ๊ฐ•ํ•œ ๋ถˆํ•„์š”ํ•œ ํ”ผ์ฒ˜๋ฅผ ์•„์˜ˆ ์ œ๊ฑฐํ•˜์—ฌ ๋ฐ์ดํ„ฐ์˜ ํŠน์ง•์„ ์ž˜ ๋‚˜ํƒ€๋‚ด๋Š” ์ฃผ์š”ํ•œ ํ”ผ์ฒ˜๋งŒ ์„ ํƒํ•˜๋Š” ๋ฐฉ์‹ 
  • ํ”ผ์ฒ˜ ์ถ”์ถœ : ๊ธฐ์กด ํ”ผ์ฒ˜๋ฅผ ์ €์ฐจ์›์˜ ์ค‘์š” ํ”ผ์ฒ˜๋กœ ์••์ถ•ํ•ด์„œ ์ถ”์ถœ ๐Ÿ‘‰ ๋‹จ์ˆœํ•œ ์••์ถ•์ด ์•„๋‹Œ, ํ”ผ์ฒ˜๋ฅผ ํ•จ์ถ•์ ์œผ๋กœ ๋” ์ž˜ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋Š” ์ž ์žฌ์ ์ธ ์š”์†Œ๋ฅผ ์ถ”์ถœํ•ด ๋˜ ๋‹ค๋ฅธ ๊ณต๊ฐ„์œผ๋กœ ๋งคํ•‘ํ•˜๋Š” ๊ฒƒ 

 

 

๐Ÿ“Œ ์ด๋ฏธ์ง€, ํ…์ŠคํŠธ 

 

  • ๋งค์šฐ ๋งŽ์€ ์ฐจ์›์„ ๊ฐ€์ง„ ๋ฐ์ดํ„ฐ๋กœ, ์ฐจ์›์ถ•์†Œ๋ฅผ ํ†ตํ•ด ์ž ์žฌ์ ์ธ ์˜๋ฏธ๋ฅผ ํ”ผ์ฒ˜๋กœ ๋„์ถœํ•œ๋‹ค. 
  • ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ ๐Ÿ‘‰ ์ฐจ์›์ถ•์†Œ๋ฅผ ํ†ตํ•ด ํ•จ์ถ•์  ํ˜•ํƒœ์˜ ์ด๋ฏธ์ง€ ๋ณ€ํ™˜, ์••์ถ•์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด๋ฅผ ํ†ตํ•ด ๊ณผ์ ํ•ฉ์„ ๋ฐฉ์ง€ํ•˜์—ฌ ์˜ˆ์ธก ์„ฑ๋Šฅ์„ ๋Œ์–ด ์˜ฌ๋ฆด ์ˆ˜ ์žˆ๋‹ค. 
  • ํ…์ŠคํŠธ ๋ฐ์ดํ„ฐ ๐Ÿ‘‰ ํ…์ŠคํŠธ ๋ฌธ์„œ์˜ ์ˆจ๊ฒจ์ง„ ์˜๋ฏธ๋ฅผ ์ถ”์ถœํ•˜๋Š”๋ฐ ์ฐจ์›์ถ•์†Œ๋ฅผ ํ™œ์šฉํ•œ๋‹ค. '์‹œ๋งจํ‹ฑ ํ† ํ”ฝ ๋ชจ๋ธ๋ง' ์„ ์œ„ํ•œ ๊ธฐ๋ฐ˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ SVD, NMF ๊ฐ€ ์“ฐ์ธ๋‹ค. 

 

 

 

 

02. PCA  


๐Ÿ‘€ ๊ฐœ์š” 

 

๐Ÿ’ก PCA 

 

โœ” ๊ฐ€์žฅ ๋Œ€ํ‘œ์ ์ธ ์ฐจ์›์ถ•์†Œ ๊ธฐ๋ฒ• 

 

โœ” ์—ฌ๋Ÿฌ ๋ณ€์ˆ˜ ๊ฐ„์— ์กด์žฌํ•˜๋Š” ์ƒ๊ด€๊ด€๊ณ„๋ฅผ ์ด์šฉํ•˜์—ฌ ์ด๋ฅผ ๋Œ€ํ‘œํ•˜๋Š” ์ฃผ์„ฑ๋ถ„์„ ์ถ”์ถœํ•ด ์ฐจ์›์„ ์ถ•์†Œํ•˜๋Š” ๊ธฐ๋ฒ•์ด๋‹ค. 

 

โœ” ๊ฐ€์žฅ ๋†’์€ ๋ถ„์‚ฐ์„ ๊ฐ€์ง€๋Š” ๋ฐ์ดํ„ฐ์˜ ์ถ• = ์ฃผ์„ฑ๋ถ„์„ ์ฐพ์•„ ํ•ด๋‹น ์ถ•์œผ๋กœ ์ฐจ์›์„ ์ถ•์†Œํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ ๋ถ„์‚ฐ์€ ๋ฐ์ดํ„ฐ์˜ ํŠน์„ฑ์„ ๊ฐ€์žฅ ์ž˜ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•˜๋Š” ๊ฐ’์ด๋‹ค. 

 

โœ” ๊ฐ€์žฅ ํฐ ๋ฐ์ดํ„ฐ ๋ณ€๋™์„ฑ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ฒซ๋ฒˆ์งธ ๋ฒกํ„ฐ์ถ•์„ ์ƒ์„ฑํ•˜๊ณ  ์ด ๋ฒกํ„ฐ ์ถ•์— ์ง๊ฐ์ด ๋˜๋Š” ๋ฒกํ„ฐ (์ง๊ต๋ฒกํ„ฐ) ๋ฅผ ์ถ•์œผ๋กœ ํ•œ๋‹ค. ์„ธ๋ฒˆ์งธ ์ถ•์€ ๋‹ค์‹œ ๋‘๋ฒˆ์งธ ์ถ•๊ณผ ์ง๊ฐ์ด ๋˜๋Š” ๋ฒกํ„ฐ๋ฅผ ์„ค์ •ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ถ•์„ ์ƒ์„ฑํ•œ๋‹ค. 

 

 

 

 

1๏ธโƒฃ ๋ฐ์ดํ„ฐ ๋ณ€๋™์„ฑ์ด ๊ฐ€์žฅ ํฐ ๋ฐฉํ–ฅ์œผ๋กœ ์ถ•์„ ์ƒ์„ฑ

 

2๏ธโƒฃ ์ƒˆ๋กœ์šด ์ถ•์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ํˆฌ์˜ 

 

3๏ธโƒฃ ์ƒˆ๋กœ์šด ์ถ•์„ ๊ธฐ์ค€์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ํ‘œํ˜„ 

 

๐Ÿ‘‰ ์›๋ณธ ๋ฐ์ดํ„ฐ์˜ ํ”ผ์ฒ˜ ๊ฐœ์ˆ˜์— ๋น„ํ•ด ๋งค์šฐ ์ž‘์€ ์ฃผ์„ฑ๋ถ„์œผ๋กœ

์›๋ณธ ๋ฐ์ดํ„ฐ์˜ ์ด ๋ณ€๋™์„ฑ์„ ๋Œ€๋ถ€๋ถ„ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ„์„๋ฒ• 

 

 

 

๐Ÿ’ก ์„ ํ˜•๋Œ€์ˆ˜ํ•™์ ์œผ๋กœ ํ•ด์„

 

โœ” PCA = ์ž…๋ ฅ ๋ฐ์ดํ„ฐ์˜ ๊ณต๋ถ„์‚ฐ ํ–‰๋ ฌ์ด ๊ณ ์œ ๋ฒกํ„ฐ์™€ ๊ณ ์œ ๊ฐ’์œผ๋กœ ๋ถ„ํ•ด๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด๋ ‡๊ฒŒ ๋ถ„ํ•ด๋œ ๊ณ ์œ ๋ฒกํ„ฐ๋ฅผ ์ด์šฉํ•ด ์ž…๋ ฅ ๋ฐ์ดํ„ฐ๋ฅผ ์„ ํ˜•๋ณ€ํ™˜ ํ•˜๋Š” ๋ฐฉ์‹ 

 

 

https://jeonsm9575.tistory.com/46

 

 

 ๊ณต๋ถ„์‚ฐ ํ–‰๋ ฌ์„ ๐Ÿ‘‰ ๊ณ ์œ ๊ฐ’ ๋ถ„ํ•ด ๐Ÿ’จ ๊ณ ์œ ๋ฒกํ„ฐ, ๊ณ ์œ ๊ฐ’์ด ์–ป์–ด์ง

 

๐Ÿ‘ป ๊ณต๋ถ„์‚ฐ ํ–‰๋ ฌ = ์—ฌ๋Ÿฌ ๋ณ€์ˆ˜์™€ ๊ด€๋ จ๋œ ๊ณต๋ถ„์‚ฐ (→ ๋‘ ๋ณ€์ˆ˜๊ฐ„์˜ ๋ณ€๋™์„ ์˜๋ฏธ) ์„ ํฌํ•จํ•˜๋Š” ์ •๋ฐฉํ–‰๋ ฌ

 

๐Ÿ‘ป ๊ณ ์œ ๋ฒกํ„ฐ = PCA ์˜ ์ฃผ์„ฑ๋ถ„ ๋ฒกํ„ฐ๋กœ ์ž…๋ ฅ ๋ฐ์ดํ„ฐ์˜ ๋ถ„์‚ฐ์ด ํฐ ๋ฐฉํ–ฅ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. 

 

๐Ÿ‘ป ๊ณ ์œ ๊ฐ’ = ๊ณ ์œ ๋ฒกํ„ฐ์˜ ํฌ๊ธฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ ๋™์‹œ์— ์ž…๋ ฅ ๋ฐ์ดํ„ฐ์˜ ๋ถ„์‚ฐ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. 

 

๐Ÿ‘ป ์„ ํ˜•๋ณ€ํ™˜ = ํŠน์ •ํ•œ ๋ฒกํ„ฐ์— ํ–‰๋ ฌ A๋ฅผ ๊ณฑํ•ด ์ƒˆ๋กœ์šด ๋ฒกํ„ฐ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ = ๋‹ค๋ฅธ ๊ณต๊ฐ„์œผ๋กœ์˜ ํˆฌ์˜

 

 

→ ๊ณต๋ถ„์‚ฐ ํ–‰๋ ฌ C ๋Š” ๊ณ ์œ ๋ฒกํ„ฐ ์ง๊ตํ–‰๋ ฌ * ๊ณ ์œ ๊ฐ’ ์ •๋ฐฉํ–‰๋ ฌ * ๊ณ ์œ ๋ฒกํ„ฐ ์ง๊ตํ–‰๋ ฌ์˜ ์ „์น˜ ํ–‰๋ ฌ๋กœ ๋ถ„ํ•ด๋จ 

 

 

๐Ÿ’ก PCA ๋™์ž‘๊ณผ์ • 

 

1. ์ž…๋ ฅ ๋ฐ์ดํ„ฐ ์„ธํŠธ์˜ ๊ณต๋ถ„์‚ฐ ํ–‰๋ ฌ์„ ์ƒ์„ฑํ•œ๋‹ค. 
2. ๊ณต๋ถ„์‚ฐ ํ–‰๋ ฌ์˜ ๊ณ ์œ ๋ฒกํ„ฐ์™€ ๊ณ ์œ ๊ฐ’์„ ๊ณ„์‚ฐํ•œ๋‹ค. 
3. ๊ณ ์œ ๊ฐ’์ด ๊ฐ€์žฅ ํฐ ์ˆœ์œผ๋กœ K๊ฐœ(=PCA ๋ณ€ํ™˜ ์ฐจ์ˆ˜๋งŒํผ) ๊ณ ์œ ๋ฒกํ„ฐ๋ฅผ ์ถ”์ถœ
4. ๊ณ ์œ ๊ฐ’์ด ๊ฐ€์žฅ ํฐ ์ˆœ์œผ๋กœ ์ถ”์ถœ๋œ ๊ณ ์œ ๋ฒกํ„ฐ๋ฅผ ์ด์šฉํ•ด ์ƒˆ๋กญ๊ฒŒ ์ž…๋ ฅ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€ํ™˜

 


 

๐Ÿ“Œ ์‹ค์Šต - iris

 

โญ PCA ๋ฅผ ์ ์šฉํ•˜๊ธฐ ์ „์— ๋ฐ˜๋“œ์‹œ ์Šค์ผ€์ผ๋ง์„ ์ง„ํ–‰ํ•ด์•ผ ํ•œ๋‹ค โญ

  • ์—ฌ๋Ÿฌ ์†์„ฑ์˜ ๊ฐ’์„ ์—ฐ์‚ฐํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์†์„ฑ์˜ ์Šค์ผ€์ผ์— ์˜ํ–ฅ์„ ๋ฐ›์œผ๋ฏ€๋กœ ๋™์ผํ•œ ์Šค์ผ€์ผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ํ•„์š”

 

from sklearn.decomposition import PCA

 

 

๐Ÿƒ‍โ™€๏ธ 01. ๋ฐ์ดํ„ฐ ๋กœ๋”ฉ, ์Šค์ผ€์ผ๋ง

 

iris = load_iris() 
columns = ['sepal_length','sepal_width','petal_length','petal_width'] 
irisdf = pd.DataFrame(iris.data, columns = columns) 
irisdf['target'] = iris.target 
irisdf.head(3)

from sklearn.preprocessing import StandardScaler 

# target ๊ฐ’์„ ์ œ์™ธํ•œ ๋ชจ๋“  ์†์„ฑ๊ฐ’์„ ์Šค์ผ€์ผ๋ง 
iris_scaled = StandardScaler().fit_transform(irisdf.iloc[:, :-1])

 

 

๐Ÿƒ‍โ™€๏ธ 02. PCA

 

from sklearn.decomposition import PCA 
pca = PCA(n_components = 2) 

pca.fit(iris_scaled) 
iris_pca = pca.transform(iris_scaled) 
print(iris_pca.shape) 
# 2๊ฐœ์˜ ์ฐจ์›์œผ๋กœ ์ถ•์†Œ๋œ ๊ฒƒ์„ ํ™•์ธํ•ด๋ณผ ์ˆ˜ ์žˆ์Œ 

(150, 2)


# ์ฐจ์›์ถ•์†Œ๋œ ๊ฒฐ๊ณผ ํ™•์ธํ•ด๋ณด๊ธฐ : ์ฃผ์„ฑ๋ถ„์œผ๋กœ ๋ช…๋ช… 
pca_columns = ['pca_component_1','pca_component_2'] 
irisdf_pca = pd.DataFrame(iris_pca, columns = pca_columns) 
irisdf_pca['target'] = iris.target 
irisdf_pca.head(3)

 

 

์‹œ๊ฐํ™” ๊ฒฐ๊ณผ

 

 

๐Ÿƒ‍โ™€๏ธ 03. ์ฃผ์„ฑ๋ถ„ ๋ณ€๋™์„ฑ ์„ค๋ช… ๋น„์œจ ํ™•์ธ : .explained_variance_ratio_

 

# ์ฃผ์„ฑ๋ถ„ ๋ณ€๋™์„ฑ ์„ค๋ช… ๋น„์œจ ํ™•์ธํ•ด๋ณด๊ธฐ 
print(pca.explained_variance_ratio_) #๐Ÿ“Œ 2๊ฐœ ์š”์†Œ๋กœ๋งŒ ๋ณ€ํ™˜ํ•ด๋„ ์›๋ณธ ๋ฐ์ดํ„ฐ์˜ ๋ณ€๋™์„ฑ์„ 95%์„ค๋ช… ๊ฐ€๋Šฅ

[0.72962445 0.22850762]

 

 

๐Ÿƒ‍โ™€๏ธ 04. ์›๋ณธ ๋ฐ์ดํ„ฐ์„ธํŠธ vs ์ฐจ์›์ถ•์†Œ๋œ ๋ฐ์ดํ„ฐ์„ธํŠธ : ๋ถ„๋ฅ˜๊ฒฐ๊ณผ ๋น„๊ตํ•ด๋ณด๊ธฐ 

 

from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import cross_val_score
import numpy as np

rcf = RandomForestClassifier(random_state=156) 
scores = cross_val_score(rcf, iris.data, iris.target, scoring = 'accuracy', cv=3)

print('์›๋ณธ ๋ฐ์ดํ„ฐ ๊ต์ฐจ๊ฒ€์ฆ ๊ฐœ๋ณ„ ์ •ํ™•๋„ : ', scores) 
print('์›๋ณธ ๋ฐ์ดํ„ฐ ํ‰๊ท  ์ •ํ™•๋„ : ', np.mean(scores))

์›๋ณธ ๋ฐ์ดํ„ฐ ๊ต์ฐจ๊ฒ€์ฆ ๊ฐœ๋ณ„ ์ •ํ™•๋„ :  [0.98 0.94 0.96]
์›๋ณธ ๋ฐ์ดํ„ฐ ํ‰๊ท  ์ •ํ™•๋„ :  0.96

 

pca_X = irisdf_pca[['pca_component_1', 'pca_component_2']] 
scores_pca = cross_val_score(rcf, pca_X, iris.target, scoring = 'accuracy', cv=3) 
print('์›๋ณธ ๋ฐ์ดํ„ฐ ๊ต์ฐจ๊ฒ€์ฆ ๊ฐœ๋ณ„ ์ •ํ™•๋„ : ', scores_pca) 
print('์›๋ณธ ๋ฐ์ดํ„ฐ ํ‰๊ท  ์ •ํ™•๋„ : ', np.mean(scores_pca))


์›๋ณธ ๋ฐ์ดํ„ฐ ๊ต์ฐจ๊ฒ€์ฆ ๊ฐœ๋ณ„ ์ •ํ™•๋„ :  [0.88 0.88 0.88]
์›๋ณธ ๋ฐ์ดํ„ฐ ํ‰๊ท  ์ •ํ™•๋„ :  0.88

#๐Ÿ“Œ ์ •ํ™•๋„๊ฐ€ ์•ฝ 8% ๊ฐ์†Œ : ์›๋ณธ ๋ฐ์ดํ„ฐ์„ธํŠธ ๋Œ€๋น„ ์˜ˆ์ธก ์„ฑ๋Šฅ์ด ๋‹น์—ฐํžˆ ๋–จ์–ด์งˆ ์ˆ˜ ๋ฐ–์— ์—†๋‹ค. 
#๐Ÿ“Œ ๊ทธ๋Ÿฌ๋‚˜ ์†์„ฑ๊ฐœ์ˆ˜๊ฐ€ 50% ๊ฐ์†Œํ•œ ๊ฒƒ์„ ๊ณ ๋ คํ•˜๋ฉด pca ๋ณ€ํ™˜ ํ›„์—๋„ ์›๋ณธ ๋ฐ์ดํ„ฐ์˜ ํŠน์„ฑ์„ ์ƒ๋‹น๋ถ€๋ถ„ ์œ ์ง€ํ•จ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

 

๐Ÿคธ‍โ™€๏ธ corr( ) ์„ ํ†ตํ•ด ์†์„ฑ๋ผ๋ฆฌ์˜ ์ƒ๊ด€์„ฑ์„ ํ™•์ธํ•œ ํ›„ ์ƒ๊ด€๋„๊ฐ€ ๋†’์€ ๋ณ€์ˆ˜๋“ค์„ ๋Œ€์ƒ์œผ๋กœ PCA ๋กœ ์ฐจ์›์ถ•์†Œํ•œ๋‹ค. 

 

 

 

 

03. LDA 


๐Ÿ‘€ ๊ฐœ์š” 

 

๐Ÿ’ก Linear Discriminant Analysis

 

โœ” ์„ ํ˜• ํŒ๋ณ„ ๋ถ„์„๋ฒ• 

 

โœ” PCA ์™€ ๋งค์šฐ ์œ ์‚ฌํ•˜๊ฒŒ ์ž…๋ ฅ ๋ฐ์ดํ„ฐ ์„ธํŠธ๋ฅผ ์ €์ฐจ์› ๊ณต๊ฐ„์— ํˆฌ์˜ํ•˜์—ฌ ์ฐจ์›์„ ์ถ•์†Œํ•˜๋Š” ๊ธฐ๋ฒ• 

 

โœ” ์ง€๋„ํ•™์Šต์˜ ๋ถ„๋ฅ˜์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฝ๋„๋ก ๊ฐœ๋ณ„ ํด๋ž˜์Šค๋ฅผ ๋ถ„๋ณ„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ์ค€์„ ์ตœ๋Œ€ํ•œ ์œ ์ง€ํ•˜๋ฉฐ ์ฐจ์›์„ ์ถ•์†Œํ•œ๋‹ค. 

 

PCA LDA
์ž…๋ ฅ ๋ฐ์ดํ„ฐ์˜ ๋ณ€๋™์„ฑ์ด ๊ฐ€์žฅ ํฐ ์ถ• ์ž…๋ ฅ ๋ฐ์ดํ„ฐ์˜ ๊ฒฐ์ • ๊ฐ’ ํด๋ž˜์Šค๋ฅผ ์ตœ๋Œ€ํ•œ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์ถ• 

 

 

โœ” ํด๋ž˜์Šค ๊ฐ„ ๋ถ„์‚ฐ (between) ๊ณผ ํด๋ž˜์Šค ๋‚ด๋ถ€ ๋ถ„์‚ฐ (within) ์˜ ๋น„์œจ์„ ์ตœ๋Œ€ํ™” ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ฐจ์›์„ ์ถ•์†Œํ•œ๋‹ค ๐Ÿ’จ ํด๋ž˜์Šค ๊ฐ„ ๋ถ„์‚ฐ์€ ์ตœ๋Œ€ํ•œ ํฌ๊ฒŒ, ํด๋ž˜์Šค ๋‚ด๋ถ€ ๋ถ„์‚ฐ์€ ์ตœ๋Œ€ํ•œ ์ž‘๊ฒŒ 

 

 

 

 

๐Ÿ’ก LDA ๋™์ž‘๊ณผ์ • 

 

โœ” LDA ๋Š” ๊ณต๋ถ„์‚ฐ ํ–‰๋ ฌ์ด ์•„๋‹ˆ๋ผ ํด๋ž˜์Šค ๊ฐ„ ๋ถ„์‚ฐ๊ณผ ํด๋ž˜์Šค ๋‚ด๋ถ€ ๋ถ„์‚ฐ ํ–‰๋ ฌ์„ ๊ตฌํ•˜์—ฌ ์ด์— ๊ธฐ๋ฐ˜ํ•ด ๊ณ ์œ ๋ฒกํ„ฐ๋ฅผ ๊ตฌํ•˜๊ณ  ์ž…๋ ฅ ๋ฐ์ดํ„ฐ๋ฅผ ํˆฌ์˜ํ•œ๋‹ค. 

 

1. ํด๋ž˜์Šค ๋‚ด๋ถ€์™€ ํด๋ž˜์Šค ๊ฐ„ ๋ถ„์‚ฐ ํ–‰๋ ฌ์„ ๊ตฌํ•œ๋‹ค. ์ด ๋‘ ๊ฐœ์˜ ํ–‰๋ ฌ์€ ์ž…๋ ฅ ๋ฐ์ดํ„ฐ์˜ ๊ฒฐ์ • ๊ฐ’ ํด๋ž˜์Šค๋ณ„๋กœ ๊ฐœ๋ณ„ ํ”ผ์ฒ˜์˜ ํ‰๊ท  ๋ฒกํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌํ•œ๋‹ค. 
2. Sw, Sb ํ–‰๋ ฌ์„ ๊ณ ์œ ๋ฒกํ„ฐ๋กœ ๋ถ„ํ•ดํ•œ๋‹ค. Sw'Sb ๐Ÿ‘‰ ๊ณ ์œ ๋ฒกํ„ฐ*๊ณ ์œ ๊ฐ’*๊ณ ์œ ๋ฒกํ„ฐ' 
3. ๊ณ ์œ ๊ฐ’์ด ๊ฐ€์žฅ ํฐ ์ˆœ์œผ๋กœ K๊ฐœ(=LDA๋ณ€ํ™˜ ์ฐจ์ˆ˜๋งŒํผ) ๊ณ ์œ ๋ฒกํ„ฐ๋ฅผ ์ถ”์ถœ
4. ๊ณ ์œ ๊ฐ’์ด ๊ฐ€์žฅ ํฐ ์ˆœ์œผ๋กœ ์ถ”์ถœ๋œ ๊ณ ์œ ๋ฒกํ„ฐ๋ฅผ ์ด์šฉํ•ด ์ƒˆ๋กญ๊ฒŒ ์ž…๋ ฅ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€ํ™˜

 


 

 

๐Ÿ“Œ ์‹ค์Šต - iris

 

 

LDA ๋ฅผ ์ ์šฉํ•˜๋ ค๋ฉด ์Šค์ผ€์ผ๋ง์€ ํ•„์ˆ˜, LDA fit ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ target ๊ฐ’์„ ๋„ฃ์–ด์ฃผ๋Š” ๊ฒƒ๋„ ์žŠ์ง€ ์•Š๊ธฐ

 

 

from sklearn.discriminant_analysis import LinearDiscriminantAnalysis

 

 

๐Ÿคธ‍โ™€๏ธ PCA ๋Š” ๋น„์ง€๋„ํ•™์Šต, LDA ๋Š” ์ง€๋„ํ•™์Šต 

 

 

 

๐Ÿƒ‍โ™€๏ธ 01. ๋ฐ์ดํ„ฐ ๋กœ๋”ฉ, ์Šค์ผ€์ผ๋ง

 

# ๋ฐ์ดํ„ฐ ๋กœ๋“œ, ์Šค์ผ€์ผ๋ง
iris = load_iris() 
iris_scaled = StandardScaler().fit_transform(iris.data)

 

 

 

๐Ÿƒ‍โ™€๏ธ 02. LDA ์ ์šฉ

 

# LDA ์ ์šฉ
lda = LinearDiscriminantAnalysis(n_components=2) 
lda.fit(iris_scaled, iris.target) #๐Ÿ“Œ ํƒ€๊ฒŸ ํด๋ž˜์Šค ๊ฐ’์ด ๋ณ€ํ™˜์‹œ์— ํ•„์š”! 
iris_lda = lda.transform(iris_scaled) 
print(iris_lda.shape) 
# ์ฐจ์›์ถ•์†Œ๋œ ๋ฐ์ดํ„ฐ์…‹ ๊ฒฐ๊ณผ

(150, 2)

 

 

 

 

 

 

 

 

04. SVD 


๐Ÿ‘€ ๊ฐœ์š” 

 

๐Ÿ’ก Singular value decomposition ํŠน์ด๊ฐ’ ๋ถ„ํ•ด

 

โœ” PCA ์™€ ์œ ์‚ฌํ•œ ํ–‰๋ ฌ ๋ถ„ํ•ด ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋Š” ์ฐจ์›์ถ•์†Œ ๋ฐฉ๋ฒ•์ด๋‹ค. ์ด๋•Œ PCA ๋Š” ์ •๋ฐฉํ–‰๋ ฌ๋งŒ์„ ๊ณ ์œ ๋ฒกํ„ฐ๋กœ ๋ถ„ํ•ดํ•  ์ˆ˜ ์žˆ์œผ๋‚˜, SVD ๋Š” ์ผ๋ฐ˜์ ์ธ ํฌ๊ธฐ๋ฅผ ๊ฐ–๋Š” ํ–‰๋ ฌ์„ ๋ถ„ํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

https://angeloyeo.github.io/2019/08/01/SVD.html

 

โœ” U, V' : singluar vector ๋ผ ๋ถ€๋ฅธ๋‹ค. ๋ชจ๋“  ํŠน์ด๋ฒกํ„ฐ๋Š” ์„œ๋กœ ์ง๊ตํ•˜๋Š” ์„ฑ์งˆ์„ ๊ฐ€์ง„๋‹ค. 

 

โœ” Σ : ๋Œ€๊ฐํ–‰๋ ฌ์˜ ๋ชจ์Šต์„ ๋„๊ณ  ์žˆ์œผ๋ฉฐ 0์ด ์•„๋‹Œ ๊ฐ’์ด ํ–‰๋ ฌ A์˜ ํŠน์ด๊ฐ’์— ํ•ด๋‹นํ•œ๋‹ค. 

 

 

https://angeloyeo.github.io/2019/08/01/SVD.html

 

 

โœ” ์ผ๋ฐ˜์ ์œผ๋กœ Σ ์˜ ๋น„๋Œ€๊ฐ์ธ ๋ถ€๋ถ„๊ณผ ๋Œ€๊ฐ์›์†Œ์ค‘์— ํŠน์ด๊ฐ’์ด 0์ธ ๋ถ€๋ถ„์„ ๋ชจ๋‘ ์ œ๊ฑฐํ•˜๊ณ  ์ œ๊ฑฐ๋œ Σ ์— ๋Œ€์‘๋˜๋Š” U ์™€ V ์›์†Œ๋„ ํ•จ๊ป˜ ์ œ๊ฑฐํ•ด ์ฐจ์›์„ ์ค„์ธ ํ˜•ํƒœ๋กœ SVD ๋ฅผ ์ ์šฉํ•œ๋‹ค. 

 

 

๐Ÿ’ก Truncated SVD

 

โœ” Truncated SVD ๋Š” Σ ์˜ ๋Œ€๊ฐ์›์†Œ ์ค‘์— ์ƒ์œ„ ๋ช‡ ๊ฐœ๋งŒ ์ถ”์ถœํ•˜์—ฌ ์—ฌ๊ธฐ์— ๋Œ€์‘ํ•˜๋Š” U์™€ V์˜ ์›์†Œ๋„ ํ•จ๊ป˜ ์ œ๊ฑฐํ•ด ๋”์šฑ ์ฐจ์›์„ ์ค„์ธ ํ˜•ํƒœ๋กœ ๋ถ„ํ•ดํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. 

 

 

 

๐Ÿ’ก ๋„˜ํŒŒ์ด, ์‚ฌ์ดํŒŒ์ด, ์‚ฌ์ดํ‚ท๋Ÿฐ ๋ชจ๋“ˆ

 

๋„˜ํŒŒ์ด SVD ๋ชจ๋“ˆ from numpy.linalg import svd
์‚ฌ์ดํŒŒ์ด SVD ๋ชจ๋“ˆ from scipy.linalg import svd
์‚ฌ์ดํŒŒ์ด Truncated SVD ๋ชจ๋“ˆ from scipy.sparse.linalg import svds 
์‚ฌ์ดํ‚ท๋Ÿฐ Truncated SVD ํด๋ž˜์Šค  from sklearn.decomposition import TruncatedSVD, PCA

 

 

 


 

 

๐Ÿ“Œ ์‹ค์Šต - iris

 

๐Ÿƒ‍โ™€๏ธ 01. ๋ฐ์ดํ„ฐ ๋กœ๋”ฉ

 

iris = load_iris()
iris_ftrs = iris.data

 

 

๐Ÿƒ‍โ™€๏ธ 02. TruncatedSVD ์ ์šฉ

 

from sklearn.decomposition import TruncatedSVD, PCA 
tsvd = TruncatedSVD(n_components=2) 
tsvd.fit(iris_ftrs) 
iris_tsvd = tsvd.transform(iris_ftrs) 
iris_tsvd

 

 

 

 

  • Scaler + TruncatedSVD = PCA ๊ฒฐ๊ณผ ๐Ÿ‘‰ ๋ฐ์ดํ„ฐ ์„ธํŠธ๊ฐ€ ์Šค์ผ€์ผ๋ง์œผ๋กœ ๋ฐ์ดํ„ฐ ์ค‘์‹ฌ์ด ๋™์ผํ•ด์ง€๋ฉด ์‚ฌ์ดํ‚ท๋Ÿฐ์˜ SVD ์™€ PCA ๋Š” ๋™์ผํ•œ ๋ณ€ํ™˜์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. 

 

 

  • PCA ๋Š” ๋ฐ€์ง‘ํ–‰๋ ฌ์— ๋Œ€ํ•œ ๋ณ€ํ™˜๋งŒ ๊ฐ€๋Šฅํ•˜๊ณ , SVD ๋Š” ํฌ์†Œํ–‰๋ ฌ์— ๋Œ€ํ•œ ๋ณ€ํ™˜๋„ ๊ฐ€๋Šฅํ•˜๋‹ค. 

 

 

๐Ÿ“Œ SVD ํ™œ์šฉ 

 

  • ์ปดํ“จํ„ฐ ๋น„์ „ : ์ด๋ฏธ์ง€ ์••์ถ•์„ ํ†ตํ•œ ํŒจํ„ด ์ธ์‹๊ณผ ์‹ ํ˜ธ์ฒ˜๋ฆฌ ๋ถ„์•ผ 
  • ํ…์ŠคํŠธ : ํ† ํ”ฝ ๋ชจ๋ธ๋ง ๊ธฐ๋ฒ•์ธ LSA์˜ ๊ธฐ๋ฐ˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ํ™œ์šฉ๋จ

 

 

 

05. NMF 


๐Ÿ‘€ ๊ฐœ์š” 

 

๐Ÿ’ก Non Negative Matrix Fatorization

 

โœ” Truncated SVD ์ฒ˜๋Ÿผ ๋‚ฎ์€ ๋žญํฌ (low rank) ๋ฅผ ํ†ตํ•œ ํ–‰๋ ฌ ๊ทผ์‚ฌ ๋ฐฉ์‹์˜ ๋ณ€ํ˜•์ด๋‹ค. 

 

โœ” ์›๋ณธ ํ–‰๋ ฌ ๋‚ด์˜ ๋ชจ๋“  ์›์†Œ ๊ฐ’์ด ๋ชจ๋‘ ์–‘์ˆ˜ (0 ์ด์ƒ) ์ด๋ผ๋Š”๊ฒŒ ๋ณด์žฅ๋˜๋ฉด W์™€ H ๋ผ๋Š” ๋‘ ๊ฐœ์˜ ๊ธฐ๋ฐ˜ ์–‘์ˆ˜ ํ–‰๋ ฌ๋กœ ๋ถ„ํ•ด๋  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋ฒ•์— ํ•ด๋‹นํ•œ๋‹ค. 

 

 

๐Ÿพ ๋ถ„ํ•ด๋œ ํ–‰๋ ฌ์€ '์ž ์žฌ์š”์†Œ' ๋ฅผ ํŠน์„ฑ์œผ๋กœ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค.

 

 

๐Ÿ‘ป W : ์›๋ณธ ํ–‰์— ๋Œ€ํ•ด ์ž ์žฌ์š”์†Œ์˜ ๊ฐ’์ด ์–ผ๋งˆ๋‚˜ ๋˜๋Š”์ง€์— ๋Œ€์‘ 

 

  • ํ–‰ : ์›๋ณธ ๋ฐ์ดํ„ฐ์˜ ํ–‰์˜ ๊ฐœ์ˆ˜์— ํ•ด๋‹น (R1, R2, R3, R4) , ์—ด : ์ž ์žฌ์š”์†Œ์— ํ•ด๋‹น (LF1, LF2) 

 

๐Ÿ‘ป H : ์ž ์žฌ์š”์†Œ๊ฐ€ ์›๋ณธ ์—ด (์›๋ณธ ๋ฐ์ดํ„ฐ์˜ ์†์„ฑ) ๋กœ ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑ๋˜์—ˆ๋Š”์ง€ ๋‚˜ํƒ€๋‚ด๋Š” ํ–‰๋ ฌ 

 

  • ํ–‰ : ์ž ์žฌ์š”์†Œ์— ํ•ด๋‹น (LF1, LF2) , ์—ด : ์›๋ณธ ๋ฐ์ดํ„ฐ์˜ ์—ด์˜ ๊ฐœ์ˆ˜์— ํ•ด๋‹น (C1,...,C6)

 

 


 

 

๐Ÿ“Œ ์‹ค์Šต - iris

 

from sklearn.decomposition import NMF

 

๐Ÿƒ‍โ™€๏ธ 01. ๋ฐ์ดํ„ฐ ๋กœ๋”ฉ

 

iris = load_iris()
iris_ftrs = iris.data

 

๐Ÿƒ‍โ™€๏ธ 02. NMF ์ ์šฉ

 

from sklearn.decomposition import NMF 
nmf = NMF(n_components=2) 
nmf.fit(iris_ftrs) 
iris_nmf = nmf.transform(iris_ftrs)

 

 

 

๐Ÿ“Œ ํ™œ์šฉ

 

  • ์ปดํ“จํ„ฐ ๋น„์ „ : ์ด๋ฏธ์ง€ ์••์ถ•์„ ํ†ตํ•œ ํŒจํ„ด ์ธ์‹๊ณผ ์‹ ํ˜ธ์ฒ˜๋ฆฌ ๋ถ„์•ผ 
  • ํ…์ŠคํŠธ : ํ† ํ”ฝ ๋ชจ๋ธ๋ง ๊ธฐ๋ฒ•, ๋ฌธ์„œ ์œ ์‚ฌ๋„ ๋ฐ ํด๋Ÿฌ์Šคํ„ฐ๋ง
  • ์ถ”์ฒœ ์‹œ์Šคํ…œ : Latent Factoring ๊ธฐ๋ฐ˜ ์ถ”์ฒœ๋ฐฉ์‹ 

 

728x90

๋Œ“๊ธ€