python DBSCAN聚类算法

2023-05-16

文章目录

  • DBSCAN聚类算法
      • 基本思想
      • 基本概念
      • 工作流程
      • 参数选择
      • DBSCAN的优劣势
    • 代码分析
      • ==Matplotlib Pyplot==
      • ==make_blobs==
      • ==StandardScaler==
      • ==axes类使用==
      • ==plt.cm.Spectral颜色分配==
      • ==python numpy 中linspace函数==
      • ==enumerate()函数==
      • ==plt.scatter()绘制散点图==
      • 整体代码

DBSCAN聚类算法

基本思想

  • 看看维基百科的解释
    在这里插入图片描述

  • DBSCAN的核心就是簇的扩张,先确定一个没有访问过的点,如果该点满足条件(设置的eps内有足够的阈值)那就标记为核心点,然后在该点创建一个新的簇,将该点领域里面的点也归类到这个簇里面,然后对里面的点也标记为核心点进行延伸,在这些点的领域内的点也放到这个簇里面,然后一直扩展直到那个点不满足于条件(设置的eps内没有足够的阈值),这就是访问完毕了。

基本概念

  • 核心对象: 若某个点的密度达到算法设定的阈值(人为设置的)则其为核心点(即r领域内点的数量不小于minpts) (minpts就是自己设置的阈值 r就是这个点的领域范围)
    在这里插入图片描述

  • ∈-领域的距离阈值:设定的半径r

  • 直接密度可达:若某点p在点q的r领域内,且q是核心电脑则p-q直接密度可达

  • 密度可达:若有一个点的序列q0,q1,…qk,对任意qi-qi-1是直接密度可达的,则称从q0到qk密度可达,这实际上是直接密度可达的“传播”
    在这里插入图片描述

  • 密度相连:若从某核心点p出发,点q点k都是密度可达的,则称点q和点k是密度相连。

  • 边界点;属于某一个类的非核心点,不能发展下线了

  • 噪声点:不属于任何一个类簇的点,从任何一个核心点出发都是密度不可达(所有簇都不可以圈住的点)
    在这里插入图片描述

工作流程

在这里插入图片描述

参数选择

  • 半径
    在这里插入图片描述

  • MinPts
    在这里插入图片描述

DBSCAN的优劣势

  • 优势
    • 不需要指定簇的个数
    • 可以发现任意形状的簇
    • 擅长找到离群点
    • 两个参数就够了
  • 劣势
    • 高纬数据有些困难(可以做降维)
    • 参数难以选择(参数对结果的影响非常大)
    • Sklearn中效率很慢(数据消减策略)
      • 机器学习中常用的第三方模块,对常用的机器学习方法进行了封装,包括回归(Regression)、降维(Dimensionality Reduction)、分类(Classfication)、聚类(Clustering)等方法。
      • sklearn的特点
        • 简单高效的数据挖掘和数据分析工具
        • 让每个人都能够在复杂环境中重复使用
        • 建立Numpy,Scipy,MatPlotLib之上

代码分析

Matplotlib Pyplot

  • Pyplot是Matplotlib的子库,提供了和matlab类似的绘图API

  • Pyplot 是常用的绘图模块,能很方便让用户绘制 2D 图表。

  • # 画单条线
    plot([x], y, [fmt], *, data=None, **kwargs)
    # 画多条线
    plot([x], y, [fmt], [x2], y2, [fmt2], ..., **kwargs)
    
  • **x, y:**点或线的节点,x 为 x 轴数据,y 为 y 轴数据,数据可以列表或数组。

  • **fmt:**可选,定义基本格式(如颜色、标记和线条样式)。

  • ****kwargs:**可选,用在二维平面图上,设置指定属性,如标签,线的宽度等。

在这里插入图片描述

  • 如果我们不指定 x 轴上的点,则 x 会根据 y 的值来设置为 0, 1, 2, 3…N-1

在这里插入图片描述

  • import matplotlib.pyplot as plt
    import  numpy as np
    
    # xpoints=np.array([0,6,6,0])
    # ypoints=np.array([0,100,0,0])
    # print(xpoints,ypoints)
    # plt.plot(xpoints,ypoints,'bo')#蓝色实心绘制
    # plt.show()
    #plot函数是绘制二维图形的最基本函数
    
    
    #绘制正弦与余弦图
    #两者的区别仅仅是arange返回的是一个数据,而range返回的是list 。
    x=np.arange(0,4*np.pi,0.1)#start0  stop 4pi step 0.1 
    y=np.sin(x)
    z=np.cos(x)
    plt.plot(x,y,x,z)
    plt.show()
    
    

make_blobs

  • make_blobs函数是为聚类产生数据集,产生一个数据集和相应的标签

StandardScaler

  • 作用
    • 去均值和方差归一化。且是针对每一个特征维度来做的,而不是针对样本
  • 对特征数据进行归一化
    • np.mean求均值,np.std求标准差
    • 标准差标准化
    • image-20221125133150962
    • 归一化后加快了梯度下降求最优解的速度;
    • 归一化有可能提高精度;
    • fit_transform()
      • 功能
        • 计算均值和标准差,用于以后的缩放
      • 缩放
        • X:二维数组

axes类使用

  • axes类(轴域类),该类对象被称为axes对象(即轴域对象),它指定了一个有数值范围限制的绘图区域。在一个给定的画布(figure)中可以包含多个axes对象,但是同一个axes对象只能在一个画布中使用

plt.cm.Spectral颜色分配

在这里插入图片描述

python numpy 中linspace函数

  • 与Numpy arange函数类似,生成结构与Numpy 数组类似的均匀分布的数值序列。
  • 通过定义均匀间隔来创建数值序列,其次需要指定间隔起始点,终止端,以及指定分隔值总数(包括起始点和终止点),最终函数返回间隔类均匀分布的数值序列

enumerate()函数

  • enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。

  • 语法

    • enumerate(sequence, [start=0])
      
    • sequence – 一个序列、迭代器或其他支持迭代对象。start – 下标起始位置的值。

    • 返回enumerate(枚举) 对象。

plt.scatter()绘制散点图

  • 作用:用于散点图的绘制

  • 基本参数
    在这里插入图片描述

整体代码

import numpy as np
import  matplotlib.pyplot as plt
from sklearn.preprocessing import  StandardScaler

UNCLASSIFIED=0
NOISE=-1
#计算每一个数据点与其他每个点之前的距离
def getdatadisstance(datas):
    line,column=np.shape(datas)#返回datas里面列,行的数目
    dists=np.zeros([line,line])#创建一个初始值为0 column*column的矩阵
    for i in range(0,line):
        for j in range(0, line):
            vi=datas[i,:]
            vj=datas[j,:]
            #通过把第每一行的数据与其他行的数据进行矩阵乘法开根号得到两点之间的距离
            dists[i,j]=np.sqrt(np.dot((vi-vj),(vi-vj)))
    return dists#返回一个矩阵
def find_near_pionts(point_id,eps,dists):
    #得到point_id周围的点和它的距离 如果周围的点距离小于该点围起来的eps 那么返回true说明是该点的临近点
    index=(dists[point_id]<=eps)
    return np.where(True==index)[0].tolist()#tolist()是将矩阵转换成列表

def expand_cluster(dists,labs,cluster_id,seeds,eps,min_points):
    #获取一个临近点 对该点进行处理
    i=0
    #遍历到该点大于seeds的点数为止 这样就可以保证每个点都被归类到
    while i<len(seeds):
        Pn=seeds[i]
        if labs[Pn]==NOISE:
            labs[Pn]=cluster_id
        elif labs[Pn]==UNCLASSIFIED:
            #把该点归类为当前簇
            labs[Pn]=cluster_id
            #计算该点的临近点 创建一个新的临近点
            new_seeds=find_near_pionts(Pn,eps,dists)
            #让该临近点归类为原来的点
            if len(new_seeds)>=min_points:
                seeds=seeds+new_seeds
            else:
                continue
        #自加 开始下一次循环
        i=i+1


def DBSCAN(datas,eps,min_points):
    #得到每两点之间距离
    dists=getdatadisstance(datas)

    n_points=datas.shape[0]#shape返回第一维度的参数,得到行的数目

    labs=[UNCLASSIFIED]*n_points
    #将全部点设为没有被标记的点(0)
    cluster_id=0#其实簇id为0

    #遍历所有点
    for point_id in range(0,n_points):
        #如果当前点已经被标记 那么跳过这个点 进行下一个点的遍历
        if not(labs[point_id]==UNCLASSIFIED):
            continue
        seeds = find_near_pionts(point_id, eps, dists)  # 得到该点的临近点,用这些点来进行扩展

        #如果临近点周围的点数小于设置的阈值 那么标记其为噪声点
        if len(seeds)<min_points:
            labs[point_id]=NOISE
        else:
            #如果该点没有被标记 簇加1 然后进行扩张
            cluster_id=cluster_id+1
            #标记该点的当前簇值
            labs[point_id]=cluster_id
            expand_cluster(dists,labs,cluster_id,seeds,eps,min_points)
    return labs,cluster_id
            #进行该簇的扩张(聚类扩展)

def draw_cluster(datas,labs,n_cluster):
    plt.cla()#清楚axes 清除指定范围的绘图区域

    #用推导式 为聚类点分配颜色
    colors=[plt.cm.Spectral(each) for each in np.linspace(0,1,n_cluster)]
    for i,lab in enumerate(labs):#i为返回下标的值  lab为labs里面的标记值
        if lab==NOISE:
            plt.scatter(datas[i,0],datas[i,1],s=16,color=(0,0,0))
        else:
            plt.scatter(datas[i,0],datas[i,1],s=16,color=colors[lab-1])
    plt.show()



if __name__=="__main__":

    #打开文件 导入数据
    file_name="jain"
    #以只读方式打开文件 这是默认的方式 编码格式为 utf-8
    with open(file_name+'.txt','r',encoding='utf-8') as f:
        lines=f.read().splitlines()#读取数据 并且存储在一个列表里面
    lines=[line.split("\t")[:2] for line in lines]
    #split通过一个tab(\t)距离的指令来分隔开字符串并且取前两个数据做为一个列表元素
    datas=np.array(lines).astype(np.float32)
    #将列表转换为矩阵数组矩阵 astype可以将数组里面的数转换成浮点数


    #数据正则化
    datas=StandardScaler().fit_transform(datas)
    #StandardScaler函数用来对数据的归一化处理  fit_transform对数组标准差的标准化
    eps=0.2#设置的种子点的搜索半径
    min_points=5#设置的阈值 大于此阈值既可以标记为一个种子点
    labs,cluster_id=DBSCAN(datas,eps=eps,min_points=min_points)
    draw_cluster(datas,labs,cluster_id)

  • 可视化效果

参考文章

https://blog.csdn.net/Joyce_Ff/article/details/91955640

参考视频

https://www.bilibili.com/video/BV17Y4y1v7XH/?spm_id_from=333.337.search-card.all.click

https://www.bilibili.com/video/BV1vL41147Ah/?spm_id_from=333.337.search-card.all.click&vd_source=1e0628d472510a4049e6a6e9a12fb1da

数据集链接:https://pan.baidu.com/s/1FeckeC2er84CpMzb55TdDA
提取码:2580

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python DBSCAN聚类算法 的相关文章

  • 如何使用 conda 在一行中安装多个包?

    我需要使用 conda 安装以下多个软件包 我不确定 conda forge 是什么 有些使用 conda forge 有些不使用它 是否可以将它们安装成一行而不需要一一安装 谢谢 conda install c conda forge d
  • matplotlib 中的 R 风格数据轴缓冲区

    R 绘图自动设置 x 和 y 限制 以在数据和轴之间留出一些空间 我想知道 matplotlib 是否有办法自动执行相同的操作 如果没有 是否有一个好的公式或 经验法则 来说明 R 如何设置其轴限制 在 matplotlib 中 您可以通过
  • Pandas 连接问题:列重叠但未指定后缀

    我有以下数据框 print df a mukey DI PI 0 100000 35 14 1 1000005 44 14 2 1000006 44 14 3 1000007 43 13 4 1000008 43 13 print df b
  • Python 的 mysqldb 晦涩文档

    Python 模块 mysqldb 中有许多转义函数 我不理解它们的文档 而且我努力查找它们也没有发现任何结果 gt gt gt print mysql escape doc escape obj dict escape any speci
  • Perl 是否有相当于 Python 的 `if __name__ == '__main__'` 的功能?

    有没有一种方法可以确定当前文件是否是 Perl 源中正在执行的文件 在 Python 中 我们使用以下结构来做到这一点 if name main This file is being executed raise NotImplemente
  • 在Python中以交互方式执行多行语句

    我是 Python 世界的新手 这是我用 Python 编写的第一个程序 我来自 R 世界 所以这对我来说有点不直观 当我执行时 In 15 import math import random random random math sqrt
  • 如何在Python代码中查找列号

    简短问题 当按上述方式调用函数时 我可以找到行号here https stackoverflow com questions 3056048 filename and line number of python script 同样 如何找到
  • Pandas:将 pytz.FixedOffset 应用于系列

    我有一个带有timestamp列看起来像这样 0 2020 01 26 05 00 00 08 00 1 2020 01 26 06 00 00 08 00 Name timestamp dtype datetime64 ns pytz F
  • 用于多个窗口的 Tkinter 示例代码,为什么按钮无法正确加载?

    我正在编写一个程序 应该 按一下按钮即可打开一个窗口 按另一个按钮关闭新打开的窗口 我使用类 以便稍后可以将代码插入到更大的程序中 但是 我无法正确加载按钮 import tkinter as tk class Demo1 tk Frame
  • 线性同余生成器 - 如何选择种子和统计检验

    我需要做一个线性同余生成器 它将成功通过所选的统计测试 我的问题是 如何正确选择发电机的数字以及 我应该选择哪些统计检验 我想 均匀性的卡方频率测试 每代收集10 000个号码的方法 将 0 1 细分为10个相等的细分 柯尔莫哥洛夫 斯米尔
  • 计算 pyspark df 列中子字符串列表的出现次数

    我想计算子字符串列表的出现次数 并根据 pyspark df 中包含长字符串的列创建一个列 Input ID History 1 USA UK IND DEN MAL SWE AUS 2 USA UK PAK NOR 3 NOR NZE 4
  • 在python中读取PASCAL VOC注释

    我在 xml 文件中有注释 例如这个 它遵循 PASCAL VOC 约定
  • 在 matplotlib 中绘制多边形的并集[重复]

    这个问题在这里已经有答案了 我正在尝试绘制几个多边形的并集matplotlib 具有一定的 alpha 水平 我当前的代码在交叉点处颜色较深 有没有办法让交叉路口与其他地方的颜色相同 import matplotlib pyplot as
  • 在Python中连续解析文件

    我正在编写一个脚本 该脚本使用 HTTP 流量行解析文件 并取出域 目前仅将它们打印到屏幕上 我正在使用 httpry 将流量连续写入文件 这是我用来删除域名的脚本 usr bin python import re input open r
  • Python 导入非常慢 - Anaconda python 2.7

    我的 python import 语句变得非常慢 我使用 Anaconda 包在本地运行 python 2 7 导入模块后 我编写的代码运行得非常快 似乎只是导入需要很长时间 例如 我使用以下代码运行了一个 tester py 文件 imp
  • Pip 无法在 Windows 上安装 Twisted

    我正在尝试在 Windows 8 计算机上安装 Twisted 在 Twisted 官方网站上 只有一个 Windows 版的 Wheel 文件 https twistedmatrix com trac wiki Downloads htt
  • 如何在Tensorflow中保存估计器以供以后使用?

    我按照教程 TF Layers 指南 构建卷积神经网络 以下是代码 https github com tensorflow tensorflow blob r1 1 tensorflow examples tutorials layers
  • Java/Python 中的快速 IPC/Socket 通信

    我的应用程序中需要两个进程 Java 和 Python 进行通信 我注意到套接字通信占用了 93 的运行时间 为什么通讯这么慢 我应该寻找套接字通信的替代方案还是可以使其更快 更新 我发现了一个简单的修复方法 由于某些未知原因 缓冲输出流似
  • 使用 SERVER_NAME 时出现 Flask 404

    在我的 Flask 配置中 我将 SERVER NAME 设置为 app example com 之类的域 我这样做是因为我需要使用url for with external网址 如果未设置 SERVER NAME Flask 会认为服务器
  • Python 中的字符串slugification

    我正在寻找 slugify 字符串的最佳方法 蛞蝓 是什么 https stackoverflow com questions 427102 in django what is a slug 我当前的解决方案基于这个食谱 http code

随机推荐

  • 伪黑客Windows下常使用的小黑窗口cmd,以及DOS(磁盘操作系统)

    什么是DOS xff1f 简单的来说 xff0c 就是使用命令的方式来操作电脑磁盘的文件 xff08 现在基本上都被图形化界面操作的方式取代 xff09 xff0c 如增删改查等操作 xff0c 是比较久远的一种操作系统 xff08 感兴趣
  • 【归并排序】C++数据结构实现归并排序完整代码

    归并排序 C 43 43 数据结构实现归并排序完整代码 归并排序 xff08 Merging Sort xff09 定义 xff1a 把两个或者多个有序的序列合并为一个 递归调用方式实现方式实现代码 xff1a 一 归并排序函数入口 归并排
  • 【css提取数据】

    css提取数据 一 了解网页代码格式二 标签之间的关系1 引入库 三 css选择器1 了解解析对象 xff0c 导入相关模块2 标签选择器3 类选择器4 id选择器5 组合选择器6 伪类选择器7 属性提取器 总结 提取数据方法有很多 xff
  • ubuntu 18.04 安装pycharm社区版以及创建桌面快捷方式

    1 下载 Download PyCharm Python IDE for Professional Developers by JetBrains 2 解压提取到此处 3 安装 xff08 1 xff09 打开终端 xff0c 进入pych
  • docker各种报错解决

    目录 问题1 Get https registry 1 docker io v2 context deadline exceeded 解决方法 问题反思 问题2 Error response from daemon Get 34 https
  • org.slf4j.Logger无法输出日志的BUG

    场景 依赖 lt dependency gt lt groupId gt org apache zookeeper lt groupId gt lt artifactId gt zookeeper lt artifactId gt lt v
  • 【安全知识】——SSH的两种远程登录方法详解

    作者名 xff1a Demo不是emo 主页面链接 xff1a 主页传送门 博主简介 xff1a 一 个普通的大二学生 xff0c 在CSDN写博客主要是为了分享自己的学习历程 xff0c 学习方法 xff0c 总结的经验等等 xff0c
  • scanf()函数错误C4996解决办法(严重性 代码 说明 项目 文件 行 禁止显示状态)

    问题如下 xff1a 严重性 代码 说明 项目 文件 行 禁止显示状态 错误 C4996 scanf This function or variable may be unsafe Consider using scanf s instea
  • Uubuntu 更新内核出现的问题_libssl3

    电脑系统 xff1a ubuntu系统 ubuntu版本 xff1a 1804 内核版本 xff1a 5 17 15 内核从5 15 升级到5 17后 xff0c 1 xff0c 在安装N卡驱动的时候 xff0c error xff1a l
  • 总结Vue中index.html、main.js、App.vue、index.js之间关系以及Vue项目加载流程

    总结Vue中index html main js App vue index js之间关系以及Vue项目加载流程 文章目录 总结Vue中index html main js App vue index js之间关系以及Vue项目加载流程1
  • 安装Hisat2

    一 xff08 MobaXterm Personal xff09 安装aspera 首先进行预编译解压安装 xff1a mkdir Biosofts unzip hisat2 2 2 1 Linux x86 64 zip d Biosoft
  • 【linux】基于阻塞队列的生产者消费者模型(条件变量)

    文章目录 一 引入二 生产者消费者模型2 1 三者关系2 2 生产者消费者模型基本原则2 3 生产者消费者模型的好处 三 基于阻塞队列的生产者消费者模型3 1 原理3 2 代码实现3 3 pthread cond wait的第二个参数3 4
  • 重建linux系统的grub启动项

    鉴于没钱买新电脑 xff0c 所以在一个电脑上装了3个系统 xff0c Ubuntu xff0c ArchLinux和Windows 然而Windows系统重启经常会导致找不到Arch的启动项 xff0c 即在UEFI里找不到Arch的gr
  • python程序开机自启(打包成exe文件开机自启)

    import shutil import sys import os import getpass a 61 os path basename sys argv 0 获取自身文件名 d 61 getpass getuser 获取用户名 b
  • 【Linux】题解:生产者与消费者模型(附源代码)

    Linux 题解 xff1a 生产者与消费者模型 xff08 附源代码 xff09 摘要 xff1a 本文主要介绍生产者与消费者模型 xff0c 其中主要内容分为对该模型的介绍及分析 xff0c 阻塞队列实现该模型 xff0c 并对其升级实
  • Spring之bean对象

    目录 一 了解Bean 二 Bean的生命周期 三 Bean的应用 单例模式 多例模式 单例模式与多例模式优劣势 xff1a 一 了解javaBean 什么是javaBean对象 span style background color fb
  • SpringMVC入门

    目录 一 Springmvc简介及配置 导入pom依赖 二 Springmvc之helloworld实现 配置tomcat服务器 根据图片进行操作 三 Springmvc常用注解及返回处理 四 增删改查 一 Springmvc简介及配置 1
  • Spring Boot 之主启动类

    主启动类 文章目录 主启动类 64 SpringBootApplication作用 64 SpringBootConfiguration 64 EnableAutoConfiguration 64 AutoConfigurationPack
  • 计算机组成原理期末考试试题及答案

    计算机组成原理期末考试试题及答案 一 选择题 1 完整的计算机系统应包括 D A 运算器 存储器和控制器 B 外部设备和主机 C 主机和实用程序 D 配套的硬件设备和软件系统 2 计算机系统中的存储器系统是指 D A RAM存储器 B RO
  • python DBSCAN聚类算法

    文章目录 DBSCAN聚类算法基本思想基本概念工作流程参数选择DBSCAN的优劣势 代码分析 61 61 Matplotlib Pyplot 61 61 61 61 make blobs 61 61 61 61 StandardScaler