跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像AI 生图工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
PythonAI算法

Python 聚类实战:OPTICS 算法原理与可视化全流程

介绍 OPTICS 聚类算法的 Python 实现流程。通过生成环形与球形混合数据模拟非线性分布场景,演示了核心概念如可达距离与核心距离的计算。文章包含环境配置、数据生成、模型训练、可达距离曲线分析及聚类结果可视化。对比了 OPTICS 与 K-Means、DBSCAN 的效果差异,并提供了参数调优指南及常见问题解决方案,适用于用户行为分析、异常检测等复杂密度结构场景。

利刃发布于 2026/3/24更新于 2026/7/2414K 浏览

一、引言:聚类算法中的'密度层次专家'

在无监督学习领域,聚类算法是挖掘数据内在结构的核心工具。传统聚类方法中,K-Means 依赖'球形簇'假设、DBSCAN 对参数敏感,而 OPTICS(Ordering Points To Identify the Clustering Structure,基于密度的层次聚类算法)凭借'任意形状簇识别''密度分布可视化'的特性,成为非线性数据聚类的优选方案。

本文以环形与球形混合数据为实验对象,从环境配置、数据生成、算法实现、结果解析、问题解决五个维度,完整复现 OPTICS 算法的实战流程。

二、环境准备与依赖库安装

2.1 核心库说明

本次实验需用到以下 Python 库:

  • numpy:数据处理;
  • matplotlib:可视化;
  • sklearn:数据生成、OPTICS 算法实现。

在终端执行以下代码安装依赖(若已安装可跳过):

!pip install numpy matplotlib scikit-learn

2.2 库导入与中文配置

导入库并解决 Matplotlib 中文显示问题(避免后续可视化出现乱码):

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_circles, make_blobs
from sklearn.cluster import OPTICS

# 配置 Matplotlib 中文显示
plt.rcParams["font.sans-serif"] = ["SimHei"] # Windows 系统
# plt.rcParams["font.sans-serif"] = ["Arial Unicode MS"] # Mac 系统
plt.rcParams["axes.unicode_minus"] = False # 解决负号显示异常

三、实验数据生成:模拟非线性分布场景

为体现 OPTICS 处理'非球形簇'的优势,我们生成'环形 + 球形混合数据'(模拟真实场景中不规则分布的数据集)。

3.1 数据生成代码

# 1. 生成内外环形数据(非线性分布,模拟复杂结构)
X1, _ = make_circles(
    n_samples=1000,      # 样本数
    factor=0.2,          # 内外环半径比例
    noise=0.05,          # 噪声比例
    random_state=5       # 随机种子(保证结果可复现)
)

# 2. 生成 2 个独立球形簇(模拟局部密集结构)
X2, _ = make_blobs(
    n_samples=,
    n_features=,
    centers=[[, ]],
    cluster_std=[],
    random_state=
)
X3, _ = make_blobs(
    n_samples=,
    n_features=,
    centers=[[-, -]],
    cluster_std=[],
    random_state=
)


X = np.concatenate((X1, X2, X3))


plt.figure(figsize=(, ))
plt.scatter(X[:, ], X[:, ], marker=, c=)
plt.title()
plt.xlabel()
plt.ylabel()
plt.show()
200
2
1
2
0.1
5
300
2
0.5
1.2
0.1
5
# 3. 合并所有数据(不区分标签,模拟无监督场景)
# 4. 可视化原始数据
8
6
0
1
"*"
"gray"
"原始数据分布:环形 + 球形混合结构"
"特征 1"
"特征 2"

图中可以看到:数据包含内外双层环形结构和两个独立球形簇,传统 K-Means 无法区分环形结构(会将内外环划分为同一簇),而 OPTICS 可通过密度差异识别这种不规则结构。

四、OPTICS 算法核心原理与实现

4.1 OPTICS 核心概念

OPTICS 的核心是'可达距离'与'核心距离':

  • 核心距离:某样本成为'核心点'所需的最小邻域半径(由 min_samples 决定);
  • 可达距离:样本 A 到样本 B 的距离,若 B 是核心点,则可达距离为 B 的核心距离与 A-B 实际距离的较大值。

通过对样本按'可达距离'排序,OPTICS 可生成可达距离曲线,曲线的'陡峭段'对应簇的边界,'平缓段'对应簇的核心区域。

4.2 OPTICS 模型训练代码

# 初始化 OPTICS 模型(核心参数配置)
model = OPTICS(
    min_samples=15,           # 核心点的最小邻域样本数
    xi=0.05,                  # 簇划分的陡峭度阈值(控制簇数量)
    min_cluster_size=0.05,    # 最小簇的样本占比(过滤小簇/噪声)
    cluster_method="xi"       # 指定簇划分方式(避免 HTML 可视化报错)
)
# 训练模型(无监督学习,无需标签)
model.fit(X)

4.3 可达距离曲线可视化

可达距离曲线是 OPTICS 的核心输出,代码如下:

# 获取 OPTICS 输出的样本排序与可达距离
ordering = model.ordering_              # 样本按密度从高到低的排序索引
reachability = model.reachability_[ordering]  # 排序后的可达距离

# 可视化可达距离曲线
plt.figure(figsize=(10, 4))
plt.plot(reachability, marker=".", linestyle="none", color="#1f77b4")
plt.xlabel("样本排序(密度从高到低)")
plt.ylabel("可达距离")
plt.title("OPTICS 可达距离曲线")
plt.grid(alpha=0.3)
plt.show()

曲线解析:

  • 曲线中平缓的区域对应'高密度簇的核心'(如环形结构的主体);
  • 曲线中骤升的点对应'簇的边界'(如球形簇与环形簇的分隔处);
  • 图中右侧的高值点对应独立的球形簇(密度较低,可达距离大)。

4.4 聚类结果可视化

通过 model.labels_ 可获取簇标签(-1 代表噪声点),代码如下:

# 获取排序后的簇标签
labels = model.labels_[ordering]

# 可视化聚类结果
plt.figure(figsize=(8, 6))
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap="tab10", s=50, alpha=0.8)
plt.title("OPTICS 聚类结果:环形 + 球形簇区分")
plt.xlabel("特征 1")
plt.ylabel("特征 2")
plt.colorbar(label="簇标签")
plt.show()

结果分析:

  • OPTICS 成功区分了内外环形簇(不同颜色的环形结构);
  • 两个独立的球形簇(X2、X3)被划分为单独的簇;
  • 仅少量噪声点被标记为 -1(图中未明显显示,因本次数据噪声较少)。

五、参数调优:优化 OPTICS 聚类效果

OPTICS 的聚类结果对参数敏感,我们通过调整 min_samples(核心点的最小邻域样本数),对比聚类效果的变化。

5.1 调优后模型训练代码

# 调整 min_samples 为 10(提高密度灵敏度)
model_tuned = OPTICS(
    min_samples=10,
    xi=0.05,
    min_cluster_size=0.05,
    cluster_method="xi"
)
model_tuned.fit(X)
# 获取调优后的簇标签
labels_tuned = model_tuned.labels_

5.2 调优后聚类结果

# 可视化调优后的结果
plt.figure(figsize=(8, 6))
plt.scatter(X[:, 0], X[:, 1], c=labels_tuned, cmap="tab10", s=50, alpha=0.8)
plt.title("OPTICS 调优后结果(min_samples=10)")
plt.xlabel("特征 1")
plt.ylabel("特征 2")
plt.colorbar(label="簇标签")
plt.show()

调优对比:

  • 当 min_samples 从 15 减小到 10 后,环形簇的划分更精细(区分了内环的子结构);
  • 球形簇的边界更清晰,簇内样本的同质性更高。

5.3 OPTICS 参数选择指南

  • min_samples:建议设置为 2*特征数(如 2 维数据设为 4~10),值越大,簇划分越'粗糙';
  • xi:一般取 0.01~0.1,值越小,簇划分越精细;
  • min_cluster_size:根据业务需求设置(如过滤占比 < 5% 的小簇)。

六、实战问题解决:Jupyter 可视化报错处理

在实验过程中,可能会遇到'HTML 可视化无法渲染'的提示,这是因为 sklearn 的 OPTICS 默认输出 HTML 格式的聚类树。

6.1 解决方法

在初始化模型时,添加 cluster_method="xi" 参数,指定用'xi 方法'划分簇,而非输出 HTML 树:

model = OPTICS(
    min_samples=15,
    xi=0.05,
    min_cluster_size=0.05,
    cluster_method="xi"  # 关键参数:避免 HTML 可视化
)

七、OPTICS 与其他聚类算法的对比实验

为了更直观地体现 OPTICS 的优势,我们将其与 K-Means、DBSCAN 在同一数据上的效果做对比:

7.1 对比实验代码

from sklearn.cluster import KMeans, DBSCAN

# 1. K-Means 聚类
kmeans = KMeans(n_clusters=4, random_state=5)
kmeans_labels = kmeans.fit_predict(X)

# 2. DBSCAN 聚类
dbscan = DBSCAN(eps=0.2, min_samples=5)
dbscan_labels = dbscan.fit_predict(X)

# 3. 对比可视化
fig, axes = plt.subplots(1, 3, figsize=(18, 5))

# K-Means 结果
axes[0].scatter(X[:, 0], X[:, 1], c=kmeans_labels, cmap="tab10")
axes[0].set_title("K-Means 聚类结果")

# DBSCAN 结果
axes[1].scatter(X[:, 0], X[:, 1], c=dbscan_labels, cmap="tab10")
axes[1].set_title("DBSCAN 聚类结果")

# OPTICS 结果
axes[2].scatter(X[:, 0], X[:, 1], c=labels, cmap="tab10")
axes[2].set_title("OPTICS 聚类结果")

plt.tight_layout()
plt.show()

7.2 对比结论

算法优势劣势本次数据效果
OPTICS识别任意形状簇、展示密度分布参数较多、训练时间较长优秀(区分环形)
K-Means速度快、实现简单仅支持球形簇、依赖 K 值差(无法区分环形)
DBSCAN抗噪声、无需指定簇数对 eps 和 min_samples 敏感较好(需精细调参)

八、总结与应用场景

8.1 实验总结

本文完成了 OPTICS 算法的全流程实战:

  1. 生成'环形 + 球形'混合数据,模拟非线性分布场景;
  2. 训练 OPTICS 模型,解析可达距离曲线的密度意义;
  3. 调优参数,优化簇的划分效果;
  4. 解决 Jupyter 中可视化报错的问题。

8.2 OPTICS 应用场景

OPTICS 适用于非线性分布、需探索密度结构的业务场景:

  • 用户行为聚类:区分'高频低消''低频高消'等不规则用户群体;
  • 异常检测:可达距离极高的样本可判定为异常点;
  • 图像分割:识别不规则形状的目标区域;
  • 生物信息学:聚类基因表达数据中的复杂结构。

九、完整代码附录

# 环境配置
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_circles, make_blobs
from sklearn.cluster import OPTICS

# 中文显示配置
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False

# 1. 生成数据
X1, _ = make_circles(n_samples=1000, factor=0.2, noise=0.05, random_state=5)
X2, _ = make_blobs(n_samples=200, n_features=2, centers=[[1,2]], cluster_std=[0.1], random_state=5)
X3, _ = make_blobs(n_samples=300, n_features=2, centers=[[-0.5,-1.2]], cluster_std=[0.1], random_state=5)
X = np.concatenate((X1, X2, X3))

# 2. 原始数据可视化
plt.figure(figsize=(8,6))
plt.scatter(X[:,0], X[:,1], marker="*", c="gray")
plt.title("原始数据分布:环形 + 球形混合结构")
plt.xlabel("特征 1")
plt.ylabel("特征 2")
plt.show()

# 3. OPTICS 模型训练
model = OPTICS(min_samples=15, xi=0.05, min_cluster_size=0.05, cluster_method="xi")
model.fit(X)

# 4. 可达距离曲线可视化
ordering = model.ordering_
reachability = model.reachability_[ordering]
plt.figure(figsize=(10,4))
plt.plot(reachability, marker=".", linestyle="none", color="#1f77b4")
plt.xlabel("样本排序(密度从高到低)")
plt.ylabel("可达距离")
plt.title("OPTICS 可达距离曲线")
plt.grid(alpha=0.3)
plt.show()

# 5. 聚类结果可视化
labels = model.labels_[ordering]
plt.figure(figsize=(8,6))
plt.scatter(X[:,0], X[:,1], c=labels, cmap="tab10", s=50, alpha=0.8)
plt.title("OPTICS 聚类结果:环形 + 球形簇区分")
plt.xlabel("特征 1")
plt.ylabel("特征 2")
plt.colorbar(label="簇标签")
plt.show()

# 6. 参数调优
model_tuned = OPTICS(min_samples=10, xi=0.05, min_cluster_size=0.05, cluster_method="xi")
model_tuned.fit(X)
labels_tuned = model_tuned.labels_
plt.figure(figsize=(8,6))
plt.scatter(X[:,0], X[:,1], c=labels_tuned, cmap="tab10", s=50, alpha=0.8)
plt.title("OPTICS 调优后结果(min_samples=10)")
plt.xlabel("特征 1")
plt.ylabel("特征 2")
plt.colorbar(label="簇标签")
plt.show()

目录

  1. 一、引言:聚类算法中的“密度层次专家”
  2. 二、环境准备与依赖库安装
  3. 2.1 核心库说明
  4. 2.2 库导入与中文配置
  5. 配置 Matplotlib 中文显示
  6. plt.rcParams["font.sans-serif"] = ["Arial Unicode MS"] # Mac 系统
  7. 三、实验数据生成:模拟非线性分布场景
  8. 3.1 数据生成代码
  9. 1. 生成内外环形数据(非线性分布,模拟复杂结构)
  10. 2. 生成 2 个独立球形簇(模拟局部密集结构)
  11. 3. 合并所有数据(不区分标签,模拟无监督场景)
  12. 4. 可视化原始数据
  13. 四、OPTICS 算法核心原理与实现
  14. 4.1 OPTICS 核心概念
  15. 4.2 OPTICS 模型训练代码
  16. 初始化 OPTICS 模型(核心参数配置)
  17. 训练模型(无监督学习,无需标签)
  18. 4.3 可达距离曲线可视化
  19. 获取 OPTICS 输出的样本排序与可达距离
  20. 可视化可达距离曲线
  21. 4.4 聚类结果可视化
  22. 获取排序后的簇标签
  23. 可视化聚类结果
  24. 五、参数调优:优化 OPTICS 聚类效果
  25. 5.1 调优后模型训练代码
  26. 调整 min_samples 为 10(提高密度灵敏度)
  27. 获取调优后的簇标签
  28. 5.2 调优后聚类结果
  29. 可视化调优后的结果
  30. 5.3 OPTICS 参数选择指南
  31. 六、实战问题解决:Jupyter 可视化报错处理
  32. 6.1 解决方法
  33. 七、OPTICS 与其他聚类算法的对比实验
  34. 7.1 对比实验代码
  35. 1. K-Means 聚类
  36. 2. DBSCAN 聚类
  37. 3. 对比可视化
  38. K-Means 结果
  39. DBSCAN 结果
  40. OPTICS 结果
  41. 7.2 对比结论
  42. 八、总结与应用场景
  43. 8.1 实验总结
  44. 8.2 OPTICS 应用场景
  45. 九、完整代码附录
  46. 环境配置
  47. 中文显示配置
  48. 1. 生成数据
  49. 2. 原始数据可视化
  50. 3. OPTICS 模型训练
  51. 4. 可达距离曲线可视化
  52. 5. 聚类结果可视化
  53. 6. 参数调优
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • Spring AI MCP Server 集成与源码解析
  • 深度解读国产大模型Kimi:功能、使用与背景分析
  • 大模型幻觉问题深度治理:技术体系、工程实践与未来演进
  • GFPGAN 跨平台部署与人脸图像修复应用指南
  • 微信 ClawBot 插件接入个人微信及 Windows 安装避坑指南
  • OpenFPGA 完全指南:快速上手开源 FPGA IP 生成器
  • SpringBoot 整合 Neo4j 图数据库实战指南
  • Kafka vs RabbitMQ:消息中间件选型指南与 Java 代码实战
  • PicoClaw 轻量级 AI 助手安装与使用指南
  • Gitee 本地项目上传与同步实战指南
  • LLM 大模型部署实战:Ollama、OpenLLM、LocalAI 与 Dify 集成指南
  • SQLBot:基于大模型与 RAG 的智能问数系统架构
  • MySQL 核心面试题解析:从原理到实战优化
  • Codex 接入 Kimi K2 与 GLM-4.6 环境配置指南 (Windows/macOS/Ubuntu)
  • HuggingFace 模型本地下载指南(Windows/Linux)
  • C++ 类与对象:封装特性实现与实战应用
  • Ubuntu 24.04 离线安装 Ollama 及导入模型教程
  • Pi0 机器人 VLA 大模型在昇腾 A2 平台上的测评
  • 阿里云大模型工程师 ACA 认证学习笔记:核心考点与知识体系
  • Llama-2-7B 昇腾 NPU 测评:性能数据、场景适配与硬件选型

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online