Предварительное исследование алгоритма кластеризации DBSCAN

Python

Введение в 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')