您的位置:首页 > 编程语言 > C语言/C++

DBSCAN算法的Java,C++,Python实现

2014-03-31 19:41 363 查看
最近由于要实现‘基于网格的DBSCAN算法’,网上有没有找到现成的代码[如果您有代码,麻烦联系我],只好参考已有的DBSCAN算法的实现。先从网上随便找了几篇放这儿,之后对比研究。

DBSCAN简介:

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

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

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

2.DBSCAN算法的聚类过程
  DBSCAN算法基于一个事实:一个聚类可以由其中的任何核心对象唯一确定。等价可以表述为: 任一满足核心对象条件的数据对象p,数据库D中所有从p密度可达的数据对象o  所组成的集合构成了一个完整的聚类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 import defaultdict
import random

#function to calculate distance
def dist(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 in all_points:
all_points.append(randCoord)

#take radius = 8 and min. points = 8
E = 8
minPts = 8

#find out the core points
other_points =[]
core_points=[]
plotted_points=[]
for point in all_points:
point.append(0) # assign initial level 0
total = 0
for otherPoint in all_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 in core_points:
for other in other_points:
if dist(core,other)<=E:
border_points.append(other)
plotted_points.append(other)

#implement the algorithm
cluster_label=0

for point in core_points:
if point[2]==0:
cluster_label+=1
point[2]=cluster_label

for point2 in plotted_points:
distance = dist(point2,point)
if point2[2] ==0 and distance<=E:
print point, point2
point2[2] =point[2]

#after the points are asssigned correnponding labels, we group them
cluster_list = defaultdict(lambda: [[],[]])
for point in plotted_points:
cluster_list[point[2]][0].append(point[0])
cluster_list[point[2]][1].append(point[1])

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

#plotting the clusters
i=0
print cluster_list
for value in cluster_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 in all_points:
if not point in core_points and not point in border_points:
noise_points.append(point)
noisex=[]
noisey=[]
for point in noise_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()


View Code

参考:http://www.cnblogs.com/zhangchaoyang/articles/2182748.html

   http://www.cnblogs.com/lovell-liu/archive/2011/11/08/2241542.html

   http://blog.sudipk.com.np/2013/02/implementation-of-dbscan-algorithm-for.html
   http://caoyaqiang.diandian.com/post/2012-09-26/40039517485
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: