1. 基本原理
OPTICS(Ordering Points To Identify the Clustering Structure)是一种基于密度的聚类算法,可视为DBSCAN的改进版本。它能够识别不同密度的簇,并自动发现数据中的层次化聚类结构,适用于复杂分布的数据集。适合如下应用场景:
- 地理空间数据分析:识别不同密度的城市热点区域。
- 生物信息学:基因表达数据的层次化聚类。
- 异常检测:通过可达性图识别离群点(高可达距离的点)。
- 图像分割:处理纹理密度不均匀的图像。
关键概念
DBSCAN的局限性:
-
对全局参数
eps
(邻域半径)敏感,难以处理密度变化大的数据。 -
无法直接输出层次化聚类结果。
OPTICS的改进:
-
通过计算可达距离(Reachability Distance),避免固定
eps
的限制。 -
生成可达性图(Reachability Plot),支持多尺度聚类分析。
术语 | 定义 |
---|---|
核心距离 | 使点成为核心对象的最小半径(类似DBSCAN的eps )。 |
可达距离 | 点p 到点o 的可达性,定义为max(核心距离(o), 欧氏距离(o,p)) 。 |
簇排序 | 通过可达距离生成数据点的有序列表,反映密度结构。 |
算法步骤
-
初始化:
-
设定参数
min_samples
(核心点的最小邻域点数)和max_eps
(可选,限制搜索范围)。 -
为每个点计算核心距离和可达距离。
-
-
生成有序列表:
-
从任意未访问点开始,扩展其
eps
-邻域。 -
若邻域内点数≥
min_samples
,标记为核心点,并计算其邻域点的可达距离。 -
按可达距离从小到大将点加入有序列表。
-
-
提取簇结构:
-
通过可达性图识别“山谷”区域(低可达距离),每个山谷对应一个簇。
-
使用参数
xi
或eps
切割可达性图,提取最终聚类。
-
OPTICS与HDBSCAN对比如下:
特性 | HDBSCAN | OPTICS |
---|---|---|
基础算法 | 基于DBSCAN的层次化改进 | 基于DBSCAN的密度排序扩展 |
核心思想 | 通过层次聚类提取稳定簇,自动选择簇 | 生成可达性图,通过阈值提取簇 |
簇提取方式 | 基于最小簇大小和最小样本数 | 基于可达距离和ξ(xi)参数 |
噪声处理 | 明确区分噪声点(标签=-1) | 可通过参数过滤噪声 |
参数 | HDBSCAN | OPTICS |
---|---|---|
关键参数 | min_cluster_size , min_samples | min_samples , xi , eps |
距离度量 | 支持任意距离(如欧式、余弦) | 通常使用欧式距离 |
自动化程度 | 自动确定簇数 | 需手动设置ξ或eps提取簇 |
优点 | 自动确定簇数:无需预设簇数量。 处理变密度数据:适应不同密度的簇。 鲁棒性强:对噪声和参数选择不敏感。 | 可视化支持:可达性图直观展示聚类结构。 灵活性高:通过ξ参数动态提取簇。 |
缺点 | 计算复杂度高:大数据集可能较慢。 需要调参: | 手动提取簇:需人工干预选择阈值。 参数敏感: |
场景 | HDBSCAN | OPTICS |
---|---|---|
自动聚类 | ✅ 最佳选择 | ⚠️ 需手动提取簇 |
变密度数据 | ✅ 表现优异 | ✅ 需调整ξ参数 |
噪声数据 | ✅ 明确标记噪声 | ✅ 需后处理过滤 |
可视化分析 | ⚠️ 有限支持 | ✅ 可达性图直观 |
大规模数据 | ⚠️ 较慢(可近似优化) | ⚠️ 中等规模更适用 |
2. Python实现
from sklearn.cluster import OPTICS
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_moons# 生成示例数据(月牙形分布)
X, _ = make_moons(n_samples=300, noise=0.05, random_state=42)# OPTICS模型
# min_samples:核心点的最小邻域点数
# xi:决定簇边界陡峭度的阈值(0~1)
# min_cluster_size:最小簇大小(可选)
clustering = OPTICS(min_samples=10, xi=0.05, min_cluster_size=0.1)# 拟合并预测
clustering.fit(X)
labels = clustering.labels_# 可视化
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis', s=10)
plt.title("OPTICS Clustering")
plt.show()
参数说明
参数 | 作用 |
---|---|
min_samples | 定义核心点的邻域最小点数(值越小,对噪声越敏感)。 |
xi | 控制簇边界的陡峭度(较小值生成更多小簇)。 |
min_cluster_size | 簇的最小样本比例(0~1)或绝对数量。 |
max_eps | 限制邻域搜索的最大半径(若为np.inf ,则完全依赖min_samples )。 |
可达性图解读:
-
低可达距离的区域(“山谷”)代表高密度簇。
-
高峰值点可能是噪声或簇边界。
# 绘制可达性图
space = np.arange(len(X))
reachability = clustering.reachability_[clustering.ordering_]
labels = clustering.labels_[clustering.ordering_]plt.figure(figsize=(10, 5))
plt.plot(space, reachability, 'k-', alpha=0.6)
plt.scatter(space, reachability, c=labels, cmap='viridis', s=10)
plt.ylabel('Reachability Distance')
plt.title('Reachability Plot')
plt.show()
层次化簇提取
通过调整xi
或手动切割可达性图,可提取不同密度的簇:
# 使用不同xi值提取簇
clustering_xi = OPTICS(min_samples=10, xi=0.1).fit(X)
labels_xi = clustering_xi.labels_plt.scatter(X[:, 0], X[:, 1], c=labels_xi, cmap='viridis', s=10)
plt.title(f"OPTICS with xi=0.1 (Clusters: {len(np.unique(labels_xi))})")
plt.show()
3. 总结
特性 | OPTICS | DBSCAN |
---|---|---|
参数敏感性 | 仅需min_samples ,对eps 不敏感 | 依赖eps 和min_samples |
输出结果 | 可达性图 + 层次化簇 | 单一密度阈值下的硬划分 |
计算复杂度 | 较高(需维护有序列表) | 较低 |
适用场景 | 多密度簇、层次化分析 | 单一密度、简单分布 |
优点
-
无需预设
eps
,适应多密度数据。 -
可输出层次化聚类结构。
-
对噪声鲁棒性强。
缺点
-
计算复杂度高于DBSCAN(近似于O(n log n))。
-
参数
xi
的选择需要经验或调优。自动选择xi
:基于可达性图的梯度变化自动切割(如sklearn.cluster.cluster_optics_xi
)。 -
高维数据可能表现不佳(需配合降维)。
进阶技巧
-
加速计算:使用
KDTree
或BallTree
优化邻域搜索(通过metric_params
设置) -
处理大数据集:结合
HDBSCAN
(基于OPTICS思想的扩展算法)