【数据挖掘】DBSCAN聚类算法(python实现)

2023-05-16

一、python代码

'''
Author: Vici__
date: 2020/5/14
'''
import math

'''
Point类,记录坐标x,y和点的名字id
'''
class Point:
    '''
    初始化函数
    '''
    def __init__(self, x, y, name):
        self.x = x # 横坐标
        self.y = y # 纵坐标
        self.name = name # 名字 
    '''
    计算两点之间的欧几里得距离
    '''
    def calc_Euclidean_distance(self, p2):
        return math.sqrt((self.x - p2.x) * (self.x - p2.x) + (self.y - p2.y) * (self.y - p2.y))

'''
1. 获取数据集
'''
def get_dataset():
    # 原始数据集以元组形式存放,(横坐标,纵坐标,名字)
    datas = [(1, 3, '1'), (1, 2, '2'), (2, 4, '3'), (2, 3, '4'), 
                (2, 2, '5'), (2, 1, '6'), (3, 2, '7'), (4, 2, '8'), 
                (5, 3, '9'), (5, 2, '10'), (5, 1, '11'), (6, 2, '12')]
    dataset = [] # 用于计算两点之间的距离,形式 [point1, point2...]
    id_point_dict = {} # 编号和点的映射
    temp_list = []
    for i in range(len(datas)): # 遍历原始数据集
        point = Point(datas[i][0], datas[i][1], datas[i][2]) # 利用(横坐标,纵坐标,编号)实例化
        id_point_dict[str(i)] = point
        dataset.append(point) # 放入dataset中
        temp_list.append(point)
    return dataset, id_point_dict # [p1, p2], {id: point}

'''
2. 计算任意两点之间的距离
'''
def get_dist(dataset):
    n = len(dataset) # 点的个数
    dist = [] # 存放任意两点之间的距离
    for i in range(n):
        dist_i = [] # 临时列表
        for j in range(n): # 遍历数据集
            # 计算距离并放入临时列表中
            dist_i.append(dataset[i].calc_Euclidean_distance(dataset[j]))
        dist.append(dist_i) # 利用临时列表创建二维列表
    # 打印dist
    print("任意两点之间的距离:")
    for d in dist:
        print(d)
    print()
    return dist

def DBSCAN(dataset, r, min_point):
    id_to_key = {} # 编号到key的映射
    key_to_set = {} # key到集合的映射
    key_num = len(dataset) # 当形成新的集合时,需要新的key值
    dist = get_dist(dataset) # 获取任意两点之间的距离
    for i in range(len(dataset)): # 遍历数据集
        id_to_key[i] = str(i) # 编号到key的映射,编号就是下标,key值就是下标的字符串形式
        key_to_set[str(i)] = set() # 集合
        key_to_set[str(i)].add(dataset[i].name) # 集合内存放该数据点的名字
    for i in range(len(dataset)):
        count = 0 # 计数,符合条件的数据点的个数
        t_list = []
        for j in range(len(dataset)): # 寻找小于半径的数据点
            if dist[i][j] <= r:
                count += 1 # 计数加一
                t_list.append(j) # 放入临时列表中
        
        if count >= min_point: # 如果数据点个数大于等于要求的点数
            union_set = set() # 定义新集合
            key_ = str(key_num) # 新集合需要映射的key值
            for id in t_list:
                key = id_to_key[id] # 上面找到的数据点,根据下标获取key值
                if key not in key_to_set: # 如果集合中有多个数据点时,第一个数据点时可能就删除了,这个key值就没了
                    continue
                s = key_to_set[key] # 根据key值找到相应集合
                union_set = union_set.union(s) # 合并到新集合中
                id_to_key[id] = key_ # 数据点下标映射到新key值
                del key_to_set[key] # 删除旧集合
            key_to_set[key_] = union_set # 新key值到新集合的映射
            key_num += 1 # 更新key_num
        # 每次输出一下结果
        for v in key_to_set.values():
            print(v)
        print("-----------------------------------")
# 测试
dataset, id_point_dict = get_dataset()
r = 1
min_point = 4
DBSCAN(dataset, r, min_point)

二、测试

实验数据:设有12个样本点(样本点的具体坐标可以根据图中数据的位置获得,设横、纵坐标的单位间隔为1)。指定DBSCAN聚类的参数中:r=1,minPoints=4。假设有数据集如下图所示,将图中数据从上到下、从左到右依次进行编号如下:

 结果:

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

【数据挖掘】DBSCAN聚类算法(python实现) 的相关文章

  • AttributeError:'function'对象在pandas中没有属性'bar'

    我有一个 pandas 数据框 它是 pandas 数据框类型 如下所示 type df Out 176 pandas core frame DataFrame 但是 当我尝试在此数据框上使用任何绘图函数 如条形图 时 会出现如下错误 df
  • 为什么 pandas 在简单的数学运算上比 numpy 更快?

    最近 我观察到 pandas 的乘法速度更快 我在下面的例子中向您展示了这一点 如此简单的操作怎么可能做到这一点 这怎么可能呢 pandas 数据帧中的底层数据容器是 numpy 数组 测量 我使用形状为 10k 10k 的数组 数据框 i
  • Python Numpy Reshape错误[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我在尝试重塑 3D numpy 数组时遇到一个奇怪的错误 数组 x 的形状为 6 10 300 我想将其重塑为 6 3000 我正
  • 如何使用我自己的自定义表单覆盖 django-rest-auth 中的表单?

    我正在使用 django rest auth 并尝试通过覆盖表单的方法之一来修复密码重置视图中的错误 尽管我已经使用不同的 django rest auth 表单成功完成了类似的操作 但我无法让它在这个表单上工作 无论我做什么 都会使用旧的
  • 如何使用 python、openCV 计算图像中的行数

    我想数纸张 所以我正在考虑使用线条检测 我尝试过一些方法 例如Canny HoughLines and FLD 但我只得到处理过的照片 我不知道如何计算 有一些小线段就是我们想要的线 我用过len lines or len contours
  • 计算熊猫数据帧几个月的总和

    我有一个 pandas 数据框 如下所示 ID Year R1 R1 f KAR1 20201001 1 5 KAR1 20201101 2 6 KAR1 20201201 3 7 KAR1 20210101 4 8 KAR1 202102
  • 如何将脚本作为 pytest 测试运行

    假设我有一个用简单脚本表示的测试assert 陈述 请参阅背景了解原因 例如 import foo assert foo 3 4 我如何以一种好的方式将该脚本包含在我的 pytest 测试套件中 我尝试了两种有效但不太好的方法 一种方法是将
  • 如何在动态执行的代码字符串中使用inspect.getsource?

    如果我在文件中有这段代码 import inspect def sample p1 print p1 return 1 print inspect getsource sample 当我运行脚本时 它按预期工作 在最后一行 源代码sampl
  • 从字典中绘制直方图

    我创建了一个dictionary计算 a 中出现的次数list每个键的内容 我现在想绘制其内容的直方图 这是我想要绘制的字典的内容 1 27 34 1 3 72 4 62 5 33 6 36 7 20 8 12 9 9 10 6 11 5
  • 无法在我的程序中使用 matplotlib 函数

    我正在 Windows 10 中运行 Anaconda 安装 conda 版本 4 3 8 这是我尝试在 python 命令行中运行的代码 import matplotlib pyplot as plt x 1 2 3 4 y 5 6 7
  • Django Web 应用程序中的 SMTP 问题

    我被要求向使用 Django Python 框架实现的现有程序添加一个功能 此功能将允许用户单击一个按钮 该按钮将显示一个小对话框 表单以输入值 我确实编写了一些代码 显示电子邮件已发送的消息 但实际上 它没有发送 My code from
  • Django 1.7 应用程序配置导入错误:没有名为 appname.apps 的模块

    我正在尝试按照以下文档为我的一个名为 文章 的 Django 应用程序设置自定义应用程序配置https docs djangoproject com en dev ref applications https docs djangoproj
  • Jupyter笔记本突然变得很慢

    我以前在anaconda环境下运行jupyter运行得很好 显示警告后 IOPub data rate exceeded The notebook server will temporarily stop sending output to
  • 将 Python Selenium 输出写入 Excel

    我编写了一个脚本来从在线网站上抓取产品信息 目标是将这些信息写入 Excel 文件 由于我的Python知识有限 我只知道如何在Powershell中使用Out file导出 但结果是每个产品的信息都打印在不同的行上 我希望每种产品都有一条
  • 如何在 Python 中跟踪日志文件?

    我想在 Python 中提供 tail F 或类似内容的输出 而无需阻塞或锁定 我找到了一些非常旧的代码来做到这一点here http code activestate com recipes 436477 filetailpy 但我认为现
  • 无法将matplotlib安装到pycharm

    我最近开始使用Python速成课程学习Python编程 我陷入困境 因为我无法让 matplotlib 在 pycharm 中工作 我已经安装了pip 我已经通过命令提示符使用 pip 安装了 matplotlib 现在 当我打开 pych
  • 在不同的 GPU 上同时训练多个 keras/tensorflow 模型

    我想在 Jupyter Notebook 中同时在多个 GPU 上训练多个模型 我正在使用 4GPU 的节点上工作 我想将一个 GPU 分配给一个模型并同时训练 4 个不同的模型 现在 我通过 例如 为一台笔记本选择 GPU import
  • 避免“散点/点/蜂群”图中的数据点重叠

    使用绘制点图时matplotlib 我想偏移重叠的数据点以使它们全部可见 例如 如果我有 CategoryA 0 0 3 0 5 CategoryB 5 10 5 5 10 我想要每一个CategoryA 0 数据点并排设置 而不是彼此重叠
  • 如何在supervisord中设置组?

    因此 我正在设置 Supervisord 并尝试控制多个进程 并且一切正常 现在我想设置一个组 以便我可以启动 停止不同的进程集 而不是全部或全无 这是我的配置文件的片段 group tapjoy programs tapjoy game1
  • python 日志记录替代方案 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 蟒蛇记录模块 http docs python org library logging html使用起来

随机推荐

  • 人脸识别过程

    做人脸识别的朋友很多不知道人脸识别过程 xff0c 人脸识别厂家人脸识别过程 人脸识别第一步先进行图像采集 xff0c 人脸定位 xff0c 特征提取 xff0c 特征对比 xff0c 人脸资料存储 xff0c 识别成功就可以开门 xff0
  • 个人博客的三种方式

    创建个人博客的三种方式 1 博客平台 简书 CSDN 知乎专栏等 特点 xff1a 简单 xff0c 可控性低 申请个账号就可以写 xff0c 其他的都不用管 限制多 xff0c 界面 排版 有没有广告自己说了不算 xff0c 什么能发什么
  • GitHub 简介

    用详细的图文对GitHub进行简单的介绍 git是一个版本控制工具 xff0c github是一个用git做版本控制的项目托管平台 主页介绍 xff1a overview xff1a 总览 相当于个人主页 repositories xff1
  • Markdown 编辑器推荐和常用语法介绍

    Markdown 是非常好用的文档编写方式 下面是我的 Markdown 学习总结 不求详尽 xff0c 只求简明 编辑器 xff1a 我目前使用的 Markdown 编辑器是 Joplin xff0c 感觉挺好用 我对编辑器的需求是 xf
  • 使用 Hexo 在 Github 上建博客

    先确认 git 与 npm 已经安装 xff0c 在终端输入以下命令 git version npm version 安装 hexo xff0c 在终端输入 npm install hexo cli g 安装过程中如果报错 解决方法 xff
  • ping命令的过程

    ping命令的过程 1 ping是什么 xff1f PING Packet Internet Groper xff0c 因特网包探索器 xff0c 用于测试网络连通性的程序 Ping发送一个ICMP Internet Control Mes
  • Hexo 更换主题

    更换 Hexo 主题非常容易 xff0c 只要在 themes 文件夹内 xff0c 新增一个任意名称的文件夹 xff0c 并修改 config yml 内的 theme 设定 xff0c 即可切换主题 具体步骤 xff1a 1 安装主题
  • Python 爬虫零基础教程(0):简介及准备

    其他的教程往往从语法开始 xff0c 而我们直接开始爬虫 xff0c 语法等知识边做边学 这第0篇我们简单介绍下爬虫和编程工具 爬虫是什么 爬虫是自动浏览 保存网页内容的程序或脚本 爬虫不同于黑客 xff0c 爬虫爬取的是允许访问的内容 工
  • 如何解决Unable to parse template "Interface"Error Message;

    Unable to parse template Interface Error Message This Template did not Produce a Java Class or an interface关于这个错误 xff0c
  • inflate函数使用总结

    inflate 两个参数和三个参数的区别 以前使用没有关注过 xff0c 因为觉得没报bug就行了 xff0c 两个三个参数无所谓 xff0c 经过导师提醒 xff0c 决定好好看看源码和相关知识 xff0c 总觉一下区别 xff0c 以免
  • 除了csdn网站打不开,一直刷新等待没反应,其他网站都能正常访问

    DNS错误 自动获取DNS服务器地址 清除DNS缓存信息 ipconfig span class token operator span flushdns 重置winsock 目录设置 netsh winsock reset
  • org.slf4j用法

    org slf4j用法 Scala 1 创建Logger对象 private val logger Logger 61 LoggerFactory getLogger classOf HttpBmlClient 2 打印错误信息 同时抛出异
  • 安装图形界面、VNCserver

    centos7 安装图形界面 xff1a 第一步 xff1a 安装Gnome包 在命令行下 输入下面的命令来安装Gnome包 yumgroupinstall 34 GNOMEDesktop 34 34 GraphicalAdministra
  • MySQL全量、增量备份与恢复的简单方法

    本文主要给大家介绍MySQL全量 增量备份与恢复的简单方法 xff0c 文章内容都是笔者用心摘选和编辑的 xff0c 具有一定的针对性 xff0c 对大家的参考意义还是比较大的 xff0c 下面跟笔者一起了解下MySQL全量 增量备份与恢复
  • windows安装zabbix代理

    一 关闭windows防火墙或者开通10050和10051端口 直接windows关闭防火墙或者在防火墙中放行10050和10051 二 xff0e 下载 安装并修改windows代理 1 下载zabbix agentd包 官网下载地址 x
  • android8.0 Fingerprint 指纹输错5次后亮屏显示错误信息

    当有指纹解锁时 xff0c 会执行AuthenticationClient java gt onAuthenticated 一直在监听解锁行为 64 Override public boolean onAuthenticated int f
  • secureCRT 抓取串口数据

    language 61 34 VBScript 34 interface 61 34 1 0 34 Dim outputFile fout Dim outputPath Dim user outputPath 61 34 D out txt
  • 2022年编程语言热度排行榜来啦,快来看看你学习的语言排第几

    提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 前言 一直以来 xff0c 编程语言都是程序员非常关注的话题 年末将至 xff0c 是否会有程序员发出疑问 2022 年行业需求最大的编程
  • LibEvent-Demo

    libevent test cpp 定义控制台应用程序的入口点 include 34 stdafx h 34 pragma comment lib 34 ws2 32 lib 34 pragma comment lib 34 wsock32
  • 【数据挖掘】DBSCAN聚类算法(python实现)

    一 python代码 39 39 39 Author Vici date 2020 5 14 39 39 39 import math 39 39 39 Point类 xff0c 记录坐标x xff0c y和点的名字id 39 39 39