OkBublewrap

군집화(Clustering)(1) 본문

Python/학습용

군집화(Clustering)(1)

옥뽁뽁 2022. 12. 10. 23:32

: 비지도 학습의 일종으로 고객분류, 차원 축소, 이상치 탐지, 준지도학습, 이미지 검색, 이미지 분할으로 쓰인다.

 

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');

iris(pca = 2, MinMaxScale)

# 군집분석(군집 수 = 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