zoukankan      html  css  js  c++  java
  • 密度聚类算法

    (2017-08-29 银河统计)

    密度聚类算法,DBSCAN(Density-Based Spatial Clustering of Applications with Noise,具有噪声的基于密度的聚类方法)是一种很典型的密度聚类算法,和K-Means只适用于凸样本集的聚类方法相比,DBSCAN既可以适用于凸样本集,也可以适用于非凸样本集。下面我们就对DBSCAN算法的原理做一个总结。

    DBSCAN是一种基于密度的聚类算法,这类密度聚类算法一般假定类别可以通过样本分布的紧密程度决定。同一类别的样本,他们之间的紧密相连的,也就是说,在该类别任意样本周围不远处一定有同类别的样本存在。通过将紧密相连的样本划为一类,这样就得到了一个聚类类别。通过将所有各组紧密相连的样本划为各个不同的类别,则我们就得到了最终的所有聚类类别结果。DBSCAN算法在大规模数据库上更好的效率。DBSCAN能够将足够高密度的区域划分成簇,并能在具有噪声的空间数据库中发现任意形状的簇。

    一、DBSCAN算法基本术语##

    DBSCAN是基于一组邻域来描述样本集的紧密程度的,参数(ϵ, MinPts)用来描述邻域的样本分布紧密程度。其中,ϵ描述了某一样本的邻域距离阈值,MinPts描述了某一样本的距离为ϵ的邻域中样本个数的阈值。

    1、ϵ-邻域:对于$x_j∈D$,其ϵ-邻域包含样本集$D$中与$x_j$的距离不大于ϵ的子样本集,即$Nϵ(x_j)={x_i∈D|distance(x_i,x_j)≤ϵ}$, 这个子样本集的个数记为$|Nϵ(x_j)|$。
    2、核心对象:对于任一样本$x_j∈D$,如果其ϵ-邻域对应的$Nϵ(_xj)$至少包含$MinPts$个样本,即如果$|Nϵ(x_j)|≥MinPts$,则$x_j$是核心对象。
    3、密度直达:如果$x_i$位于$x_j$的ϵ-邻域中,且$x_j$是核心对象,则称$x_i$由$x_j$密度直达。注意反之不一定成立,即此时不能说$x_j$由$x_i$密度直达, 除非且$x_i$也是核心对象。
    4、密度可达:对于$x_i$和$x_j$,如果存在样本样本序列$p_1,p_2,...,p_T$,满足$p_1=x_i,p_T=x_j$, 且$p_t+1$由$p_t$密度直达,则称$x_j$由$x_i$密度可达。也就是说,密度可达满足传递性。此时序列中的传递样本$p_1,p_2,...,p_{T−1}$均为核心对象,因为只有核心对象才能使其他样本密度直达。注意密度可达也不满足对称性,这个可以由密度直达的不对称性得出。
    5、密度相连:对于$x_i$和$x_j$,如果存在核心对象样本$x_k$,使$x_i$和$x_j$均由$x_k$密度可达,则称$x_i$和$x_j$密度相连。注意密度相连关系是满足对称性的。

    从下图可以很容易看出理解上述定义,图中MinPts=5,红色的点都是核心对象,因为其ϵ-邻域至少有5个样本。黑色的样本是非核心对象。所有核心对象密度直达的样本在以红色核心对象为中心的超球体内,如果不在超球体内,则不能密度直达。图中用绿色箭头连起来的核心对象组成了密度可达的样本序列。在这些密度可达的样本序列的ϵ-邻域内所有的样本相互都是密度相连的。

    二、DBSCAN算法定义、思路和流程##

    1、算法定义

    DBSCAN是基于一组邻域来描述样本集的紧密程度的,参数(ϵ, MinPts)用来描述邻域的样本分布紧密程度。其中,ϵ描述了某一样本的邻域距离阈值,MinPts描述了某一样本的距离为ϵ的邻域中样本个数的阈值。

    假设我的样本集是(D=(p_1,p_2,...,p_m)),则DBSCAN具体的密度描述定义如下:

    I. 对于空间中的一个对象,如果它在给定半径ϵ-邻域中的对象个数大于密度阀值MinPts,则该对象被称为核心对象,否则称为边界对象。
    II. 如果p是一个核心对象,q属于p的邻域,那么称p直接密度可达q。
    III. 如果存在一条链…..,$p_i$>,满足$p_{_1}=p,p_i=q,p_i$直接密度可达$p_i+1$,则称p密度可达q。
    IV. 如果存在o,o密度可达q和p,则称p和q是密度连通的。
    V. 由一个核心对象和其密度可达的所有对象构成一个聚类。

    2、算法思路

    从数据集D中的任意一个点P开始,查找D 中所有关于ϵ-邻域(最小半径)和MinPts(密度阈值)的从P密度可达的点。若P是核心点,则其邻域内的所有点和P同属于一个簇,这些点将作为下一轮的考察对象(即种子点),并通过不断查找从种子点密度可达的点来扩展它们所在的簇,直至找到一个完整的簇;若P不是核心点,即没有对象从P密度可达,则P被暂时地标注为噪声。然后,算法对D 中的下一个对象重复上述过程⋯⋯ 。当所有种子点都被考察过,一个簇就扩展完成了。此时,若D中还有未处理的点,算法则进行另一个簇的扩展;否则,D 中不属于任何簇的点即为噪声。

    3、算法流程

    I. 数据输入:D - 数据集合,ϵ - 半径,MinPts - 给定点在ϵ-邻域半径内称为核心对象的最小领域点数; II. 判断输入点是否为核心对象、找出核心对象ϵ-邻域中所有密度直接可达点; III. 针对所有核心对象ϵ-邻域中的所有密度直接达点找到最大密度相连对象集合(簇),按密度直接达和密度可达顺序合并一些可达对象。

    三、DBSCAN算法案例##

    数据样本如下表(数据表I):

    序号属性1属性2
    121
    251
    312
    422
    532
    642
    752
    862
    913
    1023
    1153
    1224

    样本散点图如下:

    令ϵ = 1,MinPts = 4,试用密度聚类算法对样本进行分类。

    样本间欧几里得距离矩阵表如下(数据表II):

    i/j 1 2 3 4 5 6 7 8 9 10 11 12
    1 0 3 1.41 1 1.41 2.24 3.16 4.12 2.24 2 3.61 3
    2 3 0 4.12 3.16 2.24 1.41 1 1.41 4.47 3.61 2 4.24
    3 1.41 4.12 0 1 2 3 4 5 1 1.41 4.12 2.24
    4 1 3.16 1 0 1 2 3 4 1.41 1 3.16 2
    5 1.41 2.24 2 1 0 1 2 3 2.24 1.41 2.24 2.24
    6 2.24 1.41 3 2 1 0 1 2 3.16 2.24 1.41 2.83
    7 3.16 1 4 3 2 1 0 1 4.12 3.16 1 3.61
    8 4.12 1.41 5 4 3 2 1 0 5.1 4.12 1.41 4.47
    9 2.24 4.47 1 1.41 2.24 3.16 4.12 5.1 0 1 4 1.41
    10 2 3.61 1.41 1 1.41 2.24 3.16 4.12 1 0 3 1
    11 3.61 2 4.12 3.16 2.24 1.41 1 1.41 4 3 0 3.16
    12 3 4.24 2.24 2 2.24 2.83 3.61 4.47 1.41 1 3.16 0
    MinPts 1 1 2 4 2 2 4 1 2 3 1 1

    密度聚类分析:

    I、 核心对象为样本4和样本7;
    II、 样本4密度直达样本为样本1、3、4、5、10;
    III、样本7密度直达样本为样本2、6、7、8、11;
    IV、样本4的密度直达样本3和样本9密度直达、样本6和样本5密度直达、样本10和样本12密度直达,所有样本4和样本9、6、12密度可达。这样,样本1、3、4、5、9、10、12聚类为一簇(有样本4本身、4个直接可达、2个间接可达样本构成)。样本6和另一个核心对象样本7密度直达,应归为另一个簇;
    V、样本7的密度直达样本6和样本5密度直达,样本7和样本5密度可达。但由于样本5和核心对象样本4密度直达,所以样本5属于以样本4为核心对象的簇。

    综合上述分析,样本聚类为两个簇{1、3、4、5、9、10、12}和{2、6、7、8、11}。

    四、DBSCAN算法API接口##

    应用程序接口(API:application programming interface)是一组定义、程序及协议的集合,通过 API 接口实现计算机软件之间的相互通信。API 的一个主要功能是提供通用功能集。程序员通过使用 API 函数开发应用程序,从而可以避免编写无用程序,以减轻编程任务。

    基于互联网的应用正变得越来越普及,在这个过程中,有更多的站点将自身的资源开放给开发者来调用。对外提供的API 调用使得站点之间的内容关联性更强。开放是目前的发展趋势,越来越多的产品走向开放。目前的网站不能靠限制用户离开来留住用户,开放的架构反而更增加了用户的粘性。在Web 2.0的浪潮到来之前,开放的API 甚至源代码主要体现在桌面应用上,而现在越来越多的Web应用面向开发者开放了API。

    通过开放的API 来让站点提供的服务拥有更大的用户群和服务访问数量。站点在推出基于开放API 标准的产品和服务后,无需花费力气做大量的市场推广,只要提供的服务或应用出色易用,其他站点就会主动将开放API 提供的服务整合到自己的应用之中。同时,这种整合API 带来的服务应用,也会激发更多富有创意的应用产生。开放API 的站点为第三方的开发者提供良好的社区支持也是很有意义的,这有助于吸引更多的技术人员参与到开放的开发平台中,并开发出更为有趣的第三方应用。

    银河统计工作室陆续推出数据挖掘、统计随机数及临界值、房地产数据等API接口服务,下面详细介绍DBSCAN算法API接口用法。

    1、DBSCAN算法API接口样例及参数解释

    I、接口样例

    URL:http://api.galaxystatistics.com:8882/?token=098f6bcd4621d373cade4e832627b4f6&type=13&var_name=dbscanMethod&data_str=2,1|5,1|1,2|2,2|3,2|4,2|5,2|6,2|1,3|2,3|5,3|2,4&oEps=1&oMinPts=4
    

    注:在浏览器中运行接口样例字符,可返回上传样本密度聚类结果

    II、接口参数说明

    API接口域名网址:

        http://api.galaxystatistics.com

    端口号:

        8882        # 不同的接口,会使用不同的端口号

    公共测试用Key:

        token=098f6bcd4621d373cade4e832627b4f6

    数据类型:

        type=13     # 不同聚类方法的api接口,采用不同的type值【如:11、12、13】

    输出变量名:

        var_name=hclustMethod       # 根据程序需求,自定义变量名称【如:hclustMethod、kmeansMethod、dbscanMethod】

    模型方法参数:

    
    data_str                    # 数据字符串
    oEps # 邻域半径[eps]
    oMinPts # 判断核心点阈值[MinPts]

    2、DBSCAN算法API回传数据样例及参数解释

    I、回传数据样例(JSON)

    var dbscanMethod={"No":[1,3,4,5,9,10,12,2,6,7,8,11],"SType":[1,1,1,1,1,1,1,2,2,2,2,2],"X1":[2,1,2,3,1,2,2,5,4,5,6,5],"X2":[1,2,2,2,3,3,4,1,2,2,2,3]}
    

    II、回传数据参数说明

    回传数据变量名称:

        dbscanMethod  #由接口参数var_name指定

    样本序号:

        No        # 按聚类类别排序

    聚类类别:

        SType  #为数组对象

    数据列1:

        X1     # 样本变量1数组

    数据列2:

        X2     # 样本变量2数组

    五、DBSCAN算法API接口运用##

    格式化样本数据(参见数据表I)字符(属性变量分隔符为“,”、行分隔符为“|”)
    核半径  核心点阈值  

    注:按格式输入样本数据,设置适当核半径和核心点阈值,点击“密度聚类列表”,自动按DBSCAN算法API接口格式递交数据,并解析回传数据、用列表展示聚类分析结果

    核半径和核心点阈值的设置对DBSCAN算法聚类结果影响非常大。如果核心点阈值设置的偏大、或核半径偏小,则没有核心对象,所有样本将被判别为孤立点(分类为0);核心点阈值设置的偏小、或核半径偏大,则核心对象多,样本容易被并为同类、甚至所有样本被聚为一类。

    在DBSCAN算法API接口运用模板中,可以试着将核心点阈值改为3、5、6观察密度聚类效果。也可以将核半径改为0.5、2观察聚类效果。

    关于R聚类内容参见银河统计之聚类分析 - 用R构建Shiny应用程序

  • 相关阅读:
    PhpStudy升级MySQL5.7
    C# 字符串操作详解
    字符串留用与字符串池
    C# 字符串操作基本过程(Equals、Compare、EndsWith等处理方法)
    CLR关于语言文化的类型一CultureInfo类和字符串与线程的关联
    字符、字符串和文本的处理之Char类型
    二、LINQ之查询表达式基础
    一、Linq简介
    Unity学习系列一简介
    C# 静态构造函数
  • 原文地址:https://www.cnblogs.com/cloudtj/p/7446972.html
Copyright © 2011-2022 走看看