# DBSCAN算法的Python实现

```# -*- coding: utf-8 -*-
import pandas as pd
import math

class Point:

def __init__(self,x,y,visited=False):

self.x = x
self.y = y
self.visited = visited

def __setattr__(self,visited,value):

#super().__setattr__(visited,value)#这个在python3上是没有问题的，但是在我python2.7上就老报错，所以就用了下面这种方式来代替
#self.visited = value#这样写的话可能会造成死循环
self.__dict__[visited] = value

def getdist(self,p):

dist = (self.x - p.x)*(self.x-p.x)+(self.y-p.y)*(self.y-p.y)

return math.sqrt(dist)

def isSame(self,p):
isSame = False

if self.x == p.x and self.y == p.y :

isSame = True

return isSame

class DBSCANP:

try:
fr = open('F:/Geolife Trajectories 1.3/Geolife Trajectories 1.3/Data/001/Solved.txt')

except IOError:
print 'error'

self.minPts = minPts
self.pointCluster = []
self.noiseCluster = []
loc_List = data.iloc[:,[1,2]]
self.locList = loc_List#这个地方也太搞笑了呢
totalPoint = []
for index in range(len(loc_List)):

tmp = loc_List.ix[index]#这个返回的是Series类型
x = tmp[0]
y = tmp[1]
point = Point(x,y)

totalPoint.append(point)

self.totalPoint = totalPoint

def recursivedbscan(self,p,parentCluster):
#p为当前点
#parent为p的父节点

if p.visited:

return

p.visited = True

for point in self.totalPoint:

#排序point与p为同一个点的可能性
if p.isSame(point):

continue

cluster = []
#计算这两个点之间的距离
dist = p.getdist(point)

cluster.append(point)

#遍历完所有的点后判断是否满足成簇的条件
if len(cluster)>self.minPts:

cluster.append(p)
#把当前点也加入到聚簇中去

#递归的加入点
for point in cluster:
self.recursivedbscan(point,parentCluster)

#实质就是把cluster中且parentCluster中没有的点加入到partentCluster中去
tempPoint = []#用来暂存
for point1 in cluster:

if point1 not in partentCluster:

tempPoint.append(point1)

if len(point1)!=0:

partentCluster.extend(tempPoint)

#移除噪音点

def dbscanCluster(self):

for point in self.totalPoint:

if point.visited:

continue

#先初始化空cluster
cluster = []
self.recursivedbscan(point,cluster)
if len(cluster)>self.minPts:

self.pointCluster.append(cluster)

else:

self.noiseCluster.append(cluster)

#添加完噪音点，可以移除
DBSCANP.removeNoisePoint()

def removeNoisePoint(self):

totalCluster = []

for point in self.pointCluster:

totalCluster.extend(point)

for point in totalCluster:

if point in self.noiseCluster:

totalCluster.remove(point)

def printCluster(self):

for cluster in self.pointCluster:

for point in cluster:

print "x:%s,y:%s"%(point.x,point.y)

if __name__ == '__main__':

dbscanp = DBSCANP(2,1)
dbscanp.dbscanCluster()
dbscanp.printCluster()```

0 条评论

• ### Elasticsearch(五)

版权声明：本文为博主原创文章，遵循 CC 4.0 by-sa 版权协议，转载请附上原文出处链接和本声明。

• ### Elasticsearch(一) 安装与配置--Centos7

版权声明：本文为博主原创文章，遵循 CC 4.0 by-sa 版权协议，转载请附上原文出处链接和本声明。

• ### Python语言关于文件操作

版权声明：本文为博主原创文章，遵循 CC 4.0 by-sa 版权协议，转载请附上原文出处链接和本声明。

• ### 从PEP-8学习Python编码风格

Python3中应当总是使用UTF-8。（Python2使用ASCII。）在使用了规定编码后不需要再声明文件编码。

刚刚举行的 WAVE SUMMIT 2019 深度学习开发者峰会上，PaddlePaddle 发布了 PARL 1.1 版本，这一版新增了 IMPALA、A3C...

• ### python第四十二课——__str__(self)函数

4.__str__(self): 作用： 创建完对象，直接打印对象名/引用名我们得到的是对象的内存信息(十六进制的地址信息)， 这串数据我们程序员并不关心...

• ### python 仿WINDOW任务计划程序

from PyQt5 import QtCore, QtGui, QtWidgets import sys,os import win32api impo...

• ### day23 03 组合的例子

对象=类名（）----实例化过程：创建了一个self对象，执行_init_方法初始化，返回self对象给外部

• ### Python操作Mysql数据库的实现

1、需要使用的模块MySQLdb，下载地址为：http://sourceforge.net/projects/mysql-python/