机器学习笔记(十一)聚类算法OPTICS原理和实践

article/2025/9/30 15:35:49

OPTICS聚类算法是基于密度的聚类算法,全称是Ordering points to identify the clustering structure。提到基于密度的聚类算法,应该很快会想到前面介绍的DBSCAN聚类算法,事实上,OPTICS也是为了优化DBSCAN而出现的。

一、原理

在DBSCAN算法中,有两个比较重要的参数:邻域半径eps和核心对象的最小邻域样本数min_samples,选择不同的参数会导致最终聚类的结果千差万别,而在高维数据中,两个参数的联合调参也不是一件容易的事。OPTICS算法的提出就是为了帮助DBSCAN算法选择合适的参数,降低输入参数的敏感度。实际上,OPTICS并不显式的生成数据聚类结果,只是对数据集中的对象进行排序,得到一个有序的对象列表,通过该有序列表,可以得到一个决策图,通过决策图可以选择不同的eps参数进行DBSCAN聚类。在继续阅读下面的内容之前,需要先了解DBSCAN的相关内容,因为本文的部分概念来自于DBSCAN。

在DBSCAN的基础上,OPTICS定义了两个新的距离概念:

(1)核心距离

对于一个给定的核心对象X,使得X成为核心对象的最小邻域距离 r 就是X的核心距离。这句话乍一看有点绕,其实仔细读两遍就明白了,假如在DBSCAN中我们定义 eps = 1.2 和  min_samples=5,X在eps = 1.2的邻域内有8个样本点,则X是核心对象,但是我们发现距离X最近的第5个点和X的距离是0.8,那么核心对象 X 的核心距离就是 0.8,显然每个核心对象的核心距离并不都是相同的。参考图1,注意在计算 min_samples 的时候,一般也包括样本点自身,所以只需在P点eps邻域内找到7个点,那么P点就是核心点。

(2)可达距离

如果X是核心对象,则对象 Y 到对象 X 的可达距离就是Y到X的欧氏距离和X的核心距离的最大值,如果X不是核心对象,则Y和X之间的可达距离就没有意义(不存在可达距离),显然,数据集中有多少核心对象,那么 Y 就有多少个可达距离。在下文介绍 API 的时候,我们会介绍在OPTICS中,一般默认设置 eps 为无穷大,即只要数据集的样本数不少于 min_samples,那么任意一个样本点都是核心对象,即都有核心距离,且任意两个对象之间都存在可达距离。

图1

1.1 算法描述

OPTICS的原理并不复杂,只不过大多数介绍资料都喜欢列举一些广义的算法流程或者伪代码,虽然满足算法介绍的严谨性,但是阅读起来不免显得晦涩难懂,没有阅读的欲望。因此,和之前的文章一样,本文也是先介绍OPTICS的标准算法流程,然后再以案例的形式介绍流程的具体执行逻辑,如果算法流程不能一下子理解的话,可以先跳过直接看后面的案例,然后再回来看标准流程。

OPTICS算法流程:

  1. 已知数据集 D,创建两个队列,有序队列O和结果队列R(有序队列用来存储核心对象及其该核心对象的密度直达对象,并按可达距离升序排列;结果队列用来存储样本点的输出次序。可以把有序队列里面放的理解为待处理的数据,而结果队列里放的是已经处理完的数据)。
  2. 如果D中所有点都处理完毕或者不存在核心点,则算法结束。否则,选择一个未处理(即不在结果队列R中)且为核心对象的样本点 p,首先将 p 放入结果队列R中,并从D中删除 p。然后找到 D 中 p 的所有密度直达样本点 x,计算 x 到 p 的可达距离,如果 x 不在有序队列 O 中,则将 x 以及可达距离放入 O 中,若 x 在 O 中,则如果 x 新的可达距离更小,则更新 x 的可达距离,最后对 O 中数据按可达距离从小到大重新排序。
  3. 如果有序队列 O 为空,则回到步骤2,否则取出 O 中第一个样本点 y(即可达距离最小的样本点),放入 R 中,并从 D 和 O 中删除 y。如果 y 不是核心对象,则重复步骤 3(即找 O 中剩余数据可达距离最小的样本点);如果 y 是核心对象,则找到 y 在 D 中的所有密度直达样本点,并计算到 y 的可达距离,然后按照步骤2将所有 y 的密度直达样本点更新到 O 中。
  4. 重复步骤2、3,直到算法结束。最终可以得到一个有序的输出结果,以及相应的可达距离。

已知样本数据集为:D = {[1, 2], [2, 5],  [8, 7], [3, 6],  [8, 8], [7, 3], [4,5]},为了更好地标识索引,我们以表格标识数据如下:

图2
表1
索引0123456核心对象
元素(1, 2)(2, 5)(8, 7)(3, 6)(8, 8)(7, 3)(4, 5) 
核心距离3.161.411.01.411.03.611.41 
第一次可达距离inf3.168.604.479.216.084.240
第二次可达距离----6.321.416.705.382.01
第三次可达距离----5.09--5.395.01.413
第四次可达距离----4.47--5.03.61--6
第五次可达距离----4.12--

5.0

(5.10)

----5
第六次可达距离--------1.0----2
输出顺序0152643 
可达距离inf3.164.121.411.03.611.41 

假设eps = inf,min_samples=2,则数据集D在OPTICS算法上的执行步骤如下:

  1. 计算所有的核心对象和核心距离,因为 eps 为无穷大,则显然每个样本点都是核心对象。因为 min_samples=2,则每个核心对象的核心距离就是离自己最近样本点到自己的距离(样本点自身也是邻域元素之一),具体如上表所示。
  2. 随机在 D 中选择一个核心对象,假设选择 0 号元素,将 0 号元素放入 R 中,并从 D 中删除。因为 eps = inf,则其他所有样本点都是 0 号元素的密度直达对象,计算其他所有元素到 0 号元素的可达距离(实际就是计算所有元素到 0 号元素的欧氏距离,如表1第一次可达距离),并按可达距离排序,添加到序列 O 中。
  3. 此时 O 中可达距离最小的元素是 1 号元素,取出 1 号元素放入 R ,并从 D 和 O 中删除,因为 1 号元素是核心对象,找到 1 号元素在 D 中的所有密度直达对象(剩余的所有样本点),并计算可达距离,同时更新 O(如表1第二次可达距离)。
  4. 此时 O 中可达距离最小的元素是 3 号元素,取出 3 号元素放入 R ,并从 D 和 O 中删除,因为 3 号元素是核心对象,找到 3 号元素在 D 中的所有密度直达对象(剩余的所有样本点),并计算可达距离,同时更新 O(如表1第三次可达距离)。
  5. 此时 O 中可达距离最小的元素是 6 号元素,取出 6 号元素放入 R ,并从 D 和 O 中删除,因为 6 号元素是核心对象,找到 6 号元素在 D 中的所有密度直达对象(剩余的所有样本点),并计算可达距离,同时更新 O(如表1第四次可达距离)。
  6. 此时 O 中可达距离最小的元素是 5 号元素,取出 5 号元素放入 R ,并从 D 和 O 中删除,因为 5 号元素是核心对象,找到 5 号元素在 D 中的所有密度直达对象(剩余的所有样本点),并计算可达距离,同时更新 O(如表1第五次可达距离)。注意本次计算的4号元素到5号元素的可达距离是5.10,大于5.0,因此不更新4号元素的可达距离。
  7. 此时 O 中可达距离最小的元素是 2 号元素,取出 2 号元素放入 R ,并从 D 和 O 中删除,因为 2 号元素是核心对象,找到 2 号元素在 D 中的所有密度直达对象(剩余的所有样本点),并计算可达距离,同时更新 O(如表1第六次可达距离)。
  8. 此时 O 中可达距离最小的元素是 4 号元素,取出 4 号元素放入 R ,并从 D 和 O 中删除,因为 D 已空,O 也已空,程序结束。根据表1,最终的结果序列 R 的元素索引输出顺序为:0、1、3、6、5、2、4,可达距离如表1最后一行所示。

我们按照最终的输出顺序绘制可达距离图(注意,因为第一个元素没有可达距离,或者说可达距离是无穷大,故图中没有标出 0 号元素的可达距离):

图3

可以发现,可达距离呈现两个波谷,也即表现为两个簇,波谷越深,表示簇越紧密,只需要在两个波谷之间取一个合适的 eps 分隔值(图中蓝色的直线,例如两个可达距离的平均值),使用 DBSCAN 算法就会聚类为两个簇。即第一个簇的元素为:0、1、3、6、5;第二个簇的元素为:2、4。下面我们通过sklearn库来验证我们的结果。

二、实践

sklearn库同样为我们封装了 OPTICS 算法的API,供我们直接使用。

2.1 验证

基于1.1的数据集,使用OPTICS验证算法结果如下:

from sklearn.cluster import OPTICS
import numpy as npX = np.array([[1, 2], [2, 5],  [8, 7],[3, 6],  [8, 8], [7, 3], [4,5]])clustering = OPTICS(min_samples=2).fit(X)print(clustering.core_distances_)
'''
array([3.16227766, 1.41421356, 1.  , 1.41421356, 1.  ,3.60555128, 1.41421356])
'''print(clustering.ordering_)
'''
array([0, 1, 3, 6, 5, 2, 4])
'''print(clustering.reachability_)
'''
array([inf, 3.16227766, 4.12310563, 1.41421356, 1.        ,3.60555128, 1.41421356])
'''print(clustering.labels_)
'''
array([0, 0, 1, 0, 1, 0, 0])
'''

根据图3,选择 eps=3.8,使用DBSCAN算法验证如下:

import sklearndb = sklearn.cluster.DBSCAN(eps=3.8,min_samples=2).fit(X)
db.labels_## array([0, 0, 1, 0, 1, 0, 0])

参考资料

[1] https://blog.csdn.net/PRINCE2327/article/details/110412944

 


http://chatgpt.dhexx.cn/article/YKnByYlU.shtml

相关文章

sklearn聚类之OPTICS算法

文章目录 简介sklearn实现cluster_optics_dbscan 简介 OPTICS算法,全称是Ordering points to identify the clustering structure,是一种基于密度的聚类算法,是DBSCAN算法的一种改进。 众所周知,DBSCAN算法将数据点分为三类&…

聚类算法——OPTICS

网上很多关于OPTICS算法的资料,学习了很多博客之后总感觉不太合自己口味,因此整理了一篇博文供总结和复习,如能有幸帮助到其他人便是荣幸之至,如有错误,不吝指出。阅读此文需要了解“聚类”,“基于密度聚类…

JS获取url参数(简单、实用)

// js获取url传参参数function GetQueryString(name) {var reg new RegExp("(^|&)" name "([^&]*)(&|$)");// Location 对象是 Window 对象的一个部分,可通过 window.location 属性来访问。var r window.location.search.substr(…

js获取url参数值的两种方式详解

有个url如下: http://passport.csdn.net/account/login?fromhttp%3a%2f%2fwrite.blog.csdn.net%2fpostedit 我们该如何获取from这个参数的值呢?在网上搜了下方法很简单,如下,第一种是通过正则,第二种通过切串放进数…

js获取url参数值的方法总结

js获取url参数值的方法总结 1、方式一:通过字符串截取的方式获取参数值;2、方式二:通过正则获取到参数值; 1、方式一:通过字符串截取的方式获取参数值; 1)、函数一:获取URL中的参数名…

Hyperlynx学习心得

1、Altium Designer文件导入Hyperlynx问题 众所周知AD的文件各大友厂商的文件对它都不咋友好~,很多SI、PI文件都不支持,但AD可以输出Hyperlynx文件供其使用、但也会存在一些问题。我遇到问题就是 AD中使用填充的铜皮在Hyperlynx中不识别,直接…

HyperLynx(二十五)电源完整性之直流压降分析(二)

1.后仿真的直流压降 2.批量直流压降分析 3.如何改善电压下降较多的设计 1.后仿真的直流压降 (1)打开HperLynx软件。从目录中打开 C:\PI_Trng\lab2\exer2\ post_dc_drop.hyp,单击“Open”按钮,当打开板子时被问到是否用Man- hattan-style布线连接没有布…

HyperLynx(二十二)DDR(五)DDRx总线时序模型设计

由于DDRx总线对时序的要求非常严格,随着速率的提升,时序的要求会更高。要使用DDRx批处理仿真器,需要创建控制器和DRAM颗粒的时序模型,时序模型文件后缀为“*.V”。 HyperLynx 提供两种方式进行时序模型的创建和编辑: 一种是在语…

HyperLynx(八)带状线串扰的仿真

1. 前面介绍的是微带线的串扰仿真,其实带状线的串扰与微带线的串扰有比较大的不同。主要是在拓扑结构中传输线TL2和TL5为带状线,分布在第三层,微带线与带状线通过过孔连接。带状线的仿真拓扑如图所示: 叠层信息如图所示&#xff…

HyperLynx(二十八)板层噪声分析和SI/PI联合仿真实例

板层噪声分析和SI/PI联合仿真实例 1.前仿真噪声分析 2.后仿真噪声分析 3.设置和运行SI/PI联合仿真 4.执行信号过孔旁路分析 1.前仿真噪声分析 (1)从“开始”菜单中打开HyperLynx:“开始”→“所有程序”一“Mentor Graphics SDD”→“HyperLynx”→“HyperLynx Simulation S…

基于Hyperlynx VX.2.5 的DDR3仿真之一:Verifying That the Software Recognizes Your Design Correctly

这是一篇基于Mentor公司 Hyperlynx VX.2.5 仿真软件针对Xilinx ZYNQ 的ZC702 PCB上DDR3内存布局布线的信号完整性仿真分析。层叠结构设置,关键信号的仿真分析,有助于我们了解基于 Hyperlynx 对 DDR3 进行信号完整性仿真的整个流程。 首先我们从实际出发…

HyperLynx(三十一)高速串行总线仿真(三)

高速串行总线仿真(三) 1.从一个多层板工程中验证串行通道 2.在多层板中设置连接器模型 1.从一个多层板工程中验证串行通道 在本例练习中,将集中研究从芯片到插件形成的串行发射通道,并分析它的性能。 (1)打开 HyperLynx 软件&a…

HyperLynx(五)反射仿真

1.反射仿真 1.学过物理的工程师都知道,光在传输过程中不在介质的表面会发生反射和折射现象,如图所示。同样,对于信号而言,信号在传递的的过程中,遇到阻抗不连续的点(不同的介质或不同的物理结构时),一部分…

HyperLynx(十八)DDR(一)DDR简介和DDR的数据仿真

1.DDR简介 2.DDR仿真概述 3.DDR数据仿真前的数据验证 4.DDR数据仿真具体步骤 1.DDR简介 DDR(双倍速率同步动态随机存储器)是一个内存名称,意思即双倍速率同步动态随机存储器,是内存的其中一种。 DDR 总线是由 SDRAM 发展而来的一…

HyperLynx(三十)高速串行总线仿真(二)

高速串行总线仿真(二) 仿真实例 1.探索多层板中的PCI-E串行通道 2.设置叠层以减小损耗 3.分析通道的不同配置对损耗的影响 4.检测驱动端规范 5.检查接收器规范 6.通过仿真得出整个通道的驱动约束限制 1.探索多层板中的PCI-E串行通道 在本节练习中&am…

HyperLynx(二十七)电源完整性之AC去耦仿真实例(二)

电源完整性之AC去耦仿真实例(二) 1.后仿真的去耦仿真 2.去耦电容在后仿真分析中的作用 3.使用QPL文件为去耦电容分配模型 4.如何设计好电源系统 1.后仿真的去耦仿真 (1)在“开始”菜单中打开HyperLynx:“开始”→“所有程序”→“Mentor Graphics SDD…

HyperLynx(十二)BoardSim和PCB板级仿真分析(三)

1.使用曼哈顿布线进行BoardSim仿真 2.快速分析整板的串扰强度 3.交互式串扰仿真 4.Gbit信号仿真 1.使用曼哈顿布线进行BoardSim仿真 前面讲述的分析,都是在已布线的PCB上进行的。实际上,对PCB进行信号完整性、串扰、EMC分析不一定要求在物理布线之后进行…

DDR3 HYPERLYNX SI仿真

HYPERLYNX仿真DDR是非常的方便,有固定的模板可以用,这里就大致的过程和大家分享下。 ①导入PCB的数据,设置叠层,设置下电源 ②设置完成打开DDR batch-mode wizard ③本次仿真的是DDR3L,800MT。 ④添加控制器和DDR ⑤添加模型 ⑥…

HyperLynx(十一)BoardSim和PCB板级仿真分析(二)

BoardSim和PCB板级仿真分析(二) 1.设置模型 2.提取原理图 3.查看信号网络的属性 4.快速添加端接 5.普通信号网络批量仿真设置 1.设置模型 在BoardSim 中对元器件赋模型的基本方法与在 LineSim中的一样,但其中增加了特殊的部分,…

HyperLynx(六)参数扫描仿真

HyperLynx可以很好地完成原理图和PCB的串扰仿真,也非常方便PCB设计过程中批量地仿真串扰。 **耦合长度:**不管是在同一层上,还是在空间上,其耦合长度都是传输线之间相互平行的耦合区域的长度。 **串扰饱和长度:**串扰…