Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 | 30 |
Tags
- 합성곱 신경망
- NumPy
- Design Pattern
- numpy 기초
- 기계학습
- 디자인 패턴
- 넘파이 배열
- 데이터 분석
- java
- 코드트리
- python
- ack
- Machine Learning
- 데이터 마이닝
- 코테
- cpp class
- 네트워크 기초
- OOP
- 넘파이
- lambda
- c++
- 코딩테스트실력진단
- 차원축소
- 클러스터링
- 넘파이 기초
- 파이썬
- 코딩테스트
- 머신러닝
- 자바
- cpp
Archives
- Today
- Total
준비하는 대학생
[기계학습] 차원축소 - LDA 본문
LDA란?
LDA(Linear Discriminant Analysis)는 선형 판별 분석법으로 PCA와 비슷합니다.
LDA는 입력데이터의 차원을 축소하는 것이 PCA와 비슷하지만 LDA는 지도학습의 분류에 사용하기 쉽게 개별 클래스를 분별할 수 있는 기준을 최대한 유지하면서 축소합니다.
PCA는 데이터의 변동성이 가장 큰 축을 찾았다면 LDA는 데이터의 결정 클래스를 최대한으로 분리할 수 있는 축을 찾는 것입니다.
LDA는 특정 공간 내 클래스를 최대로 분리할 수 있는 축을 찾기 위해 클래스간 분산과 클래스 내부 분산의 비율을 최대화 하는 방식으로 차원을 축소합니다. 즉, 같은 클래스 끼리는 뭉쳐있고, 다른 클래스와의 거리를 최대화 하게 하여 분류하기 쉬운 차원으로 축소하는 것입니다.
LDA를 구하는 방법
- 클래스 내부와 클래스 간 분산 행렬을 구합니다. (두개의 행렬은 입력 데이터의 결정 값 클래스 별로 개별 종속변수의 평균 백터를 기반으로 함)
- 두 행렬을 고유백터로 분해합니다.
$$ S_W^TS_B = [e_1 ... e_n]\begin{bmatrix}\lambda_1 & \cdots & 0 \\ \vdots & \ddots & \vdots \\ 0 & \cdots & \lambda_n \end{bmatrix}\begin{bmatrix}e_1^T \\ \vdots \\ e_n^T \end{bmatrix} \\ S_W : 클래스\ 내부\ 분산\ 행렬 \\ S_b:클래스\ 간\ 분산\ 행렬 $$
- 고유값이 가장 큰 순으로 K개(LDA에서 정한 차수)를 추출합니다.
- 고유값이 가장 큰 순으로 추출된 고유벡터를 이용해 새롭게 데이터를 변환합니다.
예시 코드
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import load_iris
import pandas as pd
import matplotlib.pyplot as plt
iris = load_iris()
iris_scaled = StandardScaler ().fit_transform(iris.data)
Ida = LinearDiscriminantAnalysis (n_components=2)
Ida.fit(iris_scaled, iris.target)
iris_Ida= Ida. transform(iris_scaled)
Ida_columns = ['lda_component_1', 'lda_component_2']
irisDF_Ida = pd.DataFrame(iris_Ida, columns=Ida_columns)
irisDF_Ida['target'] = iris.target
markers = ['^', 's', 'o']
for i, marker in enumerate(markers):
x_axis_data = irisDF_Ida[irisDF_Ida['target']==i]['lda_component_1']
y_axis_data = irisDF_Ida[irisDF_Ida['target']==i]['lda_component_2']
plt.scatter(x_axis_data, y_axis_data, marker=marker, label=iris.target_names[i])
plt.legend()
plt.xlabel('lda_component_1')
plt.ylabel('lda_component_2')
plt.show()
LDA로 변환된 iris 데이터를 확인해보면 클래스별로 군집화 되어있고 서로 떨어져 있는 것을 확인 할 수 있습니다.
'Programming > Machine learning' 카테고리의 다른 글
[기계학습] 평가지표 (0) | 2023.06.19 |
---|---|
[기계학습] 로지스틱 회귀 (Logistic Regression) (0) | 2023.06.09 |
[기계학습] 선형회귀 모델 (2) | 2023.06.09 |
[기계학습] 에이다부스트, 그래디언트 부스트 (0) | 2023.06.08 |
[기계학습] 앙상블 학습 - 랜덤포레스트(Random Forest) (0) | 2023.06.08 |
Comments