zoukankan      html  css  js  c++  java
  • 基于密度的optics聚类算法

      DBSCAN有一些缺点,如:参数的设定,比如说阈值和半径  这些参数对结果很敏感,还有就是该算法是全局密度的,假若数据集的密度变化很大时,可能识别不出某些簇。如下图:

     

      核心距离:假定P是核心对象,人为给定一个阈值A,然后计算关于P点满足阈值A的最小的半径R,即在R内,P最少有给定A个点数。

     

      可达距离:对象q到对象p的可达距离是指p的核心距离和p与q之间欧几里得距离之间的较大值。如果p不是核心对象,p和q之间的可达距离没有意义。

                                                                                                                                                               

     

     

      核心距离:假若半径ξ=8 阈值MinPts=5

    则有图而知:P是核心对象(在半径8内,P的近邻对象个数>5),并且P的核心距离为4   因为在半径4内,有四个近邻点,满足阈值5

    最小的阈值确定和核心距离

     

     

    算法

    注意:一个点有多个可达距离,选取最小的距离,因为最小的距离就是给点距离最近的一个簇的距离。

     

    OPTICS算法的难点在于维护核心点的直接可达点的有序列表。算法的计算过程如下:

     

    输入:数据样本D,初始化所有点的可达距离和核心距离为MAX,半径ε,和最少点数MinPts。

     

    1、建立两个队列,有序队列(核心点及该核心点的直接密度可达点),结果队列(存储样本输出及处理次序)

    2、如果D中数据全部处理完,则算法结束,否则从D中选择一个未处理且未核心对象的点,将该核心点放入结果队列,该核心点的直接密度可达点放入有序队列,直接密度可达点并按可达距离升序排列;

    3、如果有序序列为空,则回到步骤2,否则从有序队列中取出第一个点;

    3.1 判断该点是否为核心点,不是则回到步骤3,是的话则将该点存入结果队列,如果该点不在结果队列;

    3.2 该点是核心点的话,找到其所有直接密度可达点,并将这些点放入有序队列,且将有序队列中的点按照可达距离重新排序,如果该点已经在有序队列中且新的可达距离较小,则更新该点的可达距离。

    3.3 重复步骤3,直至有序队列为空。

    4、算法结束。

     

    预先筛选出数据集中的核心对象,然后计算每个核心对象的核心距离。进而执行算法。

     

     

    输出结果

     

    给定半径ε,和最少点数MinPts,就可以输出所有的聚类。

     

    计算过程为:

     

    给定结果队列

     

    1、从结果队列中按顺序取出点,如果该点的可达距离不大于给定半径ε,则该点属于当前类别,否则至步骤2;

    2、如果该点的核心距离大于给定半径ε,则该点为噪声,可以忽略,否则该点属于新的聚类,跳至步骤1;

    3、结果队列遍历结束,则算法结束。

    基于matlab的代码:

    % Function: 
    % [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

    这个是根据个人理解的主要思路

  • 相关阅读:
    不记住密码
    在Docker中进行Redis主从配置
    Spring Boot系列(8)——RabbitMQ确认、退回模式及死信队列
    RabbitMQ基础
    CentOS只有lo和ens33网卡的解决方案
    Spring Boot系列(7)——自定义异常反馈
    Spring Boot系列(6)——Configurer和Customizer
    以form表单重用方式进行数据列表行删除
    Spring Boot系列(5)——Restful CURD注意事项
    Spring Boot系列(4)——实现国际化
  • 原文地址:https://www.cnblogs.com/zhangruilin/p/5817784.html
Copyright © 2011-2022 走看看