python机器人算法_DBscan算法及其Python实现

DBSCAN简介:

1.简介

DBSCAN 算法是一种基于密度的空间聚类算法。该算法利用基于密度的聚类的概念,即要求聚类空间中的一定区域内所包含对象(点或其它空间对象)的数目不小于某一给定阀值。DBSCAN 算法的显著优点是聚类速度快且能够有效处理噪声点和发现任意形状的空间聚类。但是由于它直接对整个数据库进行操作且进行聚类时使用了一个全局性的表征密度的参数,因此也具有两个比较明显的弱点:

1. 当数据量增大时,要求较大的内存支持 I/0 消耗也很大;

2. 当空间聚类的密度不均匀、聚类间距离相差很大时,聚类质量较差。

2.DBSCAN算法的聚类过程

DBSCAN算法基于一个事实:一个聚类可以由其中的任何核心对象唯一确定。等价可以表述为: 任一满足核心对象条件的数据对象p,数据库D中所有从p密度可达的数据对象所组成的集合构成了一个完整的聚类C,且p属于C。

3.DBSCAN中的几个定义

密度可达是直接密度可达的传递闭包,非对称性关系;密度相连是对称性关系。DBSCA目的是找到密度相连对象的最大集合。

E领域:给定对象p半径为E内的区域称为该对象的E领域;

核心对象:p的E领域内样本数大于MinPts(算法输入值),则该对象p为核心对象;

直接密度可达:对于样本集合D,如果样本点q在p的E领域内,且p为核心对象,则p直接密度可达q;

密度可达:对于样本集合D,存在一串样本点p1,p2,p3,...pn,其中连续两个点直接密度可达,则 p=p1,q=qn,则p密度可达q;

密度相连:对于样本集合D中任意一点o,存在p到o密度可达,并且q到o密度可达,那么q从p密度相连;

from matplotlib.pyplot import *

from collections importdefaultdictimportrandom#function to calculate distance

defdist(p1, p2):return ((p1[0]-p2[0])**2+ (p1[1]-p2[1])**2)**(0.5)#randomly generate around 100 cartesian coordinates

all_points=[]for i in range(100):

randCoord= [random.randint(1,50), random.randint(1,50)]if not randCoord inall_points:

all_points.append(randCoord)#take radius = 8 and min. points = 8

E = 8minPts= 8

#find out the core points

other_points =[]

core_points=[]

plotted_points=[]for point inall_points:

point.append(0)#assign initial level 0

total =0for otherPoint inall_points:

distance=dist(otherPoint,point)if distance<=E:

total+=1

if total >minPts:

core_points.append(point)

plotted_points.append(point)else:

other_points.append(point)#find border points

border_points=[]for core incore_points:for other inother_points:if dist(core,other)<=E:

border_points.append(other)

plotted_points.append(other)#implement the algorithm

cluster_label=0for point incore_points:if point[2]==0:

cluster_label+=1point[2]=cluster_labelfor point2 inplotted_points:

distance=dist(point2,point)if point2[2] ==0 and distance<=E:printpoint, point2

point2[2] =point[2]#after the points are asssigned correnponding labels, we group them

cluster_list = defaultdict(lambda: [[],[]])for point inplotted_points:

cluster_list[point[2]][0].append(point[0])

cluster_list[point[2]][1].append(point[1])

markers= ['+','*','.','d','^','v','>','

i=0printcluster_listfor value incluster_list:

cluster=cluster_list[value]

plot(cluster[0], cluster[1],markers[i])

i= i%10+1

#plot the noise points as well

noise_points=[]for point inall_points:if not point in core_points and not point inborder_points:

noise_points.append(point)

noisex=[]

noisey=[]for point innoise_points:

noisex.append(point[0])

noisey.append(point[1])

plot(noisex, noisey,"x")

title(str(len(cluster_list))+"clusters created with E ="+str(E)+"Min Points="+str(minPts)+"total points="+str(len(all_points))+"noise Points ="+str(len(noise_points)))

axis((0,60,0,60))

show()

参考地址:http://www.cnblogs.com/sungyouyu/p/3636708.html#undefined

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值