基于密度的聚类算法(2)——OPTICS详解

基于密度的聚类算法(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) 创建两个队列,有序队列和结果队列。

  1. 有序队列用于存储core points及其密度直达points, 并按可达距离升序排列。有序队列中的points为待处理样本;

  2. 结果队列用于存储样本点的输出次序。结果队列中的points为处理之后的样本;

(2) 选取一个未处理的core point, 将其放入结果队列,同时计算邻域内样本点的可达距离,按照可达距离升序将样本点依次放入有序队列。

(3) 若有序队列为空,则回到步骤2(重新选取处理数据)。否则,从有序队列中提取第一个样本,如果为core point, 则计算可达距离,将可达距离最小的点放入结果队列。如果不是core point, 则重复步骤2;

  1. 如果有序队列中已经存在直接密度可达点,如果此时新的可达距离小于旧的可达距离,则用新可达距离取代旧可达距离,有序队列重新排序(因为一个对象可能有多个核心对象可达);

  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 聚类算法的效果:

基于密度的聚类算法(2)——OPTICS详解_第1张图片
基于密度的聚类算法(2)——OPTICS详解_第2张图片
基于密度的聚类算法(2)——OPTICS详解_第3张图片

基于密度的聚类算法(2)——OPTICS详解_第4张图片

4. 总结

OPTICS是基于DBSCAN改进的一种密度聚类算法,对参数不敏感。当需要用到基于密度的聚类算法时,可以作为DBSCAN的一种替代的优化方案,以实现更优的效果。

你可能感兴趣的:(聚类,算法)