1. K-means Clustering
개념
- 정의: k-means는 데이터를 k개의 군집으로 나누는 군집화 알고리즘입니다.
- 작동 원리:
- k개의 중심을 랜덤으로 설정.
- 각 데이터 포인트를 가장 가까운 군집 중심에 할당.
- 각 군집 중심을 갱신(해당 군집 데이터의 평균).
- 군집 중심이 변하지 않을 때까지 반복.
최적의 k 결정
- 엘보우 방법:
- k에 따른 Inertia(군집 응집도)를 계산.
- 그래프에서 Inertia가 급격히 줄어드는 지점이 최적의 k.
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
# 엘보우 방법
inertia = []
for k in range(1, 11):
kmeans = KMeans(n_clusters=k)
kmeans.fit(X_scaled)
inertia.append(kmeans.inertia_)
plt.plot(range(1, 11), inertia, 'bx-')
plt.title('Elbow Method')
plt.xlabel('k')
plt.ylabel('Inertia')
plt.show()
시각화 예시
- 군집 분포를 2D로 시각화
sns.scatterplot(x=X['Age'], y=X['Spending Score (1-100)'], hue=labels, palette='viridis')
2. 계층적 군집화 (Hierarchical Clustering)
개념
- 정의: 데이터 포인트를 계층적으로 병합(Agglomerative)하거나 분할(Divisive)하여 군집을 형성.
- 덴드로그램: 군집화 과정을 시각화한 나무 형태의 그래프.
알고리즘
- 병합 군집화(Agglomerative Clustering):
- 각 데이터를 독립적인 군집으로 시작.
- 가까운 군집끼리 반복적으로 병합.
- 분할 군집화(Divisive Clustering):
- 모든 데이터를 하나의 군집으로 시작.
- 반복적으로 가장 멀리 떨어진 데이터를 분할.
from scipy.cluster.hierarchy import dendrogram, linkage
# 덴드로그램 생성
plt.figure(figsize=(10, 7))
dendrogram(linkage(X_scaled, method='ward'))
plt.title('Dendrogram')
plt.show()
3. DBSCAN
개념
- 정의: 밀도 기반의 군집화 알고리즘으로, 밀도가 높은 영역을 군집으로 간주하고, 노이즈는 제외.
- 핵심 매개변수:
- eps: 군집으로 묶일 수 있는 두 데이터 포인트 간 최대 거리.
- min_samples: 군집이 형성되기 위한 최소 데이터 포인트 수.
작동 원리
- 임의 데이터 포인트 선택.
- eps 반경 내 데이터 점수를 확인.
- min_samples 이상일 경우 군집 형성, 미만일 경우 노이즈 처리.
- 군집 내 데이터로부터 다시 탐색.
from sklearn.cluster import DBSCAN
dbscan = DBSCAN(eps=5, min_samples=5)
clusters = dbscan.fit_predict(X_scaled)
sns.scatterplot(x=X['Annual Income (k$)'], y=X['Spending Score (1-100)'], hue=clusters, palette='viridis')
그래도 한번 보고 코드로 visualization 을 간단히 구현해보았다
시각화 예시
- 군집 분포를 2D로 시각화
sns.scatterplot(x=X['Age'], y=X['Spending Score (1-100)'], hue=labels, palette='viridis')
알고리즘
- 병합 군집화(Agglomerative Clustering):
- 각 데이터를 독립적인 군집으로 시작.
- 가까운 군집끼리 반복적으로 병합.
- 분할 군집화(Divisive Clustering):
- 모든 데이터를 하나의 군집으로 시작.
- 반복적으로 가장 멀리 떨어진 데이터를 분할.
from scipy.cluster.hierarchy import dendrogram, linkage
# 덴드로그램 생성
plt.figure(figsize=(10, 7))
dendrogram(linkage(X_scaled, method='ward'))
plt.title('Dendrogram')
plt.show()
3. DBSCAN
개념
- 정의: 밀도 기반의 군집화 알고리즘으로, 밀도가 높은 영역을 군집으로 간주하고, 노이즈는 제외.
- 핵심 매개변수:
- eps: 군집으로 묶일 수 있는 두 데이터 포인트 간 최대 거리.
- min_samples: 군집이 형성되기 위한 최소 데이터 포인트 수.
작동 원리
- 임의 데이터 포인트 선택.
- eps 반경 내 데이터 점수를 확인.
- min_samples 이상일 경우 군집 형성, 미만일 경우 노이즈 처리.
- 군집 내 데이터로부터 다시 탐색.
from sklearn.cluster import DBSCAN
dbscan = DBSCAN(eps=5, min_samples=5)
clusters = dbscan.fit_predict(X_scaled)
sns.scatterplot(x=X['Annual Income (k$)'], y=X['Spending Score (1-100)'], hue=clusters, palette='viridis')
그래도 한번 보고 코드로 Visualization 을 간단히 구현해보았다
import numpy as np
import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans, DBSCAN
import matplotlib.pyplot as plt
from scipy.cluster.hierarchy import dendrogram, linkage
import seaborn as sns
# Sample data: Creating a simulated dataset
np.random.seed(42)
X = np.random.rand(100, 2) * 100 # 100 points in a 2D space
# Scale data
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# K-means clustering
kmeans = KMeans(n_clusters=3, random_state=42)
kmeans_labels = kmeans.fit_predict(X_scaled)
# Agglomerative Clustering - Dendrogram
linkage_matrix = linkage(X_scaled, method='ward')
# DBSCAN clustering
dbscan = DBSCAN(eps=0.5, min_samples=5)
dbscan_labels = dbscan.fit_predict(X_scaled)
# Visualizations
# K-means Clustering
plt.figure(figsize=(10, 7))
plt.scatter(X_scaled[:, 0], X_scaled[:, 1], c=kmeans_labels, cmap='viridis', s=50)
plt.title("K-means Clustering")
plt.xlabel("Feature 1")
plt.ylabel("Feature 2")
plt.savefig("/mnt/data/kmeans_clustering.svg")
# Dendrogram
plt.figure(figsize=(10, 7))
dendrogram(linkage_matrix)
plt.title("Hierarchical Clustering Dendrogram")
plt.xlabel("Sample Index")
plt.ylabel("Distance")
plt.savefig("/mnt/data/dendrogram.svg")
# DBSCAN Clustering
plt.figure(figsize=(10, 7))
plt.scatter(X_scaled[:, 0], X_scaled[:, 1], c=dbscan_labels, cmap='viridis', s=50)
plt.title("DBSCAN Clustering")
plt.xlabel("Feature 1")
plt.ylabel("Feature 2")
plt.savefig("/mnt/data/dbscan_clustering.svg")
# File paths to share with the user
kmeans_path = "/mnt/data/kmeans_clustering.svg"
dendrogram_path = "/mnt/data/dendrogram.svg"
dbscan_path = "/mnt/data/dbscan_clustering.svg"
kmeans_path, dendrogram_path, dbscan_path
비지도 학습 : 차원 축소 기법 (PCA, t-SNE, LDA)
1. PCA (Principal Component Analysis, 주성분 분석)
원리
- 데이터 표준화: 평균 0, 분산 1로 정규화.
- 공분산 행렬 계산: 데이터의 특성 간 상관관계 분석.
- 고유값 및 고유벡터 계산: 데이터의 분산을 최대한 설명하는 주성분 결정.
- 주성분 선택: 분산을 많이 설명하는 주성분 순으로 정렬.
- 데이터 변환: 선택된 주성분을 사용해 저차원 공간으로 변환.
장점
- 계산 속도가 빠르고 구현이 간단함.
- 데이터의 분산을 최대한 보존.
- 노이즈 제거 및 데이터 시각화에 적합.
단점
- 선형적인 변환만 수행, 비선형 데이터 구조를 잘 표현하지 못함.
- 데이터의 해석력이 떨어질 수 있음(주성분 자체가 원래 특성과 직접적으로 연관되지 않음).
사용 사례
- 시각화: 고차원 데이터를 2D/3D로 변환.
- 노이즈 제거: 정보 손실을 최소화하며 차원 축소.
- 특징 선택: 머신러닝 모델에서 불필요한 특성 제거.
실습 예시
from sklearn.decomposition import PCA
pca = PCA(n_components=2) # 2개의 주성분 선택
X_pca = pca.fit_transform(X_scaled)
결과 시각화
plt.scatter(X_pca[:, 0], X_pca[:, 1], c=y, cmap='viridis')
plt.title("PCA Result")
plt.xlabel("Principal Component 1")
plt.ylabel("Principal Component 2")
plt.show()
2. t-SNE (t-Distributed Stochastic Neighbor Embedding)
원리
- 고차원 유사성 계산: 데이터 포인트 간의 유사성을 확률로 변환.
- 저차원 유사성 계산: 저차원에서 t-분포를 사용해 유사성을 표현.
- KL 발산 최소화: 고차원과 저차원의 확률 분포 차이를 줄이도록 데이터 위치 최적화.
- 반복 최적화: 유사성 보존을 위해 데이터 위치 반복 조정.
장점
- 비선형 데이터 구조(클러스터, 패턴 등)를 잘 표현.
- 데이터의 군집을 효과적으로 시각화.
단점
- 계산 복잡도가 높아 큰 데이터셋에 느림.
- 출력이 매번 다를 수 있음(랜덤 초기화).
- 과적합 위험 및 해석이 어렵다.
사용 사례
- 시각화: MNIST와 같은 이미지 데이터의 군집을 2D/3D로 변환.
- 클러스터 분석: 고차원에서의 군집 경향 확인.
실습 예시
from sklearn.manifold import TSNE
tsne = TSNE(n_components=2, random_state=42)
X_tsne = tsne.fit_transform(X_scaled)
결과 시각화
plt.scatter(X_tsne[:, 0], X_tsne[:, 1], c=y, cmap='viridis')
plt.title("t-SNE Result")
plt.xlabel("t-SNE Component 1")
plt.ylabel("t-SNE Component 2")
plt.show()
3. LDA (Linear Discriminant Analysis, 선형 판별 분석)
원리
- 클래스별 평균 계산: 각 클래스의 중심을 계산.
- 클래스 내 분산 행렬 계산: 클래스 내부의 데이터 분산 측정.
- 클래스 간 분산 행렬 계산: 클래스 중심 간의 분산 측정.
- 판별 축 계산: 클래스 간 분산을 최대화하고, 클래스 내 분산을 최소화하는 선형 판별 축 선택.
- 데이터 변환: 판별 축을 기준으로 데이터 변환.
장점
- 차원 축소와 분류를 동시에 수행.
- 클래스 간 분포를 강조하여 분류 성능을 높임.
- 저차원 공간에서 데이터의 패턴이 명확하게 보임.
단점
- 선형 관계 가정(비선형 분포는 잘 처리하지 못함).
- 클래스 간 분산이 비슷해야 효과적.
사용 사례
- 분류 문제: 클래스 레이블이 있는 데이터에서 분류 성능 향상.
- 차원 축소: 데이터 시각화 및 분석.
실습 예시
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
lda = LinearDiscriminantAnalysis(n_components=2)
X_lda = lda.fit_transform(X_scaled, y)
결과 시각화
plt.scatter(X_lda[:, 0], X_lda[:, 1], c=y, cmap='viridis')
plt.title("LDA Result")
plt.xlabel("LDA Component 1")
plt.ylabel("LDA Component 2")
plt.show()
차이점 요약
기법 데이터 관계 주요 목적 출력 차원 사용 사례
PCA | 선형 관계 | 분산 최대화 | 95% 분산 이상 | 시각화, 노이즈 제거, 특징 선택 |
t-SNE | 비선형 관계 | 유사성 보존 | 2D/3D | 군집 시각화, 패턴 탐지 |
LDA | 선형 관계 | 분류 성능 향상 | 클래스-1 | 분류, 클래스 분석 |
# Re-import libraries and recreate the plots after state reset
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
from sklearn.manifold import TSNE
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import make_classification
# Generate simulated data
X, y = make_classification(n_samples=300, n_features=10, n_classes=3, n_informative=5, random_state=42)
# Standardize the data
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# PCA
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X_scaled)
plt.figure(figsize=(8, 6))
plt.scatter(X_pca[:, 0], X_pca[:, 1], c=y, cmap='viridis', s=50)
plt.title("PCA Result")
plt.xlabel("Principal Component 1")
plt.ylabel("Principal Component 2")
plt.savefig("/mnt/data/pca_result.svg")
# t-SNE
tsne = TSNE(n_components=2, random_state=42)
X_tsne = tsne.fit_transform(X_scaled)
plt.figure(figsize=(8, 6))
plt.scatter(X_tsne[:, 0], X_tsne[:, 1], c=y, cmap='viridis', s=50)
plt.title("t-SNE Result")
plt.xlabel("t-SNE Component 1")
plt.ylabel("t-SNE Component 2")
plt.savefig("/mnt/data/tsne_result.svg")
# LDA
lda = LinearDiscriminantAnalysis(n_components=2)
X_lda = lda.fit_transform(X_scaled, y)
plt.figure(figsize=(8, 6))
plt.scatter(X_lda[:, 0], X_lda[:, 1], c=y, cmap='viridis', s=50)
plt.title("LDA Result")
plt.xlabel("LDA Component 1")
plt.ylabel("LDA Component 2")
plt.savefig("/mnt/data/lda_result.svg")
# File paths
pca_path = "/mnt/data/pca_result.svg"
tsne_path = "/mnt/data/tsne_result.svg"
lda_path = "/mnt/data/lda_result.svg"
pca_path, tsne_path, lda_path
'[Machine Learning]' 카테고리의 다른 글
[Machine Learning] Ensemble Learning 간단 정리 (0) | 2024.12.11 |
---|---|
[Machine Learing] SVM, KNN, Naive Bayes, Decision Tree 정리 (2) | 2024.12.09 |
[Machine Learning] Regression(회귀) 정리 (3) | 2024.12.06 |
[Machine Learning] Data cleaning 과 Data Preprocessing 정리 (2) | 2024.12.05 |