데이터 한 그릇

군집화)DBSCAN 군집화 본문

머신러닝/군집화

군집화)DBSCAN 군집화

장사이언스 2021. 5. 25. 17:09
  • DBSCAN 개요
  • DBSCAN 적용하기

DBSCAN 개요

 

  만일 데이터 셋이  복잡한 기하학적 분포를 가지고 있다면 앞서 살펴봤던 K-MEAN, GMM으로는 효과적인 군집화를 하기 어렵다.  DBSCAN 같은 경우에는 복잡한 기하학적 분포를 가지고 있는 데이터를 군집화할 때 효과적으로 군집화를 수행할 수 있다.

 

  DBSCAN을 구성하는 가장 중요한 두 가지 파라미터는 입실론(epsilon)으로 표기하는 주변 영역과 이 입실론 주변 영역에 포함되는 최소 데이터 개수이다. (입실론 영역, 영역 내 최소 데이터 개수) 데이터 세트 내의 데이터 포인트에 대해서 입실론 내 최소 데이터의 개수에 따라 다르게 정의내린다.

 

  1. 핵심 포인트(core point) : 입신론 주변 영역 내에 최소 데이터 개수 이상의 데이터를 가지고 있을 경우 해당 데이터를 핵심 포인트라고 일컫는다.
  2. 이웃 포인트(Neighbor point) : 주변 영역 내에 위치한 타 데이터를 이웃 포인트라고 한다.
  3. 경계 포인트(Border point) : 주변 영역 내에 최소 데이터 개수를 만족시키고 있지 않지만 해당 데이터의 경계 내에 핵심포인트가 있다면 해당 데이터를 경계 포인트라고 칭한다.
  4. 잡음 포인트(Noise point) : 해당 데이터의 영역 내에 최소 데이터 개수도 충족시키지 못하고 핵심 포인트도 포함하지 못할 경우 해당 데이터를 잡음 데이터로 칭한다.

  다음은 DBSCAN 알고리즘의 원리를 그림으로 나타낸 것이다.

 

 

 

  p1포인터를 중심으로 입신론 주변 영역을 만들었더니 영역 내에 7개의 데이터가 포함되어 있음을 확인할 수 있다. 따라서 최소 데이터 개수를 초과했기 때문에 p1 포인터를 핵심 포인트로 지정한다.

 

 

  p2포인터도 입신론 주변 영역을 만들고 데이터의 개수를 세어 보니 5개 이상의 데이터를 가지고 있다. 따라서 p2도 핵심 포인트라고 할 수 있다. 

 

 

  앞선 그림처럼 핵심 포인트의 이웃 포인트가 핵심 포인트라면 직접 접근이 가능하다. 위의 그림처럼 p1의 이웃 포인트인 p2도 핵심 포인트기 때문에 p1 -> p2로 직접 접근이 가능하다.

 

 

  만일 직접 접근이 가능하다면 두 개의 입신론 영역을 합쳐서 군집화를 진행한다.

 

 

  p3포인트를 기준으로 살펴보면 최소 데이터를 충족하고 있지는 않지만 p2를 포함하고 있음을 알 수 있다. 이는 핵심포인트를 포함하고 있음을 뜻한다. 이러한 포인트를 border 포인트라고 칭한다. 경계 포인트를 군집의 외곽을 형성한다.

 

 

  영역 내에 최소 데이터도 포함하지 못하고, 핵심 포인트도 없을 때, 해당 데이터를 noise point라고 한다.


DBSCAN 적용하기

 

dbscan = DBSCAN(eps = 0.6, min_samples=8, metric='euclidean')
dbscan_labels = dbscan.fit_predict(iris.data)

iris_df['dbscan_cluster'] = dbscan_labels
iris_result = iris_df.groupby(['target'])['dbscan_cluster'].value_counts()

 

  eps는 주로 1 이하를 사용하고 입실론 주변 영역의 반경을 의미한다, min_samples는 위의 알고리즘에서 살펴봤듯이 입실론 내 영역에서 최소 데이터 개수를 의미한다. fit_predict를 통해서 데이터를 군집화한 결과를 반환한다. 그리고 데이터 프레임에 저장하고 그 결과를 target 데이터와 비교해본다.

 

from sklearn.decomposition import PCA

pca = PCA(n_components = 2, random_state = 0)
pca_transformed = pca.fit_transform(iris.data)
iris_df['ftr1'] = pca_transformed[:,0]
iris_df['ftr2'] = pca_transformed[:,1]

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
visualize_cluster_plot(dbscan, iris_df, 'dbscan_cluster', iscenter=False)

 

  이차원의 그림으로 시각화 하기 위해서 차원 축소를 한다.

 

 

  시각화한 결과 label의 종류가 세 가지로 나뉘는 게 아니라, 두 가지로 나뉘고 noise 데이터가 도출 되었다.

 

#복잡한 기하학적 분포를 가지고 있는 데이터

from sklearn.datasets import make_circles
X,y = make_circles(n_samples = 1000, shuffle=True, noise = 0.05, random_state = 0, factor = 0.5)
clusterDF = pd.DataFrame(data = X, columns=['ftr1','ftr2'])
clusterDF['target'] = y
visualize_cluster_plot(None, clusterDF, 'target', iscenter=False)
plt.savefig('cluster_db')

 

    데이터의 분포가 기하학적 모양을 가지고 있는 것을 dbscan을 통해서 분류해보자. 그 전에 데이터를 만드는 과정이다. 밑의 그림은 그 결과이다.

 

 

#kmean

from sklearn.cluster import KMeans

kmeans = KMeans(n_clusters=2,max_iter=1000, random_state=0)
kmeans_labels = kmeans.fit_predict(X)
clusterDF['kmeans_cluster'] = kmeans_labels

visualize_cluster_plot(kmeans, clusterDF, 'kmeans_cluster', iscenter=False)

 

  군집화의 효율을 비교하기 위해서 kmean을 이용하여 군집화를 한 결과이다.

 

from sklearn.mixture import GaussianMixture

gmm = GaussianMixture(n_components = 2, random_state = 0)
gmm_label = gmm.fit(X).predict(X)
clusterDF['gmm_cluster'] = gmm_label

visualize_cluster_plot(gmm,clusterDF, 'gmm_cluster',iscenter=False)

 

  GaussianMixture를 통한 군집화이며 그 결과이다.

 

 

kmeans와 gau 둘 다 본래의 데이터와는 많이 상이한 결과물을 내어놓을 것을 볼 수 있다.

 

from sklearn.cluster import DBSCAN

dbscan = DBSCAN(eps = 0.2, min_samples  = 10, metric  = 'euclidean')
dbscan_labels = dbscan.fit_predict(X)
clusterDF['dbscan_cluster'] = dbscan_labels
visualize_cluster_plot(dbscan, clusterDF, 'dbscan_cluster', iscenter=False)

 

  dbscan 같은 경우에는 복잡한 기하학적 분포를 가지고 있는 데이터를 잘 분류했음을 알 수 있다.

 

'머신러닝 > 군집화' 카테고리의 다른 글

Customer Personality Analysis  (0) 2021.12.08
군집화)평균 이동  (0) 2021.05.26
군집화) GMM(Gaussian Mixture Model)  (0) 2021.05.21
군집화 개요, k-평균 알고리즘  (0) 2021.05.21
Comments