DBSCAN是什么?它和其他聚类算法有什么不同?

DBSCAN是一种非监督聚类算法,通过密度而非预定义的中心点来识别数据点的聚类。文章介绍了算法原理、步骤、关键概念如核心点和边界点,并给出了Python代码示例。
部署运行你感兴趣的模型镜像

DBSCAN是什么?

DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一种基于密度的聚类算法,用于在样本集中发现具有相似特征的数据组。

与其他聚类算法相比,DBSCAN通过将数据点组织为高密度区域,以及将低密度区域视为噪音来确定聚类。这种方法使得DBSCAN能够处理具有任意形状的聚类,并且能够有效地处理数据特征空间中的异常值。

算法原理

DBSCAN通过考虑每个数据点周围的邻居数量来构建聚类。它定义了以下三种类型的数据点:

  • 核心点(Core Point):如果一个数据点的邻居数超过了给定的半径(ε)阈值,它就被认为是一个核心点。
  • 边界点(Border Point):如果一个数据点的邻居数小于半径(ε)阈值,但它位于核心点的邻域内,则被认为是边界点。
  • 噪音点(Noise Point):既不是核心点也不是边界点的数据点。

基于以上定义,DBSCAN算法的主要步骤如下:

  1. 随机选择一个未访问的数据点。
  2. 检查它的邻居数量,如果其邻居数量大于等于给定的阈值,则递归地将其邻居也加入当前聚类。
  3. 重复步骤1和2,直到所有的数据点都被访问过。
  4. 所有访问过的数据点即为聚类中的数据点,未访问过的数据点则为噪音点。

公式推导

DBSCAN算法涉及到两个主要的公式,即距离计算公式和密度计算公式。

  • 距离计算公式:

对于两个数据点x,y,欧氏距离可以通过以下公式计算:

dist(x,y)=∑i=1n(xi−yi)2 dist(x, y) = \sqrt{\sum_{i=1}^{n} (x_i - y_i)^2} dist(x,y)=i=1n(xiyi)2

其中,n为数据点的维度。

  • 密度计算公式:

对于一个核心点x,其ε-邻域内的点数可以通过以下公式计算:

Nϵ(x)={y ∣ dist(x,y)≤ϵ} N_{\epsilon}(x) = \{y \ | \ dist(x, y) \leq \epsilon \} Nϵ(x)={y  dist(x,y)ϵ}

计算步骤

  1. 初始化数据集和参数(距离阈值ε和最小邻居数min_pts)。
  2. 随机选择一个未访问的数据点。
  3. 如果该数据点的ε-邻域内的点数大于等于min_pts,则将其标记为核心点,并创建一个新的聚类。
  4. 递归地将该核心点的邻居也加入当前聚类,直到没有新的核心点加入。
  5. 如果该数据点是边界点,则将其添加到当前聚类中。
  6. 重复步骤2-5,直到所有的数据点都被访问过。
  7. 聚类中的数据点即为最终的聚类结果,未访问过的数据点为噪音点。

Python代码示例

import numpy as np
from sklearn.datasets import make_moons
import matplotlib.pyplot as plt

def euclidean_distance(x, y):
    return np.sqrt(np.sum((x - y)**2))

def dbscan(data, epsilon, min_pts):
    num_samples, num_features = data.shape
    visited = np.zeros(num_samples)
    clusters = []

    for i in range(num_samples):
        if visited[i] == 1:
            continue
        visited[i] = 1

        neighbors = find_neighbors(data, i, epsilon)

        if len(neighbors) < min_pts:
            continue

        clusters.append([])
        expand_cluster(data, i, neighbors, clusters[-1], epsilon, min_pts, visited)

    return clusters

def find_neighbors(data, idx, epsilon):
    neighbors = []
    num_samples = data.shape[0]
    for i in range(num_samples):
        if euclidean_distance(data[idx], data[i]) <= epsilon:
            neighbors.append(i)
    return neighbors

def expand_cluster(data, idx, neighbors, cluster, epsilon, min_pts, visited):
    cluster.append(idx)

    for i in neighbors:
        if visited[i] == 0:
            visited[i] = 1
            new_neighbors = find_neighbors(data, i, epsilon)

            if len(new_neighbors) >= min_pts:
                neighbors.extend(new_neighbors)

        if i not in cluster:
            cluster.append(i)

# 生成虚拟数据集
data, _ = make_moons(n_samples=500, noise=0.1)

# DBSCAN聚类
epsilon = 0.2
min_pts = 5
clusters = dbscan(data, epsilon, min_pts)

# 绘制聚类结果
plt.figure(figsize=(8, 6))
colors = ['red', 'blue', 'green', 'purple']
for i, cluster in enumerate(clusters):
    plt.scatter(data[cluster, 0], data[cluster, 1], c=colors[i % len(colors)], s=30, label='Cluster {}'.format(i+1))
plt.legend()
plt.show()

代码细节解释

  • euclidean_distance函数用于计算两个数据点之间的欧氏距离。
  • dbscan函数是DBSCAN算法的主要实现,其中包括数据点的访问和聚类扩展等操作。
  • find_neighbors函数用于查找一个数据点的ε-邻域内的点。
  • expand_cluster函数用于递归地扩展一个聚类,将其核心点的邻居加入。
  • 最后,我们通过使用make_moons函数生成一个虚拟数据集,然后调用dbscan函数进行聚类,并将聚类结果进行可视化展示。

以上就是关于DBSCAN的详细介绍,包括了算法原理、公式推导、计算步骤和Python代码示例的解释。希望对你有所帮助!

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值