1、DBSCAN算法介绍
下图中,左边的图形可以使用K-Means算法进行聚类,右边两个有交叉部分【噪音】,故需要使用密度聚类(DBSCAN)算法
K-Means和层次聚类算法,是基于对象之间的距离进行聚类,这样的方法只能发现球状的簇,【密度聚类】只要临近区域的密度,对象或数据点的数目超过某个阈值就继续聚类,也就是说它会继续搜索自己附近的点或者簇,将符合阈值的合并在一起,这样【密度聚类方法】就可以用于过滤噪声,孤立点数据,发现任意形状的簇。
- 密度
- 邻域
- 核心点
- 边界点
- 噪声点
4、DBSCAN 的参数选择
- eps 设置得非常小,则意味着没有点是核心样本,可能会导致所有点被标记为噪声
- eps 设置得非常大,可能会导致所有点形成单个簇。
- 虽然不需要显示设置簇的个数,但设置 eps 可以隐式地控制找到 eps 的个数。
- 使用 StandarScaler 或 MinMaxScaler 对数据进行缩放,有时更容易找到 eps 的较好取值。因为使用缩放技术将确保所有特征具有相似的范围。
from sklearn.cluster import DBSCAN
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt
import mglearn
X,y=make_blobs(random_state=0,n_samples=12)
dbscan=DBSCAN()
clusters=dbscan.fit_predict(X)
# 都被标记为噪声
print('Cluster memberships:\n{}'.format(clusters))
mglearn.plots.plot_dbscan()
plt.show()
5、Scikit-learn中的DBSCAN的使用
def __init__(self, eps=0.5, min_samples=5, metric='euclidean',
metric_params=None, algorithm='auto', leaf_size=30, p=None,
n_jobs=1):
核心参数:
- eps: float,ϵ-邻域的距离阈值
- min_samples :int,样本点要成为核心对象所需要的 ϵ-邻域的样本数阈值
属性:
- core_sample_indices_ : 核心点的索引,因为labels_不能区分核心点还是边界点,所以需要用这个索引确定核心点
- components_:训练样本的核心点
- labels_:每个点所属集群的标签,-1代表噪声点
参考链接:
[1] DBSCAN 算法 2019.1