DBSCAN聚类

DBSCAN密度聚类算法学习

Posted by CHY on June 1, 2020

参考链接:https://zhuanlan.zhihu.com/p/88747614

DBSCAN,英文全称是 Density-Based Spatial Clustering of Applications with Noise,一种基于密度,对噪声鲁棒的空间聚类算法。
DBSCAN通常适合于对较低维度数据进行聚类分析。
DBSCAN基本概念:

  1. 基于密度 找到样本点的全部密集区域,并把这些密集区域当做聚类簇。
  2. 领域半径R和最少点数目minpoints 当领域半径R内的点的个数大于最少点数目minpoints时,就叫做密集。
  3. 核心点,边界点和噪声点 邻域半径R内样本点的数量大于等于minpoints的点叫做核心点。不属于核心点但在某个核心点的邻域内的点叫做边界点。既不是核心点也不是边界点的是噪声点。
  4. 密度直达,密度可达,密度相连,非密度相连。

DBSCAN算法步骤

# 寻找核心点形成临时聚类簇
# 扫描全部样本点,如果某个样本点R半径范围内点数目>=MinPoints,则将其纳入核心点列表,并将其密度直达的点形成对应的临时聚类簇。
# 合并临时聚类簇得到聚类簇

# 数据生成
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')