数据结构与算法Bonus-KNN问题的代码求解过程

一、问题提出

(一)要求

1.随机生成>=10万个三维点的点云,并以适当方式存储

2.自行实现一个KNN算法,对任意Query点,返回最邻近的K个点

3.不允许使用第三方库(e.g.flann,PCL,opencv)!

4.语言任选(推荐C++或者Python)

(二)规则

1.正确实现(3')

2.优于Flann、PCL在相同输入下的KNN求解函数中的一种(2')

3.优于Flann、PCL在相同输入下的KNN求解函数中的两种(2')

4.创新性评估(3')

二、KNN算法概述

KNN(K-Nearest Neighbor)算法,也称为K最邻近法,是一种基本的机器学习算法,属于有监督学习中的分类算法。该算法最初由Cover和Hart于1968年提出,具有简单直观的特点。

KNN算法的思路是:如果一个样本在特征空间中的K个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。这里的K通常是一个用户指定的整数,通常选取奇数以避免出现平局的情况。

KNN算法的距离度量通常是欧氏距离,但也可以使用其他距离度量方法。在选择K值时,较小的K值可能会使算法对噪声更加敏感,而较大的K值可能会使算法分类边界变得模糊。因此,选择合适的K值对于KNN算法的性能至关重要。

三、算法描述

(一)语言选择

所选语言为MATLAB,软件版本为MATLAB R2022a

(二)算法原理

K近邻算法,即是给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的K个实例,这K个实例的多数属于某个类,就把该输入实例分类到这个类中。(这就类似于现实生活中少数服从多数的思想),也就是在训练数据集中寻找与待预测样本A距离最近的K个样本,如果K个样本中大多数属于类别甲,少数属于类别乙,那个就可以认为样本A属于类别甲。

(三)距离度量

一般计算样本在多维空间的距离有两种方式:欧式距离和曼哈顿距离。

在实际KNN问题应用中,距离函数的选择应该根据数据的特性和分析的需要而定,选择欧式距离表示。

(四)算法流程

1.设置样本点数量,此处定义N为样本点数目的一半。

2.设置矩阵label1、label2存储样本点所属类别,label1为第一类,label2位第二类。

3.生成随机数矩阵data1、data2。为了使样本点更具分散性,此处选择直接使用rand函数,而不是正态随机数randn和mvnrnd函数。

4.利用三维绘图函数scatter3绘制两类样本点,如下图所示(此处使用N=100举例,增加可视性):

其中,红色代表第一类样本点,蓝色代表第二类样本点。

  1. 设置K值为11(K必为奇数),即周围11个样本点。
  2. 遍历从(3,3,3)至(7,7,7)范围内的125个点,间隔为1个单位。

7.计算待预测样本与训练数据集中样本特征之间的欧式距离dis。

8.按照距离递增的顺序,使用sort函数排序,返回排序后的矩阵B及其索引值矩阵index。

9.选取距离最近的K个样本以及所属类别的次数,输出最近的K个样本坐标(见附件:最邻近K点输出结果.xlsx)。

10.分别用变量c1、c2存储出现的类别次数,返回前k个点所出现频率最高的类别作为预测分类结果。

11.数据可视化处理,如下图所示(N为100时):

当n=50000时(即分析10万个样本点时),图像如下图所示:

四、代码实现 

% KNN算法
clear all;
clc;
%总体样本点数量为2N
N=50000;
% 每一个数据有两个特征
label1 = ones(N,1);%第一类点云序号,记为1
label2 = 1+ones(N,1);%第二类点云序号,记为2
%生成第一类数据
data1 =  10*rand(N,3);%坐标范围为[0,10]
data1(data1<0)=0;
%生成第二类数据
data2 =  10*rand(N,3);
data2(data1<0)=0;
scatter3(data1(:,1),data1(:,2),data1(:,3),'ro')%红色圆圈代表第一类数据
hold on;
scatter3(data2(:,1),data2(:,2),data2(:,3),'b^')%蓝色三角代表第二类数据
hold on;
data = [data1;data2];%两类数据整合,放在一个矩阵里
label = [label1;label2];%两类数据类别序号整合,也放在一个矩阵里
K= 11;%K值为11,表示周围最近的11个点。K为奇数
for i1 = 3:7for i2 = 3:7for i3=3:7testdata = [i1 i2 i3];distance=zeros(2*N,1);dis = sum((data-testdata).^2,2);%返回包含每一行总和的列向量[B index]= sort(dis);%返回索引值indexfor j=1:Kdisp("与点("+num2str(i1)+","+num2str(i2)+","+num2str(i3)+")相邻的第"+num2str(j)+"个点的坐标为:("+num2str(data(index(j,1),1))+","+num2str(data(index(j,1),2))+","+num2str(data(index(j,1),3))+")");enddisp(' ');%换行newLabel = label(index(1:K));c1 = 0;c2 = 0;for ii = 1:Kif newLabel(ii)==1c1 = c1+1;%第一类的点数量加一elsec2 = c2+1;%第二类的点数量加一endendif c1>c2%第一类的数量的点更多scatter3(testdata(1),testdata(2),testdata(3),50,'ro','filled')else%第二类的数量的点更多scatter3(testdata(1),testdata(2),testdata(3),50,'bo','filled')endendend
end
legend('第一类','第二类')

整体过程偏向于暴力,仅供参考 

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

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

相关文章

ChatGPT编程实现简易聊天工具

ChatGPT编程实现简易聊天工具 今天借助[[小蜜蜂]][https://zglg.work]网站的ChatGPT练习socket编程&#xff0c;实现一个简易聊天工具软件。 环境&#xff1a;Pycharm 2021 系统&#xff1a;Mac OS 向ChatGPT输入如下内容&#xff1a; ChatGPT收到后&#xff0c;根据返回结…

深度学习设计-基于机器学习的心血管疾病分析与预测

概要 在国富民强的今天&#xff0c;医疗卫生事业快速发展&#xff0c;平均人口寿命也逐年上升&#xff0c;随之而来的是人口老龄化问题&#xff0c;而心 血管疾病是近年来发病率极高的老年性疾病。其发病率和死亡率均有所上升&#xff0c;已然成为当今威胁人类健康的重大疾 病之…

【记录搭建elk 如何在linux共享文件】

『如何在linux共享文件 &#xff0c;搭建elk直接看第二部分』 新增用户a b c adduser a adduser b adduser c新增用户组 A groupadd developteam将用户a b c 加入 组 usermod -a -G developteam hadoop usermod -a -G developteam hbase usermod -a -G developteam hive设置um…

【GPT-SOVITS-06】特征工程-HuBert原理

说明&#xff1a;该系列文章从本人知乎账号迁入&#xff0c;主要原因是知乎图片附件过于模糊。 知乎专栏地址&#xff1a; 语音生成专栏 系列文章地址&#xff1a; 【GPT-SOVITS-01】源码梳理 【GPT-SOVITS-02】GPT模块解析 【GPT-SOVITS-03】SOVITS 模块-生成模型解析 【G…

Unity游戏项目接广告

Unity游戏项目中接入GoogleAdMob 先看效果图 接入测试横幅广告&#xff0c;代码如下&#xff1a; using System.Collections; using System.Collections.Generic; using UnityEngine; using GoogleMobileAds.Api; using System;public class GoogleAdMobManager : MonoBehavi…

Godot 学习笔记(1):环境配置

文章目录 前言Godot 环境配置相关链接最简单的按钮项目Sence打包最简单的按钮事件 总结 前言 我从小就有个梦想&#xff0c;我想做游戏。虽然我大学的时候选择了计算机&#xff0c;工作也是计算机&#xff0c;但是我一直没有时间去学游戏引擎。原因有二&#xff1a;第一&#…

问题解决:关于tomcat无法连接问题的解决

安装tomcat并配置环境变量 下载tomcat并安装 首先去tomcat官方网站,下载tomcat 进入tomcat官方网站之后&#xff0c;查看jdk应该对应的tomcat版本&#xff0c;点击图示的按钮 点击完毕之后&#xff0c;可以看到下述的页面 图中的表格可以看到对应的jdk版本与tomcat的版本之…

docker基础用法-2

文章目录 什么是dockerOCI&OCFOCIOCF docker架构docker镜像与镜像仓库docker对象安装及使用dockerdocker安装docker加速docker常用操作docker event state防火墙状态及规则 什么是docker docker中的容器&#xff1a; lxc --> libcontainer --> runC docker最开始是…

Qt for Mac阻止MacOS系统休眠

Qt开发的应用程序如果电脑休眠了会影响软件的使用&#xff0c;因此在软件的使用过程中需要防止电脑休眠&#xff0c;在Win上有专门的API进行处理&#xff0c;在Mac上也必需使用Mac平台自身的API&#xff0c;本篇介绍在Mac平台下使用Qt阻止Mac系统休眠。 要调用Mac系统的API&am…

如何用Selenium通过Xpath,精准定位到“多个相同属性值以及多个相同元素”中的目标属性值

前言 本文是该专栏的第21篇,后面会持续分享python爬虫干货知识,记得关注。 相信很多同学,都有使用selenium来写爬虫项目或者自动化页面操作项目。同样,也相信很多同学在使用selenium来定位目标元素的时候,或多或少遇见到这样的情况,就是用Xpath定位目标元素的时候,页面…

html5cssjs代码 023 公制计量单位进位与换算表

html5&css&js代码 023 公制计量单位进位与换算表 一、代码二、解释 这段HTML代码定义了一个网页&#xff0c;用于展示公制计量单位的进位与换算表。 一、代码 <!DOCTYPE html> <html lang"zh-cn"> <head><meta charset"utf-8&quo…

新!PCA+DBO+K-means聚类,蜣螂优化算法DBO优化K-means,适合学习,也适合发paper。

PCADBOK-means聚类&#xff0c;蜣螂优化算法DBO优化K-means&#xff0c;适合学习&#xff0c;也适合发paper。 一、 蜣螂优化算法 摘要&#xff1a;受蜣螂滚球、跳舞、觅食、偷窃和繁殖等行为的启发&#xff0c;提出了一种新的基于种群的优化算法(Dung Beetle Optimizer, DBO…

【开源】SpringBoot框架开发就医保险管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 科室档案模块2.2 医生档案模块2.3 预约挂号模块2.4 我的挂号模块 三、系统展示四、核心代码4.1 用户查询全部医生4.2 新增医生4.3 查询科室4.4 新增号源4.5 预约号源 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVue…

数学建模博弈理论与实践国防科大版

目录 4.博弈模型 4.1.Nash平衡点和帕雷托最优 4.2.囚徒困境 4.3.智猪博弈 4.4.脏脸之谜 5.军事问题数学建模 5.1.兰彻斯特作战模型 5.1.1.一般战斗模型 5.1.2游击战模型 5.1.3.混合战模型 5.2.硫磺岛战役 4.博弈模型 本讲介绍博弈模型&#xff0c;包括博弈论&#x…

u盘文件损坏怎么恢复数据?分享三个数据恢复方法

随着科技的飞速发展&#xff0c;U盘已成为我们日常生活和工作中不可或缺的数据存储工具。然而&#xff0c;由于各种原因&#xff0c;如不当操作、病毒感染或硬件故障等&#xff0c;U盘中的文件可能会受到损坏。那么&#xff0c;当U盘文件损坏时&#xff0c;我们该如何恢复数据呢…

【回归预测】基于DBO-BP(蜣螂优化算法优化BP神经网络)的回归预测 多输入单输出【Matlab代码#68】

文章目录 【可更换其他算法&#xff0c;获取资源请见文章第6节&#xff1a;资源获取】1. BP神经网络2. 蜣螂优化算法3. DBO-BP神经网络模型的构建4. 部分代码展示5. 仿真结果展示6. 资源获取 【可更换其他算法&#xff0c;获取资源请见文章第6节&#xff1a;资源获取】 1. BP神…

FFmpeg分析视频信息输出到指定格式(csv/flat/ini/json/xml)文件中

1.查看ffprobe帮助 输出格式参数说明: 本例将演示输出csv,flat,ini,json,xml格式 输出所使用的参数如下: 1.输出csv格式: ffprobe -i 4K.mp4 -select_streams v -show_frames -of csv -o 4K.csv 输出: 2.输出flat格式: ffprobe -i 4K.mp4 -select_streams v -show_frames …

玩转C语言——数组初探

一、前言 通过前面的学习&#xff0c;我们已了解C语言的结构变量、分支结构和循环结构。今天&#xff0c;我们一起来认识C语言的另一知识点——数组。先赞后看&#xff0c;养成习惯。 二、数组概念 学习数组&#xff0c;我们要明白数组是什么。在我看来&#xff1a;数组是⼀组…

云服务器2核4G5M配置代表什么意思?

腾讯云服务器2核4G5M带宽配置是代表什么&#xff1f;代表2核CPU、4G内存、5M公网带宽&#xff0c;这是一款轻量应用服务器&#xff0c;系统盘为60GB SSD云硬盘&#xff0c;活动页面 txybk.com/go/txy 活动打开如下图&#xff1a; 腾讯云2核4G5M服务器 如上图所示&#xff0c;这…

练习8 Web [GYCTF2020]Blacklist

这道题其实不是堆叠注入&#xff0c;但是我在联合查询无效后&#xff0c;试了一下堆叠&#xff0c;最后一步发现被过滤的sql语句太多了&#xff0c;完全没法 查阅其他wp的过程[GYCTF2020]Blacklist 1&#xff08;详细做题过程&#xff09; 是用的handler语句&#xff0c;只能用…