基于区域比例的聚类方法
DBSCAN算法存在一定的不足。本文据此提出了一种基于DBSCAN的改进算法。相对于DBSCAN的eps半径以及密度阈值Minpts,本文使用了基于k最近邻的区域统计来动态的考量数据点,以此来代替DBSCAN中的eps邻域。区域统计能获得数据点的区域分布情况,使核心点的搜索能适应数据的区域分布,使得算法能够适应密度分布不均数据集的聚类。聚类从中心点扩展,从候选核心点中发掘核心点,从核心点扩展至密度边缘。核心点的发掘过程中,使用了区域比例的思想,在DBSCAN中,核心点被定义为eps半径内点数超过密度阈值的点。在密度稀疏区域,DBSCAN难以发现核心点。改进算法中,将核心点密度与中心点密度进行比较,来比较该区域与簇中心区域的数据分布情况,从而决定是否加入该簇,这种方法使得数据的聚类更符合数据的分布情况。KNN已的使用以及区域比例思想的引入使得改进算法的参数更加稳定。对于离群点,算法使用了所述的基于LOF的离群点检测方法对数据离群点进行检测。
1 基本概念
基于区域比例的聚类算法以DBSCAN为基础,其中有以下定义。
(3.3)
其中distance(p,i)为点p和第i个最近邻之间的距离函数,密度反映了点p附近的数据分布稀疏程度。本改进算法中使用欧氏距离作为距离的度量,均值距离越小,点的密度越大。基于LOF的离群点检测方法中得数据点的局部密度Ird(p)与此处定义的密度相同,即数据点的密度与局部密度相同。
(3.4)
算法中密度直接可达、密度可达、密度相连等的定义沿用之前所述DBSCAN中的定义。算法使用了4个参数:1)K,对象的近邻数。2)Minpts,密度阈值,MinPts<k。(3) α,密度比例,用于定义密度边界。(4) β,半径比例,用于确定核心点。
2算法思想
现实中的数据集很多是密度分布不均的大数据集,DBSCAN在聚类这类数据集时难以获得较好的聚类效果,故研究一种能对密度分布不均的大数据集进行有效聚类的算法需求迫切。本改进算法中充分考量区域数据分布,使用数据点的区·域统计代替eps半径的硬性指标,使算法可以对密度分布不均区域进行有效的聚类。为了提高区域搜索的效率,算法中提出了候选核心点的概念,提高了核心点搜索的准确性。算法中,首先搜索数据集,找到数据集中未标记的密度最大点,即中心点,将中心点定义为核心点,搜索核心点的k最近邻,并将其k最近邻加入种子队列,从种子队列中提取候选核心点,考量候选核心点,从候选核心点中挖掘核心点。核心点的选取必须满足两个条件。
(1)点在密度边缘之内。即:若当前点为p,点p的密度为density,当前的中心点为c,其密度为density(c),若
(3.5)
则点p在密度边缘之内,否则在密度边缘之外。
图3.3 半径比例
(2)在给定的密度半径的邻域内点的数目不少于密度阂值。若当前点为p,其搜索邻域R(P)定义为:点P与其第K最近邻kth的距离distance(p,kth)与密度半径β的乘积,即:
(3.6)
点p的R(p)邻域内的数据点数不小于Minpts。如图3.3所示为二维空间数据点,k=5, β=0.8,Minpts=3,点p与点kth的距离与密度比例β的乘积得到密度半径R(p)。点p的R(p)邻域内的数据点的数量大于3,等于Minpts,故点p为核心点。满足以上两个条件的候选核心点定义为核心点。通过核心点的区域搜索更新种子队列,直至没有新的点可以添加到任何簇,算法结束。算法中密度的定义使用了均值距离,淡化了区域对象分布对密度的影响,使改进算法参数具有鲁棒性,而候选核心点的定义,将搜索距离限制在核心点附近更密集的区域,可以提升聚类的质量。算法聚类过程中类的扩展从中心点开始,所以算法聚类结果与数据输入顺序无关。若参数设置得当,算法能发现任意形状的簇。
图3.4 算法流程图
3 算法描述
基于区域比例的聚类算法使用4个输入值作为参数,分别为,
(1)k,对象的近邻数。
(2)Minpts,密度阈值,Minpts<k。
(3)α,密度比例,用于定义密度边界, α∈[0,1]。
(4) β,半径比例,用于确定核心点, β∈[0,1]。
算法对导入的待聚类数据集维护一个密度列表,密度列表基于数据对象的密度计算公式3.3生成,并对密度进行排序。获得密度列表之后,算法计算各点的KNN,然后使用公式3.4计算各点的密度半径。然后基于密度列表进行离群点检测,标识出数据中的离群点,离群点检测方法如3.2节所述基于LOF的离群点检测方法,OutlierSearch函数完成离群点检测。算法流程图下图3.4所示。基于区域比例的聚类算法步骤如下:
(1)确定新簇的中心点cp。算法从密度列表中选取当前未标识类标记的点中密度最大的点作为当前簇的中心点。GetMaxPoint函数返回中心点搜索,若找不到返回-1,表示聚类完成。中心点确定后,算法从当前点扩展当前簇。函数SearchCluster完成中心点cp的扩展,伪代码如下。
输入:中心点
输出:从中心点扩展的簇
①搜索中心点的邻域,使用中心点邻域初始化种子队列。
②如果种子队列不为空则继续以下步骤,否则退出
③取种子队列中的第一个点,并标记该点。
④判断该点是否为核心点,如果为核心点,则搜索核心点邻域,并以邻域对象更新种子队列,否则不处理。
⑤从种子队列删除该点。
⑥重复2、3、4、5步骤,直至退出。
(2)构建候选核心点队列Cand_list。以中心点cp为核心点进行区域查询,函数SearchCondPoints返回区域查询结果,使用中心点的k最近邻中在密度边缘内的点,即满足公式3.5的点,构建候选核心点队列,并进行类标记。程序中使用Seeds表示队列,队列使用三个函数添加元素(AddToSeeds)、删除元素(DeleteFromSeeds)、判断队列是否空(IsSeedClear)来维护Seed。
(3)核心点辨识。设某点p∈Cand_list,若点p的密度半径dr(p)内包含的点的数目不小于Minpts,则将点p标识为核心点,并对核心点p进行区域查询,用查询结果更新候选核心点队列。IsCorePoint函数用来判断候选核心点是否被定义为核心点。核心点的辨识符合描述的两个条件。
(4)重复步骤(3)直至候选核心点队列Cand_list中的所有核心点都被辨识,即标识了中心点的所有密度可达点。至此,完成了一个类的聚类过程。
(5)重复(1)~(4)直至聚类完成。
《来源科技文献,经本人分析整理,以技术会友,广交天下朋友》