C# 数据结构与算法:近邻算法的详解

文章目录

  • 1、什么是K最近邻算法(KNN)?
  • 2、 KNN算法的原理
  • 3、实现近邻算法
    • 算法使用示例
  • 4、应用:使用KNN算法进行简单的分类
  • 5、算法的优势与不足
  • 6、总结

在这里插入图片描述


近邻算法是一种基于实例的学习方法,它通过找到与给定测试点最接近的训练点来预测未知数据的值。本文将详细解析近邻算法的基本原理,探讨它在数据结构中的应用,展示算法的具体实现方法,并分析其优势与不足。同时,我们还将通过不同领域的应用实例来深入了解近邻算法在实际问题中的应用。

1、什么是K最近邻算法(KNN)?

K最近邻算法是一种基本而且简单的分类算法。在KNN算法中,当要对一个新样本进行分类时,算法会寻找与该样本最相似的K个样本数据,并根据它们的类别来对新样本进行分类。KNN算法的核心思想是“物以类聚”,即相似的样本彼此靠近,属于同一类别的样本应该具有相似的特征。

2、 KNN算法的原理

近邻算法基于一个简单的事实:在一个数据集中,如果两个点在特征空间中的距离很近,那么它们在输出空间中的值也应该是相近的。

算法的主要步骤如下:

  1. 选择一个测试点。
  2. 在数据集中找到与测试点特征空间中最近的点。
  3. 根据这个最近点的输出值来预测测试点的输出值

3、实现近邻算法

下面是一个简单的C#实现:

using System;
using System.Linq;

public class NearestNeighbor
{
    public static double FindNearestNeighbor(double[,] data, double[] point, int dimensions)
    {
        double minDistance = double.MaxValue;
        double result = 0;

        for (int i = 0; i < data.GetLength(0); i++)
        {
            double distance = 0;

            for (int j = 0; j < dimensions; j++)
            {
                distance += Math.Pow(data[i, j] - point[j], 2);
            }

            if (distance < minDistance)
            {
                minDistance = distance;
                result = data[i, dimensions];
            }
        }

        return result;
    }
}

在这个例子中,data 是一个二维数组,其中每一行代表一个数据点,每个数据点有多个特征。point 是一个包含一个数据点的特征向量。dimensions 是数据点的特征数量。

算法使用示例

class Program
{
    static void Main()
    {
        double[,] data = {
            { 1, 2, 3 },
            { 4, 5, 6 },
            { 7, 8, 9 },
            { 10, 11, 12 }
        };

        double[] point = { 5, 4 };
        int dimensions = 3;

        double result = NearestNeighbor.FindNearestNeighbor(data, point, dimensions);
        Console.WriteLine($"The nearest neighbor is: {result}");
    }
}

运行这个程序,你会得到输出 The nearest neighbor is: 6。

4、应用:使用KNN算法进行简单的分类

接下来,我将演示一个简单的C#示例,展示如何使用KNN算法对数据进行分类。在这个示例中,我们将使用一个虚拟的数据集,该数据集包含两个特征(x和y坐标)以及一个类别(标签)。我们将实现一个简单的KNN分类器来对新样本进行分类。

using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static void Main()
    {
        // 创建一个虚拟的训练集
        List<DataPoint> trainingData = new List<DataPoint>
        {
            new DataPoint(1, 2, "A"),
            new DataPoint(2, 3, "A"),
            new DataPoint(3, 4, "A"),
            new DataPoint(5, 6, "B"),
            new DataPoint(7, 8, "B"),
            new DataPoint(9, 10, "B")
        };

        // 创建一个新的待分类样本
        DataPoint newDataPoint = new DataPoint(4, 5);

        // 使用KNN算法对新样本进行分类
        string predictedCategory = ClassifyKNN(trainingData, newDataPoint, k: 3);

        Console.WriteLine($"Predicted category for {newDataPoint}: {predictedCategory}");
    }

    // 定义数据点类
    class DataPoint
    {
        public double X { get; }
        public double Y { get; }
        public string Category { get; }

        public DataPoint(double x, double y, string category = null)
        {
            X = x;
            Y = y;
            Category = category;
        }

        public override string ToString()
        {
            return $"({X}, {Y})";
        }
    }

    // KNN分类函数
    static string ClassifyKNN(List<DataPoint> trainingData, DataPoint newDataPoint, int k)
    {
        var distances = new List<(DataPoint, double)>();

        // 计算新样本与训练集中每个样本之间的距离
        foreach (var dataPoint in trainingData)
        {
            double distance = CalculateEuclideanDistance(newDataPoint, dataPoint);
            distances.Add((dataPoint, distance));
        }

        // 根据距禽找出K个最近的样本
        var kNearestNeighbors = distances.OrderBy(d => d.Item2).Take(k).Select(d => d.Item1);

        // 通过多数表决来确定新样本的类别
        var majorityCategory = kNearestNeighbors.GroupBy(p => p.Category).OrderByDescending(g => g.Count()).First().Key;

        return majorityCategory;
    }

    // 计算欧几里得距离
    static double CalculateEuclideanDistance(DataPoint point1, DataPoint point2)
    {
        double dx = point1.X - point2.X;
        double dy = point1.Y - point2.Y;
        return Math.Sqrt(dx * dx + dy * dy);
    }
}

在这个示例中,我们首先定义了一个DataPoint类来表示数据点,然后实现了一个ClassifyKNN函数来执行KNN分类算法。最后,我们创建了一个虚拟的训练集,并对一个新的待分类样本进行分类,打印出预测的类别。

5、算法的优势与不足

近邻算法的优势在于其简单性和直观性,我们可以很容易地理解并实现这个算法。此外,近邻算法在处理非线性问题和高维数据时表现出色,具有较强的泛化能力。然而,近邻算法也存在一些不足之处。首先,它的计算复杂度较高,因为我们需要计算测试样本与数据集中每个训练样本的距离。其次,我们需要预先指定 K 值,而 K 值的选择对算法的结果有很大影响。最后,近邻算法在处理大规模数据集时可能会遇到性能瓶颈。

6、总结

近邻算法是一种简单而有效的机器学习方法,它在许多领域都有广泛的应用。通过了解近邻算法的基本原理,掌握其在数据结构中的应用,学习算法的具体实现方法,我们可以更好地理解和应用这个算法。然而,我们也要注意到近邻算法的一些不足之处,如计算复杂度高、需要预先指定 K 值等。在实际应用中,我们需要根据问题的具体情况进行合理的选择和优化,以充分发挥近邻算法的优势

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

镭速传输界面优化之静态文件加载

镭速一直是众多企业传输大文件和大数据的优选对象&#xff0c;速度快、稳定且安全是市场上传输软件脱颖而出的立杆标签&#xff0c;那么同样在界面优化和体验的强大也能够给企业用户带来许多直观的感受&#xff0c;那么今天我们就来谈谈镭速是如何做到这些的&#xff0c;在界面…

卷积篇 | YOLOv8改进之引入重新参数化再聚焦卷积RefConv | 即插即用

前言:Hello大家好,我是小哥谈。论文提出了重新参数化再聚焦卷积RefConv作为常规卷积层的替代品,它是一个即插即用模块,可以在没有任何推理成本的情况下提高性能。具体来说,在给定预训练模型的情况下,RefConv对从预训练模型继承的基核进行可训练的再聚焦变换,以建立参数之…

qt笔记之main.cpp加载qml文件的3种方法QQuickView 、QQmlApplicationEngine、QQuickWidget

qt笔记之main.cpp加载qml文件的3种方法QQuickView 、QQmlApplicationEngine、QQuickWidget —— 2024-06-16 下午 code review! 文章目录 qt笔记之main.cpp加载qml文件的3种方法QQuickView 、QQmlApplicationEngine、QQuickWidget1.使用qtcreator创建qml空项目&#xff0c;默…

【python】Sklearn—Cluster

参考学习来自 10种聚类算法的完整python操作示例 文章目录 聚类数据集亲和力传播——AffinityPropagation聚合聚类——AgglomerationClusteringBIRCH——Birch&#xff08;✔&#xff09;DBSCAN——DBSCANK均值——KMeansMini-Batch K-均值——MiniBatchKMeans均值漂移聚类——…

来都来了,8个JavaScript技巧奉上

吆喝一声&#xff0c;如果你计算机、软件工程、电子等相关专业本科及以上学历&#xff0c;欢迎来共事。前后端/测试可投&#xff0c;技术大厂。 JavaScript 作为最流行的语言之一&#xff0c;其语法灵活且每年都在不断吸纳新特性&#xff0c;即使是一个从业多年的老手&#xff…

Hydra常用爆破命令

常用破解命令 SSH 破解 hydra -l 用户名 -p 密码字典 -t 线程 -vV -e ns ip ssh hydra -l 用户名 -p 密码字典 -t 线程 -o save.log -vV ip sshFTP 破解 hydra ftp://ip -l 用户名 -P 密码字典 -t 线程(默认16) -vV hydra ftp://ip -l 用户名 -P 密码字典 -e ns -vVWeb 登陆…

《深入理解Spark RDD缓存机制》(第4天)

文章目录 前言一、小试牛刀&#xff1a;解剖RDD缓存机制&#xff1f;1. 什么是Spark RDD缓存策略1.1 为什幺RDD要做缓存1.2 缓存相关API&#xff1a;1.3 缓存案例解析:1.4 图解缓存效果: 2. 什么是checkpoint缓存2.1 为什么要做checkpoint缓存2.2 checkpoint相关API:2.3 checkp…

爬取CSDN博文到本地(包含图片,标签等信息)

文章目录 csdnToMD改进将CSDN文章转化为Markdown文档那有什么办法快速得到md文档&#xff1f;例如&#xff1a;获取单个文章markdown获取所有的文章markdown 项目中待解决的问题 csdnToMD 项目原作者&#xff1a;https://gitee.com/liushili888/csdn-is—mark-down 改进后仓库…

Linux-账号和权限管理

目录 一、管理用户账号 1、用户账号类型 2、UID--身份标识 3、UID的分类 ​4、用户账号文件​ 5、chage-修改账号密码 5.1、chage—使用格式&#xff1a; 5.2、chage—使用参数&#xff1a; ​6、添加用户账号与管理 6.1、useradd—添加用户 6.2、passwd—设置/修改…

(创新)基于VMD-CNN-BiLSTM的电力负荷预测—代码+数据

目录 一、主要内容&#xff1a; 二、运行效果&#xff1a; 三、VMD-BiLSTM负荷预测理论&#xff1a; 四、代码数据下载&#xff1a; 一、主要内容&#xff1a; 本代码结合变分模态分解( Variational Mode Decomposition&#xff0c;VMD) 和卷积神经网络(Convolutional neu…

【0基础学爬虫】爬虫基础之自动化工具 Appium 的使用

大数据时代&#xff0c;各行各业对数据采集的需求日益增多&#xff0c;网络爬虫的运用也更为广泛&#xff0c;越来越多的人开始学习网络爬虫这项技术&#xff0c;K哥爬虫此前已经推出不少爬虫进阶、逆向相关文章&#xff0c;为实现从易到难全方位覆盖&#xff0c;特设【0基础学…

目标检测——SCUT-HEAD:大规模人头检测数据集的深度剖析

引言 亲爱的读者们&#xff0c;您是否在寻找某个特定的数据集&#xff0c;用于研究或项目实践&#xff1f;欢迎您在评论区留言&#xff0c;或者通过公众号私信告诉我&#xff0c;您想要的数据集的类型主题。小编会竭尽全力为您寻找&#xff0c;并在找到后第一时间与您分享。 在…

Python学习打卡:day11

day11 笔记来源于&#xff1a;黑马程序员python教程&#xff0c;8天python从入门到精通&#xff0c;学python看这套就够了 目录 day1183、自定义 Python 包创建包导入包方式1方式2方式3方式4 84、安装第三方包安装第三方包——pippip的网络优化 安装第三方包——PyCharm 85、…

小林图解系统-三、操作系统结构

Linux 内核 vs Windows 内核 内核 作为应用连接硬件设备的桥梁&#xff0c;保证应用程序只需要关心与内核交互&#xff0c;不需要关心硬件的细节 内核具备四个基本能力&#xff1a; 管理进程、线程&#xff0c;决定哪个进程、线程使用CPU&#xff0c;也就是进程调度的能力&a…

openh264 帧级码率控制原理:RcCalculateIdrQp 函数

RcCalculateIdrQp函数 功能 在码控中&#xff0c;当eSliceType为I_SLICE时 计算 IDR 帧的帧级量化参数QP 值。 原理过程 初始化变量&#xff1a; dBpp&#xff1a;初始化为0&#xff0c;用来存储比特率每像素&#xff08;bits per pixel&#xff09;的值。i&#xff1a;一个…

nginx的正向代理

目录 1 正向代理 1.1 使用正向代理的作用 1.2 Nginx正向代理实战 1.2.1 下载对应版本的nginx&#xff08;源码编译&#xff09; 1.2.2 下载 https 代理模块 1.2.3 使用https代理模块对源代码修改 1.2.4 源码安装 1.2.5 编写systemd 服务单元 1.2.6 修改nginx的主配置文件 1.2.…

虚拟现实环境下的远程教育和智能评估系统(十一)

视频帧画面知识点区域划分 知识点区域精确分割技术: 在深度学习检测模型结果基础上使用基于交并比&#xff08;IoU&#xff09;阈值的目标合并算法&#xff0c;合并过度重合目标区域面积&#xff0c;实现知识点区域精确分割 多模态知识点内容匹配策略: 图像&#xff1a;利用…

【人工智能,机器学习,统计学习,科学表征】开源商用与研发合作

个体工户linjing-lab托管在Github&#xff0c;现公开招募商用与合作人员&#xff0c;目标人群分为以下几个方向&#xff1a; 数学、信息科学、计算机专业的大学高年级学生&#xff0c;熟悉C和面向对象模型&#xff0c;擅长Pybind11编译算子到Python环境。26岁以下的大学本科毕…

PDF文档翻译软件哪个好?分享5款快速翻译的工具

世界各地的交流日益密切&#xff0c;文档翻译服务因此变得不可或缺。 无论是企业间的跨国商务合同&#xff0c;还是学术领域的专业研究论文&#xff0c;准确无误地将文档内容翻译成目标语言&#xff0c;对于保障信息的清晰传达和正确理解极为关键。 在这样的背景下&#xff0…

今日分享:中国石油年金系统交互、视觉设计和vue开发

金融系统交互及UI设计时&#xff0c;需注意简洁明了、色彩合理、字体统一、交互易用、安全感和用户控制。确保用户快速理解、安全操作并提升体验。