일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- 블레이드 템플릿
- AWS
- laravel
- mariadb
- Go
- For
- nodejs
- rabbitmq
- Machine Learning
- Switch
- 기초 수학
- php
- SQL
- Babel
- NCP
- nginx
- Node
- deep learning
- phpredis
- fastapi
- docker
- React
- linux
- CentOS
- Redux
- javascript
- Backbone.js
- Redis
- webpack
- python
- Today
- Total
개발일기
기초 수학 - PCA(주성분 분석) 본문
PCA(주성분 분석)
PCA(Principal Component Analysis)는 다차원으로 구성된 데이터를 분석할 때 사용하는 머신러닝 알고리즘이다. 데이터는 기본적으로 여러 차원으로 구성되어 있다. 각 차원은 데이터의 특성을 담고 있는데 상대적으로 덜 중요한 데이터를 담고 있는 차원이 존재한다. 이와 반대로 중요한 데이터를 담고 있는 차원 또한 존재한다. PCA는 덜 중요한 차원의 데이터를 압축하여 차원을 축소시켜 나간다. 이 과정을 통해 생성된 새로운 데이터 세트는 중요한 데이터를 압축하여 담고 있으며 데이터 분석을 진행할 때 효율적으로 분석을 진행할 수 있다. 쉽게 말하면 10차원 데이터를 3차원으로 축소시켜 표현한다고 할 수 있다.
Iris 예제
Sklearn에서 제공하는 데이터 셋으로 PCA를 이해를 도울 수 있다. 기본 제공되는 데이터 세트에서 붓꽃 데이터를 통해 확인해보자.
from sklearn import datasets
iris = datasets.load_iris() # 붓꽃관련 데이터 세트
print("Shape: ", iris.data.shape) # 데이터 차원 확인
print("Features: ", iris.get('feature_names')) # 특성 이름(열 이름)
"""
Shape: (150, 4)
Features: ['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']
"""
sklearn을 통해 데이터 세트를 가져온다. 이 데이터 세트는 3가지 붓꽃에 대해 4개의 특성을 가진 데이터 샘플로 구성되어 있다.
data.shape: 데이터 세트의 차원을 출력한다. (150, 4)가 나오는데 150행 4열로 데이터로 구성되어 있다는 뜻이며 열은 데이터의 특성이고 행은 데이터 묶음이다. 즉 A라는 꽃에 각 열에 해당하는 특성이 존재하며 이러한 꽃의 종류가 150개가 있다는 의미이다.
get(’feature_names’): 데이터 세트의 특성을 출력한다. 총 4개가 나오는데 데이터 세트의 열 개수와 동일하다. 여기서 sepal은 꽃받침, petal은 꽃잎을 의미한다.
이제 데이터를 2개의 주성분으로 표현하고자 한다. 주성분을 2개로 설정하면 x, y 그래프로 시각화 할 수 있어 데이터 분석이 용이하기에 2개로 설정한다.
PCA 적용
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
pca = PCA(n_components=2) # 2개의 주성분
X = pca.fit_transform(iris.data) # PCA 알고리즘 적용
print("PCA Shape: ", X.shape) # PCA 적용된 차원
print(X[0:10, :]) # 데이터
print(plt.scatter(X[:, 0], X[:, 1])) # iris.data[0:10, :] # 10개의 붓꽃 데이터
"""
PCA Shape: (150, 2)
[[-2.68412563 0.31939725]
[-2.71414169 -0.17700123]
[-2.88899057 -0.14494943]
[-2.74534286 -0.31829898]
[-2.72871654 0.32675451]
[-2.28085963 0.74133045]
[-2.82053775 -0.08946138]
[-2.62614497 0.16338496]
[-2.88638273 -0.57831175]
[-2.6727558 -0.11377425]]
"""
주요한 성분 2개로 데이터 특성을 압축하니 2차원으로 데이터가 축소된다. 데이터를 출력하면 2개의 열만 나오는 것을 확인할 수 있다. 또한 그래프로 출력하면 150개의 데이터가 x, y 좌표에 표시된다. 그래프에 나타난 데이터를 기반으로 데이터의 타겟을 예측할 수 있지만 간단하게 색상을 추가하여 어떤 타겟을 나타내는지 확인해보자.
타겟 분류
print("Target Name: ", iris.target_names)
print(plt.scatter(X[:, 0], X[:, 1], c=iris.target))
"""
Target Name: ['setosa' 'versicolor' 'virginica']
"""
Iris의 타겟은 세 종류로 정해져있다. 한 종류당 50개의 데이터 샘플을 가지며 순서대로 나열되어 있다. 2개의 주성분으로 3종류의 붓꽃을 일정한 패턴이 보이도록 분류할 수 있다.
참고 사이트:
https://scikit-learn.org/stable/auto_examples/datasets/plot_iris_dataset.html
https://www.datacamp.com/tutorial/principal-component-analysis-in-python
https://colab.research.google.com/drive/1l3ITSIU7zqv1sFEM5zlkvO6Nf24yNx-g?usp=sharing
'Deep Learning, Machine Learning > 기초 수학' 카테고리의 다른 글
기초 수학 - 델타 논법을 통한 미분 계수 구하기 (0) | 2024.05.26 |
---|---|
기초 수학 - 미분(Differential)의 개념 (0) | 2024.05.18 |
기초 수학 - Moore Penrose Pseudo Inverse 유사 역행렬 (0) | 2024.04.21 |
기초 수학 - 특이값 분해(SVD)를 활용한 이미지 압축 (0) | 2024.04.20 |
기초 수학 - 특이값 분해(SVD) (0) | 2024.04.13 |