关于DBSCAN图像上小圆圈和大圆圈的问题

这是sickit-learn上DBSCAN地址:Demo of DBSCAN clustering

问题

我的疑问就是这个小点是怎么出来的。
在这里插入图片描述

样例代码批注

import numpy as np
from sklearn.cluster import DBSCAN
from sklearn import metrics
from sklearn.datasets import make_blobs
from sklearn.preprocessing import StandardScaler

# make_blobs:为聚类产生数据集及其相应的标签;n_samples:样本点个数;centers:类别数;cluster_std:每个类别的方差;random_state:随机种子
# 这里centers里的三个二维坐标,其实代表了聚类的三个中心
centers = [[1, 1], [-1, -1], [1, -1]]
X, labels_true = make_blobs(n_samples=750, centers=centers, cluster_std=0.4, random_state=0)

# 标准化
X = StandardScaler().fit_transform(X)

# 预估器,并得出模型(eps:数据点的邻域半径;min_samples:某个数据点的邻域内最少有的数据点个数)
db = DBSCAN(eps=0.2, min_samples=7).fit(X)

# 生成n_samples个False
core_samples_mask = np.zeros_like(db.labels_, dtype=bool)
# 预测出的结果(有结果的为True,为噪音的是False)
core_samples_mask[db.core_sample_indices_] = True
# 获得预测结果
labels = db.labels_
# 获得预测的聚类数,忽略掉噪音
n_clusters_ = len(set(labels)) - (1 if -1 in labels else 0)
# 获得噪音数
n_noise_ = list(labels).count(-1)

# 预测出的集群数,对应图中5中颜色
print('Estimated number of clusters: %d' % n_clusters_)
# 预测出噪音点的数量,对应图中的黑点
print('Estimated number of noise points: %d' % n_noise_)
# 同质性:簇的纯洁程度—对比分类问题的精度
print("Homogeneity: %0.3f" % metrics.homogeneity_score(labels_true, labels))
# 完整性:簇的完整性—对比分类问题的召回率
print("Completeness: %0.3f" % metrics.completeness_score(labels_true, labels))
# v测度:用来评估同一个数据集上两个独立赋值的一致性
print("V-measure: %0.3f" % metrics.v_measure_score(labels_true, labels))
# 调节的兰德系数(ARI):衡量两个数据分布的吻合程度
print("Adjusted Rand Index: %0.3f" % metrics.adjusted_rand_score(labels_true, labels))
# 调整互信息(AMI):衡量两个数据分布的吻合程度
print("Adjusted Mutual Information: %0.3f" % metrics.adjusted_mutual_info_score(labels_true, labels))
# 轮廓系数:将某个对象与自己的簇的相似程度和与其他簇的相似程度进行比较(肘方法)
print("Silhouette Coefficient: %0.3f" % metrics.silhouette_score(X, labels))


import matplotlib.pyplot as plt

unique_labels = set(labels)
# 给每个label赋个颜色
colors = [plt.cm.Spectral(each) for each in np.linspace(0, 1, len(unique_labels))]
for k, col in zip(unique_labels, colors):
    # 给噪音为黑色
    if k == -1:
        col = [0, 0, 0, 1]

    # 开始绘制,获得该种类的点
    class_member_mask = (labels == k)
    # core_samples_mask里false就是黑色噪音点
    # 取出同一类的点(这样&可以过滤掉黑点。如果没有core_samples_mask(黑点为false)会把黑点也画很大)
    xy = X[class_member_mask & core_samples_mask]
    plt.plot(xy[:, 0], xy[:, 1], 'o', markerfacecolor=tuple(col), markeredgecolor='k', markersize=14)
    # 获得噪音点,注意:db.core_sample_indices_没出现的的不一定就是噪音点(小圆圈)
    xy = X[class_member_mask & ~core_samples_mask]
    plt.plot(xy[:, 0], xy[:, 1], 'o', markerfacecolor=tuple(col), markeredgecolor='k', markersize=6)

plt.title('Estimated number of clusters: %d' % n_clusters_)
plt.show()

原因解释

一直有个困惑,不知道这个小圆圈是怎么画上去的。它的原因是在“db.core_sample_indices_”和“db.labels”,起初我以为“db.core_sample_indices_”会生成除噪音点以外的其他index,也就是区分开了噪音点与聚类点。但其实并不是,有少部分不在“db.core_sample_indices_”中的点也是聚类点,在下方打印出来的值分别与它俩相对,可以看见前者并没有为32的index,理论上它应该为-1噪音点,但打印出“db.labels”发现index为32的值是1,是一个聚类点。这点也在scikit learn文档最后一段进行了说明,文档解释到图中大的圆为“core sample”,而小的圆为“non-core sample”,它也是聚类的一部分。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值