Введение в DBSCAN
Алгоритм кластеризации на основе плотности Его самым большим преимуществом является то, что он может находить кластеры произвольной формы, в то время как традиционные алгоритмы кластеризации могут использовать только кластеры с выпуклой выборкой.
Два параметра:
Радиус окрестности R и минимальное количество точек minpoints. Когда количество точек в пределах радиуса окрестности R больше, чем минимальное количество точек minpoints, она плотная.
Дополнение: Рассчитайте радиус R исходя из опыта
По полученному множеству k-расстояний E всех точек множество E сортируется в порядке возрастания, чтобы получить множество k-расстояний E'.Необходимо подогнать график изменения k-расстояний в отсортированном E' установите, а затем нарисуйте кривую , посредством наблюдения значение k-расстояния, соответствующее положению, где происходит резкое изменение, определяется как значение радиуса Eps.
3 типа точек: основные точки, граничные точки и точки шума.
Количество точек выборки в пределах радиуса окрестности R больше или равно minpoints, называется базовой точкой. Точка, которая не принадлежит центральной точке, но находится в пределах окрестности центральной точки, называется граничной точкой. То, что не является ни центральной точкой, ни граничной точкой, является точкой шума.
экземпляр sklearn
Создание точек выборки
import numpy as np
import pandas as pd
from sklearn import datasets
%matplotlib inline
X,_ = datasets.make_moons(500,noise = 0.1,random_state=1)
df = pd.DataFrame(X,columns = ['feature1','feature2'])
df.plot.scatter('feature1','feature2', s = 100,alpha = 0.6, title = 'dataset by make_moon')
Вызов интерфейса dbscan для завершения кластеризации
from sklearn.cluster import dbscan
# eps为邻域半径,min_samples为最少点数目
core_samples,cluster_ids = dbscan(X, eps = 0.2, min_samples=20)
# cluster_ids中-1表示对应的点为噪声点
df = pd.DataFrame(np.c_[X,cluster_ids],columns = ['feature1','feature2','cluster_id'])
df['cluster_id'] = df['cluster_id'].astype('i2')
df.plot.scatter('feature1','feature2', s = 100,
c = list(df['cluster_id']),cmap = 'rainbow',colorbar = False,
alpha = 0.6,title = 'DBSCAN cluster result')
Пример, который я изменил сам, лучше для понимания
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn import datasets
%matplotlib inline
#生成数据
X=np.empty((100,2))
X[:,0]=np.random.uniform(0.,100.,size=100)
X[:,1]=0.75*X[:,0]+3+np.random.normal(0,10,size=100)
plt.scatter(X[:,0],X[:,1])
plt.show()
df=pd.DataFrame(X,columns=['feature1','feature2'])
df.plot.scatter('feature1','feature2')
print(df)
#调用DBSCAN接口完成聚类
from sklearn.cluster import dbscan
# eps为邻域半径,min_samples为最少点数目
core_samples,cluster_ids = dbscan(X, eps = 10, min_samples=3)
df = pd.DataFrame(np.c_[X,cluster_ids],columns = ['feature1','feature2','cluster_id'])
# df['cluster_id'] = df['cluster_id'].astype('i2') #这个有啥用啊
df.plot.scatter('feature1','feature2', s = 100,
c = list(df['cluster_id']),cmap = 'rainbow',colorbar = False,
alpha = 0.6,title = 'DBSCAN cluster result')