일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- rnn
- numpy
- 감성분석
- Django
- 기술통계학
- 밑바닥부터 시작하는 딥러닝
- 차원축소
- 히스토그램
- 코사인 유사도
- 텍스트 분류
- 가설검정
- 밑바닥부터 시작하는 딥러닝2
- 파이썬 pandas
- 회귀분석
- 기초통계
- 군집화
- 자연어 처리
- Pandas
- student t분포
- 모두의 딥러닝
- 오래간만에 글쓰네
- word2vec
- 결정계수
- 다층 퍼셉트론
- F분포
- 구글 BERT의 정석
- 머신러닝
- 텐서플로2와 머신러닝으로 시작하는 자연어처리
- 최소자승법
- 은준아 화이팅
- Today
- Total
데이터 한 그릇
차원축소(LDA, SVD,NMF) 본문
- LDA
- LDA 실습
- SVD
- SVD 실습
- NMF
- NMF 실습
LDA
LDA(Linear Discriminant Analysis)는 선형 판별 분석법으로 불린다. PCA와 매우 유사하지만 PCA같은 경우 데이터의 변동성이 가장 큰 벡터를 찾았지만 LDA같은 경우에는 타겟 데이터를 잘 분류하기 위해서 결정 값들을 최대한 분류할 수 있는 벡터를 찾는다.
LDA는 특정 공간상에서 결정 값을 분리하는 것을 최대화 하기 위해, 클래스 간 분산(between-class-scatter)과 클래스 내부 분산(within-class-scatter)의 비율을 최대화하는 방식으로 벡터를 찾는다. 비율을 최대화 하기 위해서는 클래스 간 분산을 최대화 시키고 클래스 내부 분산을 최소화 시키면 된다.
결국 LDA는 PCA와 달리 데이터의 변동성이 큰 축을 찾는 것이 아니라 타겟 데이터의 클래스 값들을 최대한 분류할 수 있는 벡터선을 찾는 차원축소 법이며, 최대한 분류를 잘 수행하기 위해서 클래스 간 분산을 최대화하고 클래스 내부 분산을 최소화 한다.
LDA 실습
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import load_iris
iris = load_iris()
iris_df = pd.DataFrame(iris.data, columns = iris.feature_names)
iris_df['target'] = iris.target
아이리스 데이터를 데이터 프레임화하여 불러온다.
scale = StandardScaler()
scaled_iris = scale.fit_transform(iris_df.iloc[:,:-1])
앞서 pca 또한 데이터를 스케일화 해야 했다. lda 또한 마찬가지
Lda = LinearDiscriminantAnalysis(n_components = 2)
iris_lda = Lda.fit_transform(scaled_iris, iris_df['target'])
print(iris_lda.shape)
피처를 두 개로 줄이는 것을 목표로 하여 n_components=2로 설정한다. 그리고 클래스 결정 값을 최대한 잘 분리할 수 있는 벡터를 찾는 것이기 때문에 타겟 데이터도 학습시 넣어주어야 한다.
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
lda_columns = ['lda_component1', 'lda_component2']
lda_df = pd.DataFrame(iris_lda, columns = lda_columns)
lda_df['target'] = iris.target
결과 값을 시각화 하기 이해서 축소된 피처 두 개의 이름을 임의로 지어준다.
#세토사는 세모, 버지컬러는 네모 버지니카는 동그라미
markers = ['^','s','o']
for i,marker in enumerate(markers):
x_axis_data = lda_df[lda_df['target']==i]['lda_component1']
y_axis_data = lda_df[lda_df['target']==i]['lda_component2']
plt.scatter(x_axis_data, y_axis_data, marker = marker, label = iris.target_names[i])
plt.legend()
plt.xlabel('lda_component1')
plt.ylabel('lda_component2')
plt.show()
x축과 y축의 데이터는 축소된 피처들의 값들이여야 한다. 따라서 각 타겟 데이터 별 각 피처의 데이터를 가져온다.
SVD ~ NMF
SVD 또한 PCA와 유사한 차원 축소 기법이라고 할 수 있다. 하지만 가장 큰 차이점 또한 존재하는데, PCA는 정방 행렬에만 사용되는 반면에 SVD는 행과 열의 개수가 달라도 사용이 될 수 있다. 일반적으로 SVD는 m x n 크기의 행렬 A를 다음과 같이 분해하는 것을 의미한다.
$$A = U\sum V^{T}$$
@@선형대수를 할 줄을 모르니 선형대수를 공부하고 이 부분을 보충하도록 하겠다.@@
'머신러닝 > 차원 축소' 카테고리의 다른 글
차원 축소 개요와 PCA개요 (0) | 2021.05.06 |
---|