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 | 31 |
Tags
- 티스토리챌린지
- 미세먼지
- 회귀분석
- hackerrank
- 중회귀모형
- 파이썬 철저입문
- 스파르타코딩
- 웹 스크랩핑
- SQL
- wil
- harkerrank
- 파이썬
- 파이썬 머신러닝 완벽가이드
- 실전 데이터 분석 프로젝트
- 파이썬 머신러닝 완벽 가이드
- R
- 텍스트 분석
- 내일배움카드
- 내일배움
- 파이썬 철저 입문
- 오블완
- Cluster
- 스파르타
- 파이썬 완벽 가이드
- 프로그래머스
- 내일배움캠프
- TiL
- 스파르타 코딩
- 프로젝트
- MySQL
Archives
- Today
- Total
OkBublewrap
군집화(Clustering)(1) 본문
: 비지도 학습의 일종으로 고객분류, 차원 축소, 이상치 탐지, 준지도학습, 이미지 검색, 이미지 분할으로 쓰인다.
K-means 알고리즘
: 특정한 임의의 지점을 선택해 그 중심으로 가장 가까운 개체를 선택하는 알고리즘
장점 : 일반적인 군집화에서 가장 많이 활용되는 알고리즘, 알고리즘이 쉽고 간결
단점 : 거리 기반 알고리즘으로 속성의 개수가 많으면 정확도가 떨어진다, 반복횟수가 많을 수록 수행시간 느려진다,
몇 개의 군집을 선택할지 어렵다.
# 거리기반이므로 scale
from sklearn.preprocessing import scale
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
import pandas as pd
%matplotlib inline
# iris data
from sklearn.datasets import load_iris
iris = load_iris()
# 컬럼명 cm 제거
iris.feature_names = [name[:-5] for name in iris.feature_names]
iris.feature_names
# iris dataframe
irisDF = pd.DataFrame(data = iris.data, columns = iris.feature_names)
# y 값 지정
irisY = pd.DataFrame(iris.target, columns = ['target'])
# 스케일링
from sklearn.preprocessing import MinMaxScaler
mms = MinMaxScaler()
mms.fit(irisDF)
irisDF_scale = mms.transform(irisDF)
irisDF_scale_DF = pd.DataFrame(irisDF_scale, columns = iris.feature_names)
# 2개의 주성분으로 충분히 설명이 가능했다.
from sklearn.decomposition import PCA
pca_columns = ['pca_1','pca_2']
pca = PCA(n_components = 2)
iris_pca = pca.fit_transform(irisDF_scale_DF)
iris_pca_df = pd.DataFrame(iris_pca, columns = pca_columns)
# 시각화
sns.scatterplot(data = iris_pca_df, x = 'pca_1', y = 'pca_2', color = 'red');
# 군집분석(군집 수 = 3)
kmeans = KMeans(n_clusters = 3, random_state = 2022)
kmeans.fit(iris_pca_df)
# 군집화 중심점
km_centers = kmeans.cluster_centers_
km_centers
# 군집분류한거 데이터프레임
iris_pca_df['cluster'] = kmeans.labels_
# 시각화
plt.scatter(x = 'pca_1', y = 'pca_2', c = 'cluster', data = iris_pca_df)
plt.xlabel('PCA 1')
plt.ylabel('PCA 2')
plt.scatter(x = km_centers[:,0], y = km_centers[:,1], c = 'r', marker = '^', s = 200)
plt.show()
max_iter = 300으로 진행한 그래프이다. max_iter = 1000으로 진행을 했으나 차이가 없다. 초록색부분 노란색 부분에 군집이 애매한 것 처럼 보인다.
# 군집화 중심점
km_centers = kmeans.cluster_centers_
km_centers
# array([[-0.61842447, 0.06858548],
# [ 0.15096477, -0.12251002],
# [ 0.55672749, 0.10368812]])
cluster 0 : (-0.61842447, 0.06858548)
cluster 1 : (0.15096477, -0.12251002)
cluster 2 : (0.55672749, 0.10368812)
# 실제데이터와 k-means 중심점
plt.scatter(x = 'pca_1', y = 'pca_2', c = 'y_label', data = iris_pca_df)
plt.xlabel('PCA 1')
plt.ylabel('PCA 2')
plt.scatter(x = km_centers[:,0], y = km_centers[:,1], c = 'r', marker = '^', s = 200)
plt.show()
초록색, 노락색 부분은 거리로는 나누기 힘든 위치인 것을 확인할 수 있다. 군집 수를 증가 시키면 어떨까?
ks = range(1,10)
inertias = []
for k in ks:
model = KMeans(n_clusters=k)
model.fit(iris_pca_df)
inertias.append(model.inertia_)
# Plot ks vs inertias
plt.figure(figsize=(4, 4))
plt.plot(ks, inertias, '-ro')
plt.xlabel('number of clusters, k')
plt.ylabel('inertia')
plt.xticks(ks)
plt.show()
군집수는 3개로 지정해야 올바른 것으로 보인다. 여기서 inerita는 중심점으로 평균제곱거리합이다. 높다고 좋은 것이 아니고 작다고 또 좋은 것은 아니다.
'Python > 학습용' 카테고리의 다른 글
군집화(cluster)(3) (0) | 2022.12.12 |
---|---|
군집화(cluster)(2) (0) | 2022.12.11 |
LDA(선형판별분석) (1) | 2022.12.06 |
주성분분석(PCA) (0) | 2022.12.06 |
로지스틱 회귀분석 (0) | 2022.12.04 |