基于密度的聚类算法(1)——DBSCAN详解
基于密度的聚类算法(2)——OPTICS详解
基于密度的聚类算法(3)——DPC详解
1. OPTICS简介
上一节介绍的DBSCAN算法中,较小的eps将建立更多的簇,而较大的eps将吞并较小的簇建立更大的簇。而OPTICS(Ordering Points to identify the clustering structure)算法,翻译为对点排序以确定簇结构,是对DBSCAN的一种优化,可以理解为将eps从单个值放宽到范围值。
OPTICS是DBSCAN聚类的改进算法,其对输入参数不敏感。此外,对只要确定minPts的值,半径eps的轻微变化,并不会影响聚类结果。OPTICS并不显式产生聚类簇,而是生成一个增广的簇排序(比如,以可达距离为纵轴,样本点输出次序为横轴的坐标图),这个排序代表了各样本点基于密度的聚类结构,从此排序中可以得到基于任何参数eps和minPts的DBSCAN算法的聚类结果。
OPTICS聚类:有效的解决了密度不同导致的聚类效果不好的问题。
核心距离:只有核心对象才有核心距离,在核心对象中,最小邻域内密度达到阈值时的半径值。 如果样本的核心距离小于半径则为核心点,否则不是核心点。
可达距离:只有核心对象才有可达距离,用于对样本点排序;
聚类顺序 : 从 低层 到 高层 ; 从 稠密 到 稀疏 ;
聚类时 , 低层 聚类分组 先构建完成 , 也就是半径 ε 参数较小的聚类分组 ;
密度可达的两种情况情况 :
① ε 参数小 : ε 参数较小的时两个样本就密度可达 ;
② ε 参数大 : ε 参数取值很大时 , 才密度可达 ;
扩展样本优先级 : 扩展样本对象时 , 优先选择第一种情况 , ε 参数较小的时就可密度可达的样本 ;
每个样本对象需要存储两个值 : 核心距离 与 可达距离 。
2. OPTICS算法流程及python、matlab代码实现:
(1) 创建两个队列,有序队列和结果队列。
-
有序队列用于存储core points及其密度直达points, 并按可达距离升序排列。有序队列中的points为待处理样本;
-
结果队列用于存储样本点的输出次序。结果队列中的points为处理之后的样本;
(2) 选取一个未处理的core point, 将其放入结果队列,同时计算邻域内样本点的可达距离,按照可达距离升序将样本点依次放入有序队列。
(3) 若有序队列为空,则回到步骤2(重新选取处理数据)。否则,从有序队列中提取第一个样本,如果为core point, 则计算可达距离,将可达距离最小的点放入结果队列。如果不是core point, 则重复步骤2;
-
如果有序队列中已经存在直接密度可达点,如果此时新的可达距离小于旧的可达距离,则用新可达距离取代旧可达距离,有序队列重新排序(因为一个对象可能有多个核心对象可达);
-
如果有序队列中不存在该直接密度可达样本点,则插入该点,并对有序队列重新排序;
(4) 迭代(2),(3),直到数据集中所有点都处理完成,则算法结束,输出结果队列中有序样本点。
可以从python 的sklearn库中调用OPTICS 函数:
class sklearn.cluster.OPTICS(min_samples=5, max_eps=inf, metric=‘minkowski’, p=2, metric_params=None, cluster_method=‘xi’, eps=None, xi=0.05, predecessor_correction=True)
from sklearn.cluster import OPTICS
import numpy as np
X = np.array([[1, 2], [2, 5], [3, 6], [8, 7], [8, 8], [7, 3]])
clustering = OPTICS(min_samples=2).fit(X)
clustering.labels_
array([0, 0, 0, 1, 1, 1])
此外, 在matlab中OPTICS函数为:
% [RD,CD,order]=optics(x,k)
% -------------------------------------------------------------------------
% Aim:
% Ordering objects of a data set to obtain the clustering structure
% -------------------------------------------------------------------------
% Input:
% x - data set (m,n); m-objects, n-variables
% k - number of objects in a neighborhood of the selected object
% (minimal number of objects considered as a cluster)
% -------------------------------------------------------------------------
% Output:
% RD - vector with reachability distances (m,1)
% CD - vector with core distances (m,1)
% order - vector specifying the order of objects (1,m)
% -------------------------------------------------------------------------
% Example of use:
% x=[randn(30,2)*.4;randn(40,2)*.5+ones(40,1)*[4 4]];
% [RD,CD,order]=optics(x,4)
% -------------------------------------------------------------------------
% References:
% [1] M. Ankrest, M. Breunig, H. Kriegel, J. Sander,
% OPTICS: Ordering Points To Identify the Clustering Structure,
% available from www.dbs.informatik.uni-muenchen.de/cgi-bin/papers?query=--CO
% [2] M. Daszykowski, B. Walczak, D.L. Massart, Looking for natural
% patterns in analytical data. Part 2. Tracing local density
% with OPTICS, J. Chem. Inf. Comput. Sci. 42 (2002) 500-507
% -------------------------------------------------------------------------
% Written by Michal Daszykowski
% Department of Chemometrics, Institute of Chemistry,
% The University of Silesia
% December 2004
% http://www.chemometria.us.edu.pl
function [RD,CD,order,D]=optics(x,k)
[m,n]=size(x); % m=70,n=2
CD=zeros(1,m);
RD=ones(1,m)*10^10;
% Calculate Core Distances
for i=1:m
D=sort(dist(x(i,:),x));
CD(i)=D(k+1); % 第k+1个距离是密度的界限阈值
end
order=[];
seeds=[1:m];
ind=1;
while ~isempty(seeds)
ob=seeds(ind);
%disp(sprintf('aaaa%i',ind))
seeds(ind)=[];
order=[order ob]; % 更新order
var1 = ones(1,length(seeds))*CD(ob);
var2 = dist(x(ob,:),x(seeds,:));
mm=max([var1;var2]); % 比较两个距离矩阵,选择较大的距离矩阵
ii=(RD(seeds))>mm;
RD(seeds(ii))=mm(ii);
[i1 ind]=min(RD(seeds));
%disp(sprintf('bbbb%i',ind))
end
RD(1)=max(RD(2:m))+.1*max(RD(2:m));
function [D]=dist(i,x)
% function: [D]=dist(i,x)
%
% Aim:
% Calculates the Euclidean distances between the i-th object and all objects in x
% Input:
% i - an object (1,n)
% x - data matrix (m,n); m-objects, n-variables
%
% Output:
% D - Euclidean distance (m,1)
[m,n]=size(x);
D=(sum((((ones(m,1)*i)-x).^2)')); % 距离和
if n==1
D=abs((ones(m,1)*i-x))';
end
3. OPTICS的应用
利用OPTICS聚类算法,无需预先确定聚类数目;而且还可以根据计算的结果(可达距离的分布)来看出密度结构,以分析自动确定的聚类数目的合理性。
下面给出一组结果(做了一些可视化工作),以显示OPTICS 聚类算法的效果:
![](https://img-blog.csdnimg.cn/09b1a50eec6f4c0eb10a77b3705c9165.png)
![](https://img-blog.csdnimg.cn/ebd5c176fadb4c58bcd71412c9ebd206.png)
![](https://i-blog.csdnimg.cn/blog_migrate/40283dd8449bfb73df4a097673de86cd.png)
4. 总结
OPTICS是基于DBSCAN改进的一种密度聚类算法,对参数不敏感。当需要用到基于密度的聚类算法时,可以作为DBSCAN的一种替代的优化方案,以实现更优的效果。