python实现dbscan算法

 更新时间:2021年05月21日 11:35:28   作者:克金森沐沐  
DBSCAN 算法是一种基于密度的空间聚类算法,本文主要介绍了python实现dbscan算法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

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

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

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

DBSCAN算法的聚类过程

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

先上结果

在这里插入图片描述

大致流程

先根据给定的半径 r 确定中心点,也就是这类点在半径r内包含的点数量 n 大于我们的要求(n>=minPionts)
然后遍历所有的中心点,将互相可通达的中心点与其包括的点分为一组
全部分完组之后,没有被纳入任何一组的点就是离群点啦!

导入相关依赖

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets

求点跟点之间距离(欧氏距离)

def cuircl(pointA,pointB):
    distance = np.sqrt(np.sum(np.power(pointA - pointB,2)))
    return distance

求临时簇,即确定所有的中心点,非中心点

def firstCluster(dataSets,r,include):
    cluster = []
    m = np.shape(dataSets)[0]
    ungrouped = np.array([i for i in range (m)])
    for i in range (m):
        tempCluster = []
        #第一位存储中心点簇
        tempCluster.append(i)
        for j in range (m):
            if (cuircl(dataSets[i,:],dataSets[j,:]) < r and i != j ):
                tempCluster.append(j)
        tempCluster = np.mat(np.array(tempCluster))
        if (np.size(tempCluster)) >= include:
            cluster.append(np.array(tempCluster).flatten())
    #返回的是List
    center=[]
    n = np.shape(cluster)[0]
    for k in range (n):
        center.append(cluster[k][0])
    #其他的就是非中心点啦
    ungrouped = np.delete(ungrouped,center)
    #ungrouped为非中心点
    return cluster,center,ungrouped

将所有中心点遍历并进行聚集

def clusterGrouped(tempcluster,centers):
    m = np.shape(tempcluster)[0]
    group = []
    #对应点是否遍历过
    position = np.ones(m)
    unvisited = []
    #未遍历点
    unvisited.extend(centers)
    #所有点均遍历完毕
    for i  in range (len(position)):
        coreNeihbor = []
        result = []
        #删除第一个
        #刨去自己的邻居结点,这一段就类似于深度遍历
        if position[i]:
        #将邻结点填入
            coreNeihbor.extend(list(tempcluster[i][:]))
            position[i] = 0
            temp = coreNeihbor
        #按照深度遍历遍历完所有可达点
        #遍历完所有的邻居结点
            while len(coreNeihbor) > 0 :
                #选择当前点
                present = coreNeihbor[0]
                for j in range(len(position)):
                    #如果没有访问过
                    if position[j] == 1:
                        same = []
                        #求所有的可达点
                        if (present in tempcluster[j]):
                            cluster = tempcluster[j].tolist()
                            diff = []
                            for x in cluster:
                                if x not in temp:
                                    #确保没有重复点
                                    diff.append(x)
                            temp.extend(diff)
                            position[j] = 0
                # 删掉当前点
                del coreNeihbor[0]
                result.extend(temp)
            group.append(list(set(result)))
        i +=1
    return group

核心算法完毕!

生成同心圆类型的随机数据进行测试

#生成非凸数据 factor表示内外圈距离比
X,Y1 = datasets.make_circles(n_samples = 1500, factor = .4, noise = .07)


#参数选择,0.1为圆半径,6为判定中心点所要求的点个数,生成分类结果
tempcluster,center,ungrouped = firstCluster(X,0.1,6)
group = clusterGrouped(tempcluster,center)


#以下是分类后对数据进行进一步处理
num = len(group)
voice = list(ungrouped)
Y = []
for i in range (num):
   Y.append(X[group[i]])
flat = []
for i in range(num):
    flat.extend(group[i])
diff = [x for x in voice if x not in flat]
Y.append(X[diff])
Y = np.mat(np.array(Y))

绘图~

color = ['red','blue','green','black','pink','orange']
for i in range(num):
    plt.scatter(Y[0,i][:,0],Y[0,i][:,1],c=color[i])
plt.scatter(Y[0,-1][:,0],Y[0,-1][:,1],c = 'purple')
plt.show()

结果

紫色点就是离散点

在这里插入图片描述

到此这篇关于python实现dbscan算法的文章就介绍到这了,更多相关python dbscan算法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 手把手教你配置JupyterLab 环境的实现

    手把手教你配置JupyterLab 环境的实现

    这篇文章主要介绍了手把手教你配置JupyterLab 环境,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • 对Matlab中共轭、转置和共轭装置的区别说明

    对Matlab中共轭、转置和共轭装置的区别说明

    这篇文章主要介绍了对Matlab中共轭、转置和共轭装置的区别说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-05-05
  • Python实现Mysql数据库连接池实例详解

    Python实现Mysql数据库连接池实例详解

    这篇文章主要介绍了Python实现Mysql数据库连接池实例详解的相关资料,需要的朋友可以参考下
    2017-04-04
  • python爬虫爬取幽默笑话网站

    python爬虫爬取幽默笑话网站

    这篇文章主要介绍了python爬虫爬取幽默笑话网站,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • Python实现网络自动化eNSP

    Python实现网络自动化eNSP

    这篇文章主要介绍了Python实现网络自动化eNSP,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05
  • Python中更优雅的日志记录方案详解

    Python中更优雅的日志记录方案详解

    在Python中,一般情况下我们可能直接用自带的logging模块来记录日志,但logging用起来其实并不是那么好用,其实主要还是配置较为繁琐。本文为大家介绍了Python中更优雅的日志记录方案,需要的可以参考一下
    2022-06-06
  • windows下cx_Freeze生成Python可执行程序的详细步骤

    windows下cx_Freeze生成Python可执行程序的详细步骤

    这篇文章主要介绍了windows下cx_Freeze生成Python可执行程序的详细步骤,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-10-10
  • Python全栈之学习JS(2)

    Python全栈之学习JS(2)

    这篇文章主要为大家介绍了Python全栈之JS,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-01-01
  • python 的 openpyxl模块 读取 Excel文件的方法

    python 的 openpyxl模块 读取 Excel文件的方法

    这篇文章主要介绍了python 的 openpyxl模块 读取 Excel文件的方法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-09-09
  • python实现两个经纬度点之间的距离和方位角的方法

    python实现两个经纬度点之间的距离和方位角的方法

    今天小编就为大家分享一篇python实现两个经纬度点之间的距离和方位角的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-07-07

最新评论