一种基于邻域的聚类算法

基本概念:

给定数据集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的数据集,
    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);//计算NDFNoiseSet.empty();//初始化脏数据集合Cluster_count = 0;//初始化社团数量为0for each object p int Dataset{//扫描整个库if(p.clst_no != NULL or p.ndf < 1){continue}p.clst_no = cluste_count;//标记一个新的社团DPSet.empty();//初始化DPsetfor 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)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/509014.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

博弈之威佐夫

博弈之威佐夫博弈详解 标签&#xff1a; 数学博弈游戏威佐夫algorithm2014-03-21 10:40 5330人阅读 评论(1) 收藏 举报分类&#xff1a;博弈&#xff08;6&#xff09; 版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 威佐夫博弈是博弈中的另一个经…

Maven报错Missing artifact jdk.tools:jdk.tools:jar:1.7

https://blog.csdn.net/u013281331/article/details/40824707

机器学习会议总结1

2017.06.10506实验室会议总结&#xff1a;今天是机器学习第一次正式的开会&#xff0c;即兴奋又慌张&#xff0c;怕自己所学的东西达不到要求。实验室每个人的学习情况及工作情况如下&#xff1a;首先介绍的当然是我们唯有的学长元智&#xff0c;学长元智主要是讲了怎样学习&am…

前缀树和后缀树

Trie树的应用: 除了本文引言处所述的问题能应用Trie树解决之外&#xff0c;Trie树还能解决下述问题&#xff08;节选自此文&#xff1a;海量数据处理面试题集锦与Bit-map详解&#xff09;&#xff1a; 3、有一个1G大小的一个文件&#xff0c;里面每一行是一个词&#xff0c;词的…

学长启蒙

2017.06.20506实验室家才学长课堂总结&#xff1a;第一次正式听家才学长的课堂&#xff0c;课堂主要目的学长凭自己的经验和丰富的知识带领我们入门机器学习&#xff0c;认识机器学习&#xff0c;学习机器学习。 课堂第一项&#xff0c;首先为方便与学长交流&#xff0c;认识&a…

A*算法启发式搜索

最短路径算法&#xff1a; A*算法擅长解决静态路径中最短距离问题&#xff0c;而又不同于Dijkstra算法和Floyd算法&#xff0c;该算法综合了BFS和Dijkstra算法优点&#xff1a;在进行启发式搜索提高算法效率的同时&#xff0c;可以保证找到一条最优路径(基于评估函数&#xff0…

基于维特比算法的概率路径

简介&#xff1a; 维特比算法(Vieterbi algorithm)是一种动态规划算法&#xff0c;探索出很多预测天气的方法&#xff0c;这种基于经验的预测方式&#xff0c;是一种基于历史数据的概率模型。 思想 维特比算法的思想是假设某一个数据的当前状态是依赖于它的前一个状态&#…

Python的Pexpect库

Pexpect 是一个用来启动子程序并对其进行自动控制的纯 Python 模块。 Pexpect 可以用来和像 ssh、ftp、passwd、telnet 等命令行程序进行自动交互。本文主要是针对ssh远程登录&#xff0c;然后执行简单的新建文件夹与拷贝任务Pexpect 的安装&#xff1a;下载&#xff1a;https:…

k-shingles和MinHash优秀文章保存

minhash原理解释&#xff1a;https://www.cnblogs.com/sddai/p/6110704.html k-shingles和minhash使用原理&#xff1a;https://blog.csdn.net/aspirinvagrant/article/details/41281101 代码java实现&#xff1a;https://blog.csdn.net/remoa_dengqinyi/article/details/728…

Python 数据库连接

#!/usr/bin/env python #-*-coding:utf-8-*- #异常处理&#xff0c;with的使用&#xff0c; class Mycontex(object):def __init__(self,name):self.namenamedef __enter__(self):print("__enter__")return selfdef do_self(self):print(do_self)def __exit__(self,e…

中文分词测试语句

研究生命科学研究生命令本科生我从马上下来我马上下来北京大学生喝进口红酒在北京大学生活区喝进口红酒从小学电脑从小学毕业美军中将竟公然说新建地铁中将禁止商业摊点这块地面积还真不小地面积了厚厚的雪让我们以爱心和平等来对待动物阿美首脑会议将讨论巴以和平等问题锌合金…

socket网络编程udp

#!/usr/bin/env python #-*-coding:utf-8-*- #udp socketserver客户端 import socketHOST127.0.0.1 PORT3214 ssocket.socket(socket.AF_INET,socket.SOCK_DGRAM)data你好&#xff01; s.sendto(data.encode(utf-8),(HOST,PORT))while data!bye:datbwhile len(dat)0:dat,addrs.…

几种分类器小结

朴素贝叶斯分类器是假设数据样本特征完全独立&#xff0c;以贝叶斯定理为基础的简单概率分类器。AdaBoost算法的自适应在于前一个分类器产生的错误分类样本会被用来训练下一个分类器&#xff0c;从而提升分类准确率&#xff0c;但是AdaBoost算法对于噪声样本和异常样本比较敏感…

socket网络编程tcp

#!/usr/bin/env python #-*-coding:utf-8-*- #tcp 客户端import socketHOST127.0.0.1 POST3214ssocket.socket() try:s.connect((HOST,POST))data你好&#xff01;while data:s.sendall(data.encode(utf-8))datas.recv(1024)print(Receive from Server:\n,data.decode(utf-8))d…

聚类算法篇章总结

主要的距离计算方法包括&#xff1a; 最短距离法(通过样本数值之间的距离计算&#xff0c;然后将距离值最小的样本进行合并的过程)最长距离法中间距离法重心法(重心聚类法&#xff1a;将两个聚类中心点的距离定义为两个类的重心距离&#xff0c;而类的重心为属于该类的样本的平…

socket网络编程多线程

#!/usr/bin/env python #-*-coding:utf-8-*- #多进程 import threading import time def thfun():s0for i in range(30):sitime.sleep(0.1)print(s)class MyThread(threading.Thread):def run(self):s0for i in range(30):sitime.sleep(0.1)print(s)if __name____main__:#ths[t…

学习之道

对待人生的任何事情都要&#xff1a;抓大放小&#xff0c;要事为先 对于一个以前从来没有接触过java的人&#xff0c;java无疑是庞大的&#xff0c;似乎每个领域都可以拓展开来都是一片开阔地&#xff0c;每一个领域要想深入接触到每一个细节所耗费的精力都是巨大的。这个时候大…

socket网络编程ftp

#!/usr/bin/env python #-*-coding:utf-8-*- #ftp客户端 import os import socket import threading import socketserver#下载文件 def get_file(host,port,filepath):ssocket.socket()s.connect((host,port))filepathos.path.join(.,bakc,filepath)fopen(filepath,wb)dataTr…

python类似于java的重写toString方法

python类中的特殊方法&#xff1a; __str__(self)用来重写 people类&#xff1a; class People:所有员工的基类#构造函数def __init__(self, user_id, user_name):self.user_id user_idself.user_name user_name#析构函数def __del__(self):class_name self.__class__.__n…

socket网络编程实现远程备份

#!/usr/bin/env python #-*-coding:utf-8-*- #GUI设计与构建 客户端建立from tkinter import * from tkinter.ttk import * import socket import struct#启动服务 def start(host,port):pass#我的控件 class MyFrame(Frame):def __init__(self,root):super().__init__(root)se…