DBSCAN——非凸数据集聚类

K-Means 本质上是将样本空间划分成 k 个 Voronoi 区域,决定了划分结果的 k 个簇一定是凸集,因而该方法对非凸区域的鉴别效果非常不好。
在这里插入图片描述
下面使用 DBSCAN 对上面非凸分布的数据聚类。
本例中 DBSCAN 选择的参数为:eps=0.5, min_samples=5
即要求一个团簇内点(非边界、非噪声点)在半径为 eps 的范围内至少有 min_sample 个点,边界点至少在满足上述条件一个内点的 eps 范围内,其余为噪声点。


import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import DBSCAN

def show_scatter(data,colors):
    cm = plt.cm.get_cmap('Spectral')
    x,y = data.T
    plt.scatter(x,y,c=colors,cmap=cm)
    plt.axis()
    plt.xlabel("x")
    plt.ylabel("y")

db = DBSCAN(eps=0.5, min_samples=5).fit(data)

labels = set(db.labels_)
n_clusters = len(labels) - (1 if -1 in labels else 0)
noise_mask = (db.labels_ == -1)
colors = [plt.cm.Spectral(each)
          for each in np.linspace(0, 1, len(labels))]

plt.title('Estimated number of clusters: %d' % n_clusters)
show_scatter(data[~noise_mask],db.labels_[~noise_mask])
show_scatter(data[noise_mask],'k')
plt.show()

在这里插入图片描述
图中的黑点为 DBSCAN 算法得出的噪声点。

生成上图数据的函数如下:

def gen_ring(r, var, num):
    r_array = np.random.normal(r,var,num)
    t_array = [ np.random.random()*2*np.math.pi for i in range(num)]
    data = [[r_array[i]*np.math.cos(t_array[i]),
             r_array[i]*np.math.sin(t_array[i])] 
            for i in range(num)]
    return data

def gen_gauss(mean,cov,num):     
    return np.random.multivariate_normal(mean,cov,num)
    
def gen_clusters():
    data = gen_ring(1,0.1,100)
    data = np.append(data,gen_ring(3,0.1,300),0)
    data = np.append(data,gen_ring(5,0.1,500),0)
    mean = [7,7]
    cov = [[0.5,0],[0,0.5]]
    data = np.append(data,gen_gauss(mean,cov,100),0)
    return np.round(data,4)
### DBSCAN 算法用于检测形状的簇 DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一种基于密度的空间聚类算法,能够有效发现任意形状的数据簇,包括形状的簇。它通过定义核心点、边界点以及噪声点来实现数据分组。 #### 核心概念 DBSCAN 的主要参数包括 `ε` 和 `MinPts`。其中: - **ε**: 定义邻域半径,在该范围内寻找邻居点。 - **MinPts**: 邻域内的最小点数阈值,决定某个点是否为核心点[^1]。 当满足条件的核心点被找到时,这些点会扩展形成一个簇。如果某些区域中的点密度较低,则会被标记为噪声点。 #### 处理形状的机制 由于 DBSCAN 不依赖于预先设定的簇数量,并且其原理是基于点之间的密度连接性而几何距离约束,因此常适合处理具有复杂边界的形状簇。具体来说: - 如果两个点属于同一个高密度区域并通过路径相连,则它们将被分配到同一簇中,即使这个路径可能弯曲或呈现复杂的拓扑结构[^3]。 以下是 Python 中使用 scikit-learn 实现 DBSCAN 并应用于形状数据的一个例子: ```python from sklearn.cluster import DBSCAN import numpy as np import matplotlib.pyplot as plt # 创建模拟数据 X = np.array([[1, 2], [2, 2], [2, 3], [8, 7], [8, 8], [25, 80]]) # 初始化并运行 DBSCAN db = DBSCAN(eps=3, min_samples=2).fit(X) # 获取标签结果 labels = db.labels_ # 可视化结果 plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis', s=50) plt.title('DBSCAN Cluster Results') plt.show() ``` 上述代码展示了如何利用 DBSCAN 对一组二维数据进行聚类分析。调整参数 `eps` 和 `min_samples` 能够显著影响最终的结果质量。 #### 数据预处理的重要性 值得注意的是,在应用任何涉及距离计算的聚类方法之前,建议先对原始特征向量执行标准化操作以消除不同测量单位带来的偏差问题。这一步骤有助于提高模型性能和鲁棒性。 --- ###
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

颹蕭蕭

白嫖?

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值