未知簇数量的无监督聚类算法

未知簇数量的无监督聚类算法

技术背景

在机器学习领域,无监督聚类是一种重要的数据分析技术,它能够将数据集中相似的数据点划分为不同的簇。然而,在实际应用中,我们往往并不知道数据集中具体存在多少个簇。例如,给定一组三维向量,需要根据欧几里得距离将它们聚类,使得同一簇内任意两个向量之间的欧几里得距离小于某个阈值 T,同时可能存在一些单独的向量,它们与其他向量的欧几里得距离都不小于 T,不属于任何一个簇。

实现步骤

1. 层次聚类(Hierarchical Clustering)

层次聚类是一种较为基础的聚类方法,有很多现成的实现。以 Python 的 scipy 库为例,其实现步骤如下:

  • 生成数据:创建包含多个簇和孤立点的数据集。
  • 聚类操作:使用 scipy.cluster.hierarchy.fclusterdata 函数进行聚类,通过设置距离阈值 thresh 来决定是否将点或簇合并。
  • 可视化:使用 matplotlib 库绘制聚类结果。

2. DBSCAN 算法

DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一种基于密度的空间聚类算法,它可以根据向量的局部密度进行聚类,自动确定簇的数量,并将密度不足的点视为噪声点(不属于任何簇)。实现步骤如下:

  • 导入所需的库,如 sklearn.cluster.DBSCAN
  • 调用 DBSCAN 函数进行聚类,设置参数 eps 表示邻域半径,min_samples 表示最小样本数。

3. OPTICS 算法

OPTICS(Ordering Points To Identify the Clustering Structure)与 DBSCAN 密切相关,它适用于处理大型数据集,能够在可变的邻域半径下找到高密度的核心样本并扩展簇。实现步骤如下:

  • 导入 sklearn.cluster.OPTICS 库。
  • 调用 OPTICS 函数进行聚类,根据需求调整 epsmin_samples 参数。

核心代码

层次聚类示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import matplotlib.pyplot as plt
import numpy
import scipy.cluster.hierarchy as hcluster

# 生成数据
N = 100
data = numpy.random.randn(3 * N, 2)
data[:N] += 5
data[-N:] += 10
data[-1:] -= 20

# 聚类
thresh = 1.5
clusters = hcluster.fclusterdata(data, thresh, criterion="distance")

# 绘图
plt.scatter(*numpy.transpose(data), c=clusters)
plt.axis("equal")
title = "threshold: %f, number of clusters: %d" % (thresh, len(set(clusters)))
plt.title(title)
plt.show()

DBSCAN 示例代码

1
2
3
4
5
6
7
8
9
from sklearn.cluster import DBSCAN
import numpy as np

# 示例数据
X = np.array([[1, 2], [2, 2], [2, 3], [8, 7], [8, 8], [25, 80]])

# 聚类
db = DBSCAN(eps=3, min_samples=2).fit(X)
labels = db.labels_

OPTICS 示例代码

1
2
3
4
5
6
7
8
9
from sklearn.cluster import OPTICS
import numpy as np

# 示例数据
X = np.array([[1, 2], [2, 2], [2, 3], [8, 7], [8, 8], [25, 80]])

# 聚类
db = OPTICS(eps=3, min_samples=30).fit(X)
labels = db.labels_

最佳实践

  • 层次聚类:在选择距离阈值时,可以通过计算不同阈值下聚类的质量指标(如 Calinski-Harabasz 指数)来确定最优阈值。该指数通过计算平均簇间距离与簇内距离的比值,值越大表示聚类效果越好。
  • DBSCAN 和 OPTICS:需要根据数据集的特点合理选择 epsmin_samples 参数。可以通过多次试验或使用网格搜索等方法来找到最优参数组合。

常见问题

  • 如何选择合适的算法:层次聚类适用于小规模数据集,实现简单;DBSCAN 适用于具有任意形状簇的数据集,能够处理噪声点;OPTICS 则更适合大型数据集。
  • 如何确定聚类的阈值或参数:可以使用质量指标(如 Calinski-Harabasz 指数)来评估不同阈值或参数下的聚类效果,选择最优值。
  • 如何处理孤立点:DBSCAN 和 OPTICS 算法会自动将密度不足的点视为噪声点(孤立点);层次聚类在设置合适的阈值时也可以允许存在单个点的簇。

未知簇数量的无监督聚类算法
https://119291.xyz/posts/2025-04-21.unsupervised-clustering-with-unknown-number-of-clusters/
作者
ww
发布于
2025年4月22日
许可协议