zoukankan      html  css  js  c++  java
  • 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 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()

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

  • 相关阅读:
    第七届蓝桥杯javaB组真题解析-煤球数目(第一题)
    考生须知
    2016年12月1日
    蓝桥网试题 java 基础练习 矩形面积交
    蓝桥网试题 java 基础练习 矩阵乘法
    蓝桥网试题 java 基础练习 分解质因数
    蓝桥网试题 java 基础练习 字符串对比
    个人银行账户管理程序
    new和delete的三种形式详解
    C++的六个函数
  • 原文地址:https://www.cnblogs.com/zhusleep/p/5310167.html
Copyright © 2011-2022 走看看