专栏首页技术圈DBSCAN算法的Python实现

DBSCAN算法的Python实现

当我傻傻的用python写DBSCAN,我才突然想起来在scikit-learn中有DBSCAN,可以直接调用啊,我本来想要放弃快完成的代码,但是我想我可以发博客啊,好吧!

# -*- 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:
    
    def __init__(self,rad,minPts):
        
        try:
            fr = open('F:/Geolife Trajectories 1.3/Geolife Trajectories 1.3/Data/001/Solved.txt')
            data = pd.read_csv(fr)
            
        except IOError:
            print 'error'
         
        self.rad = rad
        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)
            if dist <=self.rad:
                
                cluster.append(point)
                
        #遍历完所有的点后判断是否满足成簇的条件
        if len(cluster)>self.minPts:
            
            cluster.append(p)
            #把当前点也加入到聚簇中去
            self.addCluster(cluster,parentCluster)
            
        #递归的加入点
        for point in cluster:
            self.recursivedbscan(point,parentCluster)
            
            
    def addCluster(cluster,partentCluster):
        
        #实质就是把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。)在使用了规定编码后不需要再声明文件编码。

    py3study
  • PaddlePaddle版Flappy-Bird—使用DQN算法实现游戏智能

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

    用户1386409
  • python第四十二课——__str__(self)函数

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

    hankleo
  • python 仿WINDOW任务计划程序

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

    用户5760343
  • python操作mysql数据库

    py3study
  • day23 03 组合的例子

    对象=类名()----实例化过程:创建了一个self对象,执行_init_方法初始化,返回self对象给外部

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

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

    py3study

扫码关注云+社区

领取腾讯云代金券