网上很多关于OPTICS算法的资料,学习了很多博客之后总感觉不太合自己口味,因此整理了一篇博文供总结和复习,如能有幸帮助到其他人便是荣幸之至,如有错误,不吝指出。阅读此文需要了解“聚类”,“基于密度聚类”和DBSCAN算法的前置知识。
基于密度聚类的思想源于大名鼎鼎的DBSCAN算法,DBSCAN之所以可以成为基于密度算法的“父类”和基础,是因为提出的概念和扩展簇的方式奠定了这类聚类算法的核心思想,其他适应于不同数据或更自适应的基于密度的聚类算法是在这个核心思想上的改进与扩展。网上关于DBSCAN聚类的步骤讲解十分详细,作为基于密度聚类算法的开山之作,其操作十分简单,策略也十分便于理解,因此,DBSCAN聚类的策略在此不再赘述。
DBSCAN算法的关键参数有两个,即(邻域半径) 和Minpts(成为核心点的邻居数量阈值)。DBSCAN的核心思想一言以蔽之:首先,提取出所有范围内超过Minpts个邻居的点,称为核(心)点;然后,从任一核点出发将其邻居聚为一簇,从邻居中的任一核点出发继续扩展该簇,直到簇内点无法向外扩展,便形成了一个簇;最后,重新选择簇外没被访问过的核点形成另一个新簇,重复上一步和这一步操作,直到数据集中所有核点都被访问过(分配到簇)。
上述过程中很容易看出,(1)参数 和Minpts是作用全局的,即天然地假设全局的核点及簇(核点及其邻居构成簇)都具有相同密度阈值(Minpts/,这也是为什么被称为”基于密度的聚类算法“的原因);(2)扩展过程是具有随意性的,从任一核心邻居出发扩展,不会从最稠密的地方开始扩展;(3) 参数 和Minpts是直接作用于形成簇的,因此簇的识别结果严重依赖于参数 和Minpts。DBSCAN识别不了下面这种情况,给定Minpts时, 太大时,识别结果为C1、C2、C3; 太小时,识别结果为C1、C2,原本的C1与C2会认为是噪声。
为了解决上述问题,“子类”的OPTICS算法应运而生。为了了解OPTICS算法的作用机制,首先梳理一下OPTICS算法的扩展概念与步骤。
核点: 半径范围内超过Minpts个邻居的点,这里和DBSCAN核点概念相同,核点 范围内的其他点称为核点的邻居点。
直接可达:核点直接可达至邻居点。
密度可达:a直接可达至b,b直接可达至c...d直接可达至f,称为a密度可达至f,可以称a密度可达至c……
核心距离:核点p0与其第Minpts近的邻居点的距离cd(p0),核心距离定义依赖于核点定义,非核点没有核心距离。易知,cd(p0) ≤。
可达距离:核点p0与其邻居点p1的真实距离(一般为欧氏距离)d(p0,p1)与核心距离cd(p0)中较大的称为p1到p0的可达距离rd(p1,p0)。易知,核心距离内(前第Minpts近的)邻居点到核点可达距离为固定值cd(p0),核心距离外邻居点到核点可达距离为真实距离d(p0,p1)。图示:
输入(input)
输出(output)
流程(process)
0. 定义
R={}; //预设结果队列为空
S={}; //预设处理队列为空
R_rs=[]; //结果队列样本对应的可达距离;
S_rs=[]; //处理队列样本对应的可达距离;
V=[0,0,...,0]; //预设访问序列全为0,n维行向量
1.计算结果队列
while 存在核点未被访问
随机抽取点pi (i∈ind)
if pi是核点 & vi==0 // pi是未访问过的核点
vi=1 //记录为被访问过
S=[S, pi, SN(pi|v==0)] // 将pi及其未访问的直接可达点(邻居点)加入处理队列S
计算SN(pi|v==0)到pi的可达距离
更新S_rs
while S不为空
select rs(pj) = min(S_rs) //选择可达距离最小的点pj作为下一次扩展的“核”
vj=1 //记录为被访问过
S→pj //在处理队列中取出pj
R=[R, pj] //将pj输出到结果队列
S_rs→rs(pj) //删除pj对应的该条可达距离
R_list=[R_list, rs(pj)] //输出pj到之前核点的可达距离,即当前S中最小的可达距离
if pj是核点
S=[S, SN(pj|v==0)] // 将pj的未访问直接可达点(邻居点)加入处理队列S
计算SN(pi|v==0)到pj的可达距离
更新S_rs //如果某点p已存在于S且rs(p,pj)
2. 绘制可达距离曲线图
横轴为输出顺序,纵轴为可达距离。可以观察指定时的聚类情况,每一个山谷都是一个簇;同时最重要的是,可以观察指定 ( ≤ )时聚类效果。
如下图,在指定Minpts不变情况下:邻域半径为 时,数据集DS聚为3类; 邻域半径为 ,数据集DS聚为5类。最终根据结果队列的输出样本ID确定聚类结果。
1. 为什么引入可达距离?其作用是?
从上述OPTICS算法流程中可以看出,相对于DBSCAN算法,OPTICS在“通过pj扩展簇”的步骤中不同之处在于优先扩展最近的邻居。一般而言,在面积一定的情况下,簇越稠密(密度越大),其样本间距离越小,在OPTICS中表现为可达距离越小。因此,引入可达距离并选择最小的邻居进行聚类,是为了首先聚选定点周围最稠密的地方,实现了对指定 不敏感的“由密到疏”的簇认知。
2. 如何理解OPTICS算法中邻域半径 的作用?
OPTICS中邻域半径 相当于设定了一个宽松的约束,可以认为是“最稀疏的簇间密度下限为Minpts/”,在此基础上,通过可达距离的认知实现更加稠密的簇的优先扩展。