一种基于邻域的聚类算法

基本概念:

给定数据集D = {d1,d2 ,.. ,dn},p和q是D中的两个任意对象。我们使用欧氏距离来评估p和q之间的距离,表示为
dist(p,q)。 我们将首先给出k-最近邻集合和反向的定义k-最近邻集合。 尽管学术中给出了类似的定义,
我们把它们放在这里以方便读者理解我们的新算法。

下面是算法需要用到的以下定义:

  1. 定义1:(kNN) k近邻p的集合是k(k>0)的集合,由kNN(p)表示,换句话说,kNN(p)是D数据集中组成的一个集合对象。
    1. |kNN(p)| = k;
    2. p \notin kNN(p)
    3. o 和 o' 是第 ko'分别是p的第k和第k+1最近邻,则dist(p, o') \geq dist(p,o)
  2. 定义2:(反向k近邻的集合,或者简称为R-kNN).p的反向k近邻集合属于kNN包含p的集合,命名为R-kNN。
    1. R-kNN(p) = \{q \ \epsilon \ D \ |\ p\ \epsilon \ kNN(q)\ and \ p \neq q\}
    2. 请注意在学术中,反向kNN通常是简称为RNN,这里使用的是R-kNN而不是RNN,因为每个RNN集合都是在确定的k值基础上。
    3. kNN(p)和R-kNN(p)采用双向去探索关于对象p和它的邻近集合,一方面,kNN(p)是p自身的邻近点组成的集合,另一方面,R-kNN(p)表示的邻近结合点中包含p的点。这种双向描述任意的关系物体及其邻域给出了更清晰,更准确的位置图
      在本地和全局的数据集中,这取决于k的值,而不仅仅是使用kNN。 在下文中,我们将给出一个定义对象的邻居。
  3. 定义3:(r近邻,或者简称为rNB)。得到一个真实数字r,p的近邻集合关于(其余部分简称 w.r.t)r的关系成为rNM(p),是集合对象位于以p作为圆的中心点,r为半径的范围内的点。
    1. rNB(p)\ =\ \{q\ \epsilon \ D|dist(q,p)\ \leqslant \ r\ and\ q\ \neq \ p\}
  4. 定义4:(k近邻,简称kNB)。对于D数据集中的每个对象p,\exists o\ \epsilon \ kNN(p),\ r'\ =\ dist(p,o)使得\forall o'\ \epsilon \ kNN(p),dist(p,o')\leqr'.该p的k近邻被写作kNB(p),被定义为r'NB(p), kNB(p) = r'NB(p).我们称呼kNB(p)作为p的k近邻kNN(p)
    1. 定义3和定义4定义从两个不同角度定义两个不同形式的近邻:rNB(p)是被定义通过使用一个显性半径。相反,kNB(p)是被定义通过一个隐性半径,它是相当于被圆的局域给覆盖通过kNN(p)。很明显|kNB(p)|\ \geq \ k因为可能有多个物体位于邻域的边缘(圆)
  5. 定义5:(反向k近邻,简称R-kNB)。p是kNB包含p的对象集合,由R-kNB表示,可以写成
    1. R-kNB(p)\ = \{q\ \epsilon\ D|p\ \epsilon \ kNB(q)\ and\ p\neq q \}
    2. 同样,|R-kNB(p)|\ \geq \ |R-kNN(p)|
    3. 在数据集中的数据点能够被专业分类成三类:密集点、稀疏点、均匀点。直观的说,集群中的点是密集点或均匀点,集群边上上的点最可能是疏松点。离散点和噪音也是疏松点,目前,大多数基于密度的聚类算法(eg.DBSCAN)使用使用一种直观,直接的方法来测量密度,即数据对象密度是给定的邻域中包含的数据对象的数量半径。显然,这是一种绝对和全局密度。这样的密度测量使DBSCAN无法检测小的、密集的簇来自大而稀疏的星团。本文提出了一种新的测量方法密度:基于邻域的密度因子(或简单的ndf),它将我们的新聚类算法NBC的基础。
  6. 定义6:(基于邻域的密度因子,或简称为NDF)p点的NDF求法如下:
    1. NDF(p)\ =\ |R-kNB(p)|\ /\ |kNB(p)|
    2. 那么NDF的定义是什么呢?让我们来理解它:|kNB(p)|是数字p的k-最近邻域中的对象,是数字包含在p的k-最近邻域中的对象。对于大多数数据对象,这个值大约是k(根据定义4,它可能会更大,但不是小于k)。 | R-KNB(P)|是p反向k近邻中包含的对象数邻域,即将p作为其成员的对象的数量k-最近的邻域。对于不同的数据点,该值非常不一致。
      直观地,更大的| R-kNB(p)|是,这意味着更多的其他对象将p作为他们k个最近邻域的成员,即更密集的p
      邻域是,或更大的NDF(p)。在这种情况下,NDF(p)> 1. 对于均匀分布的点,如果q在kNB(p)中,则p最可能在kNB(q)中,因此,kNB(p)≈  R-kNB(p),即NDF(p)≈1。因此,NDF实际上是测量任何数据对象的邻域或数据对象的密度相对(非绝对)意义上的局部密度。此外,这样的测量是直观(易于理解),简单(易于实施)和有效(存在能够找到DBSCAN无法检测到的一些集群结构)。
    3. 为了证明NDF作为局部密度测量的能力,我们
      举一个图1中的例子。图1(a)是一个包含两个簇C1、C2的数据集,一种基于邻域的聚类算法_第1张图片
    4. 由图可看出:C1中的数据均匀分布; C2中的数据符合高斯分布分配。 图1(b)显示了数据集中所有数据点的NDF值。 如我们可以看到,集群C1内的数据点大约有NDF值等于1,而位于C1边界的数据点具有较小的NDF值。 对于群集C2,最密集的点靠近C2的质心,其具有最大的NDF值,而其他对象的NDF值较小,而且此外,从质心定位的点,它们的NDF值越小。使用NDF,在下文中,我们给出了三种类型数据的定义局部意义上的点:局部事件点,局部密集点和局部稀疏点。
  7. 定义7:(局部密集点,简称DP)对象P是局部密集点,如果它的NDF(P)大于1,我们也把p称为与kNB(p)有关的密点,NDP(p)越大,p的k邻域越密集。
  8. 定义8:(局部稀疏点,简称SP)p是局部稀疏点,如果它的NDF(p) < 1,我们称p为kNB(p)的局部稀疏点.NDP(q)越小,k近邻越稀疏。
  9. 定义9:(局部平均点,简称EP)p是局部平均点,如果它的NDF(p) = 1(或者接近于1),我们称p为kNB(p)的局部平均点
    1. 根据上面定义的概念,下面我们将介绍基于邻域的集群的概念。我们的定义遵循dbscan的方式。
  10. 定义10:(基于邻域密度直接可达)从数据集D中得到p、q点,满足一下要求,p是一个基于邻域直接可达
    1. q是一个DP或者EP
    2. p\ \epsilon\ kNB(q)
  11. 定义11:(领域可达)从数据集D中得到p、q点,p是一个领域可达来自q,如果有对象链p1,...,pn,p1=p,pn=q,这样pi可以从pi+1邻域可达
  12. 定义12:(基于邻域紧密连接)从数据集D中得到p、q点,p和q是基于邻域紧密连接,如果q是邻域可达来自p,k或者q是邻域可达来自p或者第三个对象o这样p和q都是邻域可达来自o
    1. 基于以上定义,现在我们能够定义基于领域聚类的定义
  13. 定义13:(基于领域聚类)得到一个数据集D,集群C 关于 k是D的非空子集
    1. 集群中的p、q,p和q是邻域可达
    2. 如果p\ \epsilon \ C并且q是领域可达来自p,则q\ \epsilon \ C
    3. 以上定义保证了簇是领域可达的最大集合对象关于k

NBC算法:NBC算法由两部分组成

1.评估NDF值。我们查找kNB和R-kNB来自目标集合,然后测量它的NDF。

2.聚类数据集。随机获取对象p(NDF(p)\ \geq \ 1),如果p是DP或EP,则新建一个新的簇(社团),表示为p的簇,并继续找其它的领域可达的来自p关于k,涉及到所有对象属于p集群的所有对象,如果p是一个SP,那么就把它放好暂时搁置,并继续检索下一个要处理的点,这是递归操作,直到发现所有集群,更具体地说,给定一个局部密集点或者平均点来自数据库,首先找到对象直接邻域可达来自p关于k。kNB中一批对象将被移动到p的集群中,然后找到另一个直接邻域可达可以从p的簇得到每个DP或EP在p的集群中,直到那里不再有对象可以添加到p的集群中。第二、从剩下的数据集中获取另一个DP或EP已构建另一个集群。当没有更过的DP或EP来获取创建集群,算法终止。不在集群中的点属于噪声或者是异常值,下图有NBC算法的伪代码。

这里,数据集指示聚类的数据集,k是NBC中用于评估kNB和R-kNB的唯一输入参数。 k的值可以由数据库中的专家在一开始或通过实验来设置。参数k的确定将在下一小节中讨论。 DPset保留当前处理的群集的DP或EP。 DPset中的对象用于扩展相应的集群。将DP或EP的kNB移动到当前群集后,将从DPset中删除它。在那里完全检测到群集
在DPset中不是对象。当NBC算法停止时,clst no属性为NULL的未分类对象被视为噪声或异常值。
NBC算法以CalcNDF函数开始计算kNB,
数据集中每个对象的R-kNB和NDF。在传统的指数结构中,
R * -Tree和X-tree通常用于提高kNB的效率
查询处理相对较低维度的数据集。但是,很少有索引结构在高维数据集上有效地工作。为了解决这个问题,我们采用基于单元格的方法来支持kNB查询处理。
数据空间被切割成高维单元格,VA文件[3]用于组织单元格。由于篇幅限制,我们忽略了这里的细节。

//伪代码
void NBC(DataSet, k){
    for each object p int Dataset{
        p.clst_no = NULL;//初始化集合中的每个对象
    }
    CalcNDF(Dataset, k);//计算NDF
    NoiseSet.empty();//初始化脏数据集合
    Cluster_count = 0;//初始化社团数量为0
    for each object p int Dataset{//扫描整个库
        if(p.clst_no != NULL or p.ndf < 1)
        {
            continue
        }
        p.clst_no = cluste_count;//标记一个新的社团
        DPSet.empty();//初始化DPset
        for each object q in kNB(p){//找出与p关联的社团
            q.clst_no = cluster_count;
            if(p.ndf >= 1){//ndf > 1加入
                DPset.add(q);
            }
        }
        while(Dpset != null){//继续扩展社团
            p = DPset.getFirstObject();
            for each object q int kNB(p){
                if(q.clst_no != NUll)
                    continue;
                q.clst_no = cluster_count;
                if(q.ndf >= 1)
                    DPset.add(q);
            }
            DPset.remove(p);
            }
            cluster_count++;
    }
        for each object p int Dataset{
            if(p.clst_no == NULL){
                NoiseSet.add(p);
            }
        }
    }
}

算法分析:

k值的意义?

k值的确定。参数k粗略地确定了
数据库中最小集群的大小。根据基于邻域的聚类概念和NBC算法的过程,找到一个聚类,我们
必须首先找到至少一个其R-kNB大于或等于其kNB的DP或EP(即,NDF的值不小于1)。假设C是最小的簇w.r.t.数据库D中的k,p是第一个扩展簇C的DP或EP。
kNB(p)中的所有对象自然地分配给C.考虑到p本身,因此C的最小尺寸是k + 1。因此,我们可以使用参数k来限制要找到的最小簇的大小。
集群是一组数据对象,显示一些相似且独特的模式。
如果群集的大小太小,则其模式不容易演示。在这种情况下,数据表现得更像异常值。在实验中,我们通常会设置
从k到10,我们可以在数据库中找到最有意义的聚类。
复杂度?

NBC算法的过程可以分为两个独立的部分:计算NDF和发现簇。最耗时的
计算NDF的工作是评估kNB查询。让N成为
d维数据集D的大小。将对象映射到适当的单元格需要O(N)时间。对于正确定位的细胞长度l的值,平均来说,细胞长度为1
搜索需要3层,每个单元包含k个对象。因此,评估kNB查询的时间复合度是O(mN),其中m = k * 5d。对于大
数据集,m小于等于 N,它变成O(N)。但是,考虑到m 1,因此CalcNDF的时间复杂度为O(mN)。发现集群的递归过程需要O(N)。因此,NBC算法的时间复杂度为O(mN)。

你可能感兴趣的:(菜鸟的机器学习入门之路,每日学习)