聚类算法及python实现——DBSCAN
基于密度聚类,无需给定聚类个数,且最终聚类数不确定
(1)核心点,在半径Eps内有超过MinPts数目的点
(2)边界点,在半径Eps内点的数量小于MinPts
(3)噪音点,不是核心点也不是边界点
图片来源于中国大学MOOC,北京理工大学Python机器学习应用
步骤
step1:标记所有点,核心点、边界点和噪音点
step2:删除噪音点
step3:距离在Eps内的所有核心点之间赋予一条边
step4:每组连通的核心点形成一个类
step5:将每个边界点指派到一个与之关联的核心点的类中(某个核心点的半径范围内)
python代码
import numpy as np
from sklearn.cluster import DBSCAN
db = DBSCAN(eps = 0.01,min_samples = 20,metric = 'euclidean')
label = db.fit(data)
labels = label.labels # 每个数据的类标签
DBSCAN主要参数
eps:半径,即两个样本被看作邻居节点的最大距离
min_samples:类中的样本数MinPts
metric:距离计算方式
优势
(1)聚类速度快,能处理噪声点,解决数据集非凸集
(2)与K-means相比,无需输入聚类个数
(3)类的形状没有偏移
(4)指定多大范围外的点为噪声
缺陷
(1)数据量增加,消耗内存
(2)密度不均匀,选取MinPts和Eps困难
(3)聚类效果依赖距离公式的选取,常用欧式距离,若多维数据,存在“维数灾难”