DBSCAN基本概念:
- 邻域的距离阈值:设定的半径r 核心对象:若某个点的密度达到算法设定的阈值,则为核心点
- 直接密度可达:若点p在q的r领域内并且q是核心点,则p-q直接密度可达
- 密度可达:直接密度可达的传递
- 密度相连:若从某核心点p出发,点q和点k都是密度可达,则q和k是密度相连的
- 边界点:属于一个类的非核心点,不能发展下线了
- 噪声点:不属于任何一个簇的点
算法思想: - 指定合适的阈值和Minpoints 若点p未被标记,且p的邻域内有超过Minpoints个点,则创建一个以p为核心点的新簇
- 根据已有核心点,寻找密度可达的点,加入相应簇,对于核心点发生密度相连情况的簇,则合并起来(凡是遍历过的点都标记)
- 当没有新的点可以被添加到任何簇是,算法结束
优势:
- 不需要指定簇的个数,可以发现任意形状的簇
- 擅长找到离群点(检测任务)
劣势: - 高维数据处理困难(可做降维)
- 参数选择困难(不同的参数对结果影响很大)
- sklearn效率慢
演示代码:
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.cluster import DBSCAN
# 导入数据
x1, y1 = datasets.make_circles(n_samples=2000,factor=0.5,noise=0.05)
x2, y2 = datasets.make_blobs(n_samples=1000, centers=[[1.2,1.2]], cluster_std=[[.1]])
x = np.concatenate((x1,x2))
# 建模
y_pred = DBSCAN(eps=0.2, min_samples=50).fit_predict(x) # # 领域距离阈值为2,最小点数为50
plt.scatter(x[:,0],x[:,1],c=y_pred)
plt.show()
分类结果:
纯小白,望大佬指点
分类算法可视化/