C# | DBSCAN聚类算法实现 —— 对直角坐标系中临近点的点进行聚类

news2025/1/18 17:11:24

在这里插入图片描述

C# | DBSCAN聚类算法实现

聚类算法是一种常见的数据分析技术,用于将相似的数据对象归类到同一组或簇中。其中,DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一种基于密度的聚类算法,能够有效地识别出不同形状和大小的簇,同时还能标识出噪声数据。本篇博客将介绍聚类算法的概念、DBSCAN算法的原理,并通过提供的C#代码逐步解析DBSCAN算法的实现过程。

文章目录

  • C# | DBSCAN聚类算法实现
    • 什么是聚类算法
    • 聚类算法的应用
    • 什么是DBSCAN算法
    • DBSCAN算法的思路
    • 使用C#实现DBSCAN聚类算法
      • 核心代码
      • 代码讲解
    • 可视化演示
    • 结束语

什么是聚类算法

聚类算法是一种通过对数据对象进行分组,使得同一组内的对象彼此相似,而不同组之间的对象差异较大的算法。聚类算法的目标是发现数据中的内在结构,并根据对象之间的相似性进行分类。

聚类算法的应用

聚类算法在各个领域中都有广泛的应用,例如:

  1. 市场细分:将消费者分组为不同的市场细分,以便更好地理解其需求和行为模式。
  2. 图像分析:将相似的图像区域聚类在一起,以便进行图像分割、目标检测等任务。
  3. 生物信息学:将基因表达数据聚类,以便发现基因表达模式和生物过程。

什么是DBSCAN算法

DBSCAN算法是一种基于密度的聚类算法,其核心思想是将高密度区域划分为簇,并将低密度区域视为噪声。DBSCAN算法不需要预先指定聚类数量,能够自动发现不同形状和大小的簇,并且对数据分布的要求较低。

DBSCAN算法的思路

DBSCAN算法的过程如下:

  1. 初始化所有点的标签为-1,表示未分类。
  2. 遍历所有点,对每个未分类点进行处理。
  3. 如果点的邻居点数量小于设定的阈值minPts,则将该点标记为噪声点。
  4. 否则,将该点标记为一个新的簇,并将其邻居点加入扩展簇的邻居点列表中。
  5. 遍历扩展簇的邻居点列表,对每个邻居点进行处理。
  6. 如果邻居点未分类,则将其加入当前簇中,并获取其邻居点。
  7. 如果邻居点已经被分类为噪声点,则将其重新分类到当前簇中。
  8. 重复步骤5,直到扩展簇的邻居点列表为空。

使用C#实现DBSCAN聚类算法

核心代码

下面是使用C#实现的DBSCAN聚类算法的代码,我们将逐步解析其实现过程。


        public static int[] Cluster(List<Point> points, int minPts, int eps)
        {
            int n = points.Count;
            int[] labels = new int[n];
            int clusterId = 0;

            // 初始化所有点的标签为-1,表示未分类
            for (int i = 0; i < n; i++)
            {
                labels[i] = -1;
            }

            // 遍历所有点
            for (int i = 0; i < n; i++)
            {
                Point p = points[i];

                // 如果点已经分类,则跳过
                if (labels[i] != -1)
                {
                    continue;
                }

                // 找到p的邻居点
                List<Point> neighbors = GetNeighbors(points, p, eps);

                // 如果邻居点数量小于minPts,则将p标记为噪声点
                if (neighbors.Count < minPts)
                {
                    labels[i] = 0;
                    continue;
                }

                // 新建一个簇
                clusterId++;
                labels[i] = clusterId;

                // 扩展簇
                ExpandCluster(points, labels, p, neighbors, clusterId, eps, minPts);
            }

            return labels;
        }


        public static void ExpandCluster(List<Point> points, int[] labels, Point p, List<Point> neighbors, int clusterId, int eps, int minPts)
        {
            // 遍历邻居点
            for (int i = 0; i < neighbors.Count; i++)
            {
                Point q = neighbors[i];
                int index = points.IndexOf(q);

                // 如果邻居点未分类,则将其加入簇中
                if (labels[index] == -1)
                {
                    labels[index] = clusterId;

                    // 找到q的邻居点
                    List<Point> qNeighbors = GetNeighbors(points, q, eps);

                    // 如果邻居点数量大于等于minPts,则将其加入扩展簇的邻居点列表中
                    if (qNeighbors.Count >= minPts)
                    {
                        neighbors.AddRange(qNeighbors);
                    }
                }
                // 如果邻居点已经被分类为噪声点,则将其重新分类到当前簇中
                else if (labels[index] == 0)
                {
                    labels[index] = clusterId;
                }
            }
        }

代码讲解

在给定的C#代码中,我们可以看到两个主要的方法:ClusterExpandClusterCluster方法是DBSCAN算法的入口点,而ExpandCluster方法负责扩展簇。

Cluster方法中,我们首先对每个点的标签进行初始化,将其设置为-1,表示未分类。然后,我们遍历所有点,对每个未分类点进行处理。

接下来,我们检查当前点的邻居点数量是否小于设定的阈值minPts。如果小于minPts,则将该点标记为噪声点(标签为0),并继续处理下一个点。这里的GetNeighbors方法用于获取当前点的邻居点。

如果邻居点数量大于等于minPts,我们创建一个新的簇,并将当前点标记为该簇的一部分(使用clusterId标识)。然后,我们调用ExpandCluster方法来扩展簇,将邻居点加入扩展簇的邻居点列表中。

ExpandCluster方法中,我们遍历扩展簇的邻居点列表,对每个邻居点进行处理。对于未分类的邻居点,我们将其加入当前簇,并获取其邻居点。对于已经被分类为噪声点的邻居点,我们将其重新分类到当前簇中。

整个过程将重复进行,直到扩展簇的邻居点列表为空,表示该簇无法再扩展。最终,Cluster方法返回每个点的标签数组labels,其中每个元素表示该点所属的簇。

以上是算法的实现思路,你可以根据需要将其应用于自己的数据集,并根据具体情况调整minPtseps的取值,以达到最佳的聚类效果。

可视化演示

以下是基于上述代码实现的DBSCAN算法演示程序。

在这个演示中,我首先打开了程序界面,然后点击“Random Points”按钮,程序随机生成了一些点在界面上。接着,我调整了DBSCAN算法的参数,包括半径和最小点数,然后点击“Cluster”按钮,程序对生成的点进行了聚类。

注:多次调整参数后进行聚类,可以看到不同参数下聚类的效果不同。

在这里插入图片描述

在这里插入图片描述

演示程序下载地址:https://download.csdn.net/download/lgj123xj/88277383

结束语

希望本篇博客对你理解DBSCAN聚类算法有所帮助!如果有任何问题,请随时提问。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/951647.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【算法训练-数组 三】数组中的第K个最大元素(TOPK问题|寻找第K大)

废话不多说&#xff0c;喊一句号子鼓励自己&#xff1a;程序员永不失业&#xff0c;程序员走向架构&#xff01;本篇Blog的主题是【寻找第K大】&#xff0c;使用【数组】这个基本的数据结构来实现&#xff0c;这个高频题的站点是&#xff1a;CodeTop&#xff0c;筛选条件为&…

第 3 章 栈和队列(顺序栈,算法 3.3)

1. 背景说明&#xff1a; 若迷宫 maze 中存在从入口 start 到出口 end 的通道&#xff0c;则求得一条存放在栈中(从栈底到栈顶)&#xff0c;并返回 TRUE&#xff1b;否则返回 FALSE&#xff0c;注意&#xff0c;该解并非最优解&#xff0c; 最优解需要求得最短路径且可能并非…

基于Googlenet深度学习网络的人脸身份识别matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ..................................................................... % 定义修改的范围 …

IP子网的划分

文章目录 一、子网掩码1. 产生背景2. 定义3. 分类 二、VLSM算法1. 得出下列参数2. 计算划分结果3. 举例子计算 三、常见子网划分对应关系四、练习IP编址题目需求解题1. 192.168.1.100/282. 172.16.0.58/263. 25.83.149.222/254. 100.100.243.18/205. 10.100.100.100/10 首先可以…

Python Qt学习(一)一个简单的JSON数据预览界面

先贴上代码&#xff1a; # -*- coding: utf-8 -*-# Form implementation generated from reading ui file json_converter.ui # # Created by: PyQt5 UI code generator 5.15.9 # # WARNING: Any manual changes made to this file will be lost when pyuic5 is # run again. …

Python飞机大战小游戏

游戏规则&#xff1a;键盘上下左右键控制飞机移动 游戏展示图片&#xff1a; 源码&#xff1a; 第一个py命名为&#xff1a;plane_main.py import pygamefrom plane_sprites import *class PlaneGame(object):# """飞机大战主游戏"""def __in…

ExpressLRS开源之基本调试数据含义

ExpressLRS开源之基本调试数据含义 1. 源由2. 代码2.1 debugRcvrLinkstats2.2 debugRcvrSignalStats 3. 含义解释3.1 ID(packetCounter),Antenna,RSSI(dBm),LQ,SNR,PWR,FHSS,TimingOffset3.2 IRQ_CNT,RSSI_AVE,SNR_AVE,SNV_MAX,TELEM_CNT,FAIL_CNT 4. 总结5. 参考资料 1. 源由 …

详解 ElasticSearch Kibana 配置部署

默认安装部署所在机器允许外网 SSH工具 Putty 链接&#xff1a;https://pan.baidu.com/s/1b6gumtsjL_L64rEsOdhd4A 提取码&#xff1a;lxs9 Winscp 链接&#xff1a;https://pan.baidu.com/s/1tD8_2knvv0EJ5OYvXP6VTg 提取码&#xff1a;lxs9 WinSCP安装直接下一步到完成…

UE 5 GAS 在项目中通过数据初始化

近期&#xff0c;在制作多角色&#xff0c;考虑到角色和角色之间有很多共用的内容&#xff0c;正常项目中的实现的话&#xff0c;会通过数据的方式去实现角色初始化&#xff0c;接下来介绍一下&#xff0c;我的实现方式。 以上是我设置的相应的数据&#xff0c;上面最简单的名…

设计模式行为模式-命令模式

文章目录 前言定义结构工作原理优点适用场景消息队列模式Demo实现分写业务总结 前言 定义 命令模式&#xff08;Command Pattern&#xff09;是一种行为型设计模式&#xff0c;用于将请求封装为对象&#xff0c;从而使你可以使用不同的请求、队列或者日志请求来参数化其他对象…

服务器端污染属性反射提升权限

污染属性反射检测服务器端原型污染 通过服务器端原型污染提升权限 Lab: Privilege escalation via server-side prototype pollution 必要知识点 开发人员很容易陷入的一个陷阱是忘记或忽略 JavaScript 循环迭代对象的所有可枚举属性这一事实&#xff0c;包括它通过原型链继…

医学案例|线性回归

一、案例介绍 某医师预研究糖尿病患者的总胆固醇和甘油三酯对空腹血糖的影响&#xff0c;某研究者调查40名糖尿病患者的总胆固醇、甘油三酯和空腹血糖的测量值如下&#xff0c;试根据上述研究问题作统计分析。 二、问题分析 本案例想要研究一些变量&#xff08;总胆固醇和甘油…

PocketMiner:基于深度学习发现蛋白的隐式口袋

文章目录 1. 文章简介2. 前言3. 方法3.1 模型框架 4. 结果4.1 已知隐式口袋在分子动力学模拟分析迅速打开4.2 图神经网络模型能够准确预测模拟中口袋的动态变化4.3 隐式口袋数据集数据集揭示了新的隐式口袋形成的模式4.4 PocketMiner能够从无配体的蛋白结构中精准预测预测口袋4…

2007-2022年上市公司污染排放数据/2007-2022年上市公司污染排放水平、污染排放量数据

2007-2022年上市公司污染排放数据/2007-2022年上市公司污染排放水平、污染排放量数据 1、时间&#xff1a;2007-2022年 2、指标&#xff1a;证券代码、year、化学需氧量、氨氮排放量、总氮、总磷、水体综合污染当量对数、二氧化硫、氮氧化物、烟尘、空气综合污染当量对数、总…

小游戏分发平台如何以技术拓流?

2023年&#xff0c;小游戏的发展将受到多方面的影响&#xff0c;例如新技术的引入、参与小游戏的新玩家以及游戏市场的激烈竞争等。首先&#xff0c;新技术如虚拟现实&#xff08;VR&#xff09;、增强现实&#xff08;AR&#xff09;和机器人技术都可以带来新颖的游戏体验。其…

滑动窗口实例1(长度最小的子数组)

题目&#xff1a; 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl1, ..., numsr-1, numsr] &#xff0c;并返回其长度。如果不存在符合条件的子数组&#xff0c;返回 0 。 示例 1&#xff1a; …

VC++使用Microsoft Speech SDK进行文字TTS朗读

Microsoft Speech SDK下载地址 https://www.microsoft.com/en-us/download/details.aspx?id=10121 需要msttss22L.exe、SpeechSDK51.exe、SpeechSDK51LangPack.exe三个,下载后全部安装 使用VS2005建立一个win32控制台项目 朗读"hello word"、中文“你好”的程序 …

百科有不需要的信息怎么删除?

百科词条的权威性众所周知&#xff0c;所以百度百科的内容审核也非常严格&#xff0c;百科营销成为目前网络营销工作中一个难点&#xff0c;很多企业无法得到自己完全满意的百度百科词条 &#xff0c;这其实也是合理的。小马识途营销顾问分析&#xff0c;百科词条内容是提供给广…

10、【WebGIS实战】图层篇——通用服务图层加载全流程(适用于全部图层)

大家好,我是X北辰北。本文是「WebGIS实战」系列,关注这个标签,阅读所有文章,成为WebGIS开发高手。 图层可以理解为添加到地图上面的数据,比如我们要在地图上展示成都市所有大型公园的位置,那么当前地图中除了初始化地图时添加的底图之外,在底图的上面我们还叠加了一份关…

HuggingFace中的 Files and versions 如何优雅下载到本地?(Python requests,tqdm)

前言 在使用huggingface把玩各种大模型时&#xff0c;如果选择从远程加载模型&#xff0c;这个过程可能因为网络问题而非常耗时甚至直接失败&#xff0c;所以把模型、分词器等相关文件下载到本地&#xff0c;再直接从本地加载就成了不可回避的流程。 在进入具体版本的模型后&…