#title Python - DBSCAN(Density-Based spatial clustering of applications with noise) [[TableOfContents]] ==== 개요 ==== DBSCAN(min_sample, eps)은 군집 알고리즘이고, 매개변수가 2개다. * min_sample * eps 동작은 다음과 같다. 1. 랜덤으로 데이터 포인트를 뽑고, 데이터 포인트에서 eps(epsilon)의 거리(기본값은 유클리디안 거리)안에 데이터 포인트를 찾는다. 1. 만약 찾은 포인트가 min_sample수보다 적으면 noise로 처리하고, min_sample보다 많으면 새로운 클러스터 레이블 할당 1. 새로운 클러스터에 할당된 포인트들의 eps 거리 안의 모든 이웃을 찾아서 클러스터 레이블이 할당되지 않았다면 현재의 클러스터에 포함시킨다. 1. 더 이상 데이터 포인가 없으면 클러스터 레이블이 할당되지 않은 데이터 포인트들에 대해 1~3 반복 장점 * k-means 마냥 k를 결정하지 않아도 된다. * 매개변수(min_sample, eps)를 잘 조절하면 다른 클러스터링 방법보다 우수한 결과를 얻을 수 있다. 단점 * 좀 느리다. * 클러스터가 많이 생길 수 있다. --> eps, min_sample을 잘 조절해야 한다. ==== 예제 ==== {{{ #two_moon 데이터 셋 from sklearn.datasets import make_moons import pandas as pd X, y = make_moons(n_samples=200, noise=0.05, random_state=0) df = pd.DataFrame(X, columns=["x", "y"]) df["group"] = y df[:5] #import matplotlib.pyplot as plt #plt.scatter(x=df.x, y=df.y, c=df.group) #: 여기부터 import matplotlib.pyplot as plt plt.scatter(x=df.x, y=df.y, c=df.group) fig, ax = plt.subplots() colors = {1:'red', 0:'blue'} grouped = df.groupby('group') for key, group in grouped: group.plot(ax=ax, kind='scatter', x='x', y='y', label=key, color=colors[key]) plt.show() #: 여기까지 한번에 실행 #표준화(평균=0, 분산=1) from sklearn.preprocessing import StandardScaler scale = StandardScaler() scale.fit(df[["x", "y"]]) scaled_X = scale.transform(df[["x", "y"]]) df["scaled_x"] = scaled_X[:,0] df["scaled_y"] = scaled_X[:,1] #DBSCAN from sklearn.cluster import DBSCAN dbscan = DBSCAN(eps=0.5, min_samples=5) #기본값이다. cluster = dbscan.fit_predict(scaled_X) df["cluster"] = cluster #clustering 결과 확인 plt.scatter(x=df.scaled_x, y=df.scaled_y, c=df.cluster) plt.xlabel("x") plt.ylabel("y") }}} 결과 attachment:DBSCAN/dbscan.png ==== 참고 ==== * https://www.naftaliharris.com/blog/visualizing-dbscan-clustering/ --> DBSCAN이 어떻게 동작하는지 애니매이션으로 볼 수 있다.