k-NN 剪辑近邻法

news2024/11/13 10:28:16

       本篇文章是博主在人工智能等领域学习时,用于个人学习、研究或者欣赏使用,并基于博主对人工智能等领域的一些理解而记录的学习摘录和笔记,若有不当和侵权之处,指出后将会立即改正,还望谅解。文章分类在AI学习笔记

      AI学习笔记(10)---《k-NN 剪辑近邻法

k-NN 剪辑近邻法

目录

1. 前言

2.相关知识

2.1最邻近法决策规则

2.2剪辑最近邻算法基本原理

3.K-means 算法原理

3.1k 最近邻法( k-NN )

3.2重复剪辑最近邻法

4.编程实现

4.1最近邻法MATLAB代码

4.2 剪辑最近邻法MATLAB代码

4.3 测试输入


1. 前言

        理解并掌握基本最邻近法( k-NN )的算法思想以及基本过程,并实现一个 k-NN 算法的函数。

        理解并掌握剪辑最近邻算法思想以及基本过程,并实现一个剪辑最近邻算法的函数。


2.相关知识

2.1最邻近法决策规则

2.2剪辑最近邻算法基本原理

        这种方法的思想是,在最近邻算法的基础上,理清两类间的边界,去掉类别混杂的样本,使两类别的边界更清晰。这样,不仅能够减少最近邻法判别类别的样本数量从而提升分类效率,还在理论上明显好于一般的最近邻法。

         可以证明,经过剪辑的最近邻法的渐进误判概率接近 Bayes 误判概率。        


3.K-means 算法原理

3.1k 最近邻法( k-NN )

        由于上述方法只根据离待识别模式最近的一个样本的类别而决定其类别,通常称其为最近邻法或 1-NN 法。

3.2重复剪辑最近邻法

        只要样本足够多,就可以重复地执行剪辑程序,以进一步提高分类性能。这里给出一种称为 MULTIEDIT 的使用算法:


4.编程实现

4.1最近邻法MATLAB代码

function [rm] = step1_mission(samples, labels, k, x)
    
    [m,n] = size(samples); % 获取样本矩阵 samples 的维度,m 为样本数量,n 为特征数量
    E = zeros(1,m); % 初始化长度为 m 的零向量,用于存储距离值
    c = 0; % 初始化类别计数器
    for i=1:m % 遍历每一个样本
        E(i) = norm(samples(i,:)-x)/sqrt(n); % 计算每个样本与输入向量 x 的欧氏距离,并标准化
        c = max(c,labels(i)); % 更新类别计数器,获取样本中最大的类别标签
    end
    kc = zeros(c,1); % 初始化长度为 c 的零向量,用于存储每个类别的计数
    for i=1:k % 选取前 k 个最近邻
        [b,j] = min(E); % 找到距离最小的样本及其索引
        kc(labels(j)) = kc(labels(j)) + 1; % 对应类别计数加一
        E(j) = []; % 删除已选择的最近邻的距离值,防止重复选择
    end
    [~,rm] = max(kc); % 找到计数最多的类别作为最终分类结果,并返回其标签值   

end

4.2 剪辑最近邻法MATLAB代码

function [samples, labels] = step2_ans(samples, labels, s, k)
    while 1==1 % 无限循环,直到满足终止条件
        [m,n] = size(samples); % 获取样本矩阵 samples 的维度,m 为样本数量,n 为特征数量
        stride = ceil(m/s); % 计算每个子集的步长,即每个子集的样本数量
        edi = zeros(1,m); % 初始化长度为 m 的零向量,用于标记需要编辑的样本
        head = zeros(1,s); % 初始化长度为 s 的零向量,用于存储每个子集的起始索引
        tail = zeros(1,s); % 初始化长度为 s 的零向量,用于存储每个子集的结束索引
        for i=1:s
            head(i)=(i-1)*stride+1; % 计算每个子集的起始索引
            tail(i)=min(head(i)+stride-1,m); % 计算每个子集的结束索引
        end
        for i=1:s % 遍历每个子集
            eh = head(mod(i,s)+1); % 获取下一个子集的起始索引
            et = tail(mod(i,s)+1); % 获取下一个子集的结束索引
            for j=head(i):tail(i) % 遍历当前子集中的每个样本
                y = step1_ans_func(samples(eh:et,:),labels(eh:et),k,samples(j)); % 调用 step1_ans_func 函数预测样本 j 的标签
                if abs(y-labels(j)) > 10e-6 % 判断预测标签与真实标签是否相差过大
                    edi(j) = 1; % 标记需要编辑的样本
                end
            end
        end
        if max(edi)<1 % 如果没有需要编辑的样本,跳出循环
            break
        end
        edi_idx = find(edi==0); % 找出所有未标记的样本索引
        samples = samples(edi_idx,:); % 更新样本矩阵,只保留未标记的样本
        labels = labels(edi_idx); % 更新标签向量,只保留未标记的样本对应的标签
        size(samples); % 获取更新后的样本矩阵的大小
    end
end

function [rm] = step1_ans_func(samples, labels, k, x)
    [m,n] = size(samples); % 获取样本矩阵 samples 的维度,m 为样本数量,n 为特征数量
    E = zeros(1,m); % 初始化长度为 m 的零向量,用于存储距离值
    c = 0; % 初始化类别计数器
    for i=1:m % 遍历每一个样本
        E(i) = norm(samples(i,:)-x)/sqrt(n); % 计算每个样本与输入向量 x 的欧氏距离,并标准化
        c = max(c,labels(i)); % 更新类别计数器,获取样本中最大的类别标签
    end
    kc = zeros(c,1); % 初始化长度为 c 的零向量,用于存储每个类别的计数
    for i=1:k % 选取前 k 个最近邻
        [b,j] = min(E); % 找到距离最小的样本及其索引
        kc(labels(j)) = kc(labels(j)) + 1; % 对应类别计数加一
        E(j) = []; % 删除已选择的最近邻的距离值,防止重复选择
    end
    [~,rm] = max(kc); % 找到计数最多的类别作为最终分类结果,并返回其标签值   
end

4.3 测试输入

MATLAB终端输入下面指令

step1_mission(samples, labels, k, x)

samples = [-7.82 -4.58 -3.97; -6.68 3.16 2.71; 4.36 -2.91 2.09; 6.72 0.88 2.80; -8.64 3.06 3.50; -6.87 0.57 -5.45; 4.47 -2.62 5.76; 6.73 -2.01 4.18; -7.71 2.34 -6.33; -6.91 -0.49 -5.68; 6.18 2.81 5.82; 6.72 -0.93 -4.04; -6.25 -0.26 0.56; -6.94 -1.22 1.13; 8.09 0.20 2.25; 6.81 0.17 -4.15; -5.19 4.24 4.04; -6.38 -1.74 1.43; 4.08 1.30 5.33; 6.27 0.93 -2.78];
labels = [1    2    2    2   1   1    2    2   1   1    2    2   1   1    2    2    2   1    2    2];


disp('task1');
rm = step1_mission(samples(1:20,:),labels(1:20),1,[10 10 10])

disp('task2');
rm = step1_mission(samples(1:20,:),labels(1:20),3,[10 10 10])

disp('task3');
rm = step1_mission(samples(1:20,:),labels(1:20),5,[10 10 10])

disp('task4');
rm = step1_mission(samples(1:20,:),labels(1:20),7,[10 10 10])

disp('task5');
rm = step1_mission(samples(1:20,:),labels(1:20),9,[10 10 10])

 测试step2_ans(samples, labels, s, k)

randn('state',1);
warning off;

num = 200;
R1 = [5 0; 0 1];
R2 = [10 0; 0 25];
u1 = [-3 0];
u2 = [5 0];
Y1 = multivrandn(u1,R1,num,1);
Y2 = multivrandn(u2,R2,num,2);
L1 = ones(1,num);
L2 = L1 * 2;

Y = [Y1; Y2];
L = [L1 L2];
size(Y);
size(L);

randIndex = randperm(size(Y,1));

Y = Y(randIndex,:);
L = L(randIndex);

subplot(211);
plot(Y1(:,1),Y1(:,2),'*');
hold on;
plot(Y2(:,1),Y2(:,2),'o');



[ry, rl]  = step2_mission(Y, L, 4, 5);
idx1 = find(rl==1);
idx2 = find(rl==2);
size(ry);
ry1 = ry(idx1,:);
ry2 = ry(idx2,:);
subplot(212);
plot(ry1(:,1),ry1(:,2),'*');
hold on;
plot(ry2(:,1),ry2(:,2),'o');

saveas(1,'./result/myfig.png');

[ans_ry, ans_rl]  = step2_ans(Y, L, 4, 5);
ans_idx1 = find(ans_rl==1);
ans_idx2 = find(ans_rl==2);
size(ans_ry);
ans_ry1 = ans_ry(ans_idx1,:);
ans_ry2 = ans_ry(ans_idx2,:);
subplot(212);
plot(ans_ry1(:,1),ans_ry1(:,2),'*');
hold on;
plot(ans_ry2(:,1),ans_ry2(:,2),'o');

saveas(1,'./answer/ans.png');

diff = sum(ans_rl-rl)+sum(sum(ans_ry-ry));
if diff==0 
    disp('OK');
else
    disp('Not Equal!')
end


     文章若有不当和不正确之处,还望理解与指出。由于部分文字、图片等来源于互联网,无法核实真实出处,如涉及相关争议,请联系博主删除。如有错误、疑问和侵权,欢迎评论留言联系作者,或者私信联系作者。

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

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

相关文章

基于halcon的眼在手外(Eye-to-Hand)标定

前言 上个月写了一个《基于halcon的眼在手上&#xff08;Eye-in-Hand&#xff09;标定》的文章&#xff0c;通过官方的示例代码进行了简单的叙述&#xff0c;想学习的小伙伴可以点击链接进行学习。之前博主认为眼在手上&#xff08;Eye-in-Hand&#xff09;的案例更多&#xff…

【Java笔记】Flyway数据库管理工具的基本原理

文章目录 1. 工作流程2. 版本号校验算法3. 锁机制3.1 为什么数据库管理工具需要锁3.2 flyway的锁机制 Reference 最近实习做的几个项目都用到了Flyway来做数据库的版本管理&#xff0c;顺便了解了下基本原理&#xff0c;做个记录。 详细的使用就不写了&#xff0c;网上教程很多…

【财经研究】并购重组的“不可能三角”

伴随着沪深IPO景气度下滑后&#xff0c;并购重组正受到市场的关注。 近期监管层正频频为并购重组发声 6月20日&#xff0c;证监会主席吴清在陆家嘴论坛上指出&#xff1a;“支持上市公司运用各种资本市场工具增强核心竞争力&#xff0c;特别是要发挥好资本市场并购重组主渠道作…

干涉阵型成图参数记录【robust】

robust 这个玩意经常忘记&#xff0c;就是取2的时候是更加显示大尺度的结构&#xff0c;取-2更加显示小尺度结果&#xff0c;一般取0就是正常就好了

高效同步的PWM升压DC/DC转换器 SD6201/SD6201-AF

SD6201是高效同步的PWM升压DC/DC转换器优化为介质提供高效的解决方案电力系统。这些设备在输入电压介于0.9V和4.4V之间&#xff0c;带有1.4MHz固定频率切换。这些功能通过允许使用小型、薄型电感器以及陶瓷电容器。自动PWM/PFM轻负载下的模式切换可节省电力提高了效率。电压在2…

IMU坐标系与自定义坐标系转化

1.首先示例图为例&#xff1a; 虚线黑色角度为IMU的坐标系&#xff1b;实线为自定义坐标系&#xff1b; 矫正&#xff1a;&#xff08;默认angleyaw为IMU采的数据角度&#xff09; angleyaw_pt angleyaw-25;if(-180<angleyaw&&angleyaw<-155) // 角度跳变问…

GuiLite C语言实现版本

简介 本项目是idea4good/GuiLite的C语言实现版本&#xff0c;基于2024-06-20节点的版本&#xff08;提交ID&#xff1a;e9c4b57&#xff09;。 本项目仓库&#xff1a;GuiLite_C 需求说明 作为芯片从业人员&#xff0c;国产芯片普遍资源有限&#xff08;ROM和RAM比较少-都是…

Str.format()方法

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 语法参考 在Python2.6之后&#xff0c;提供了字符串的format()方法对字符串进行格式化操作。format()功能非常强大&#xff0c;格式也比较复杂&…

深度学习论文撰写实验对比分析时复现其它论文方法的问题

&#x1f4aa; 专业从事且热爱图像处理&#xff0c;图像处理专栏更新如下&#x1f447;&#xff1a; &#x1f4dd;《图像去噪》 &#x1f4dd;《超分辨率重建》 &#x1f4dd;《语义分割》 &#x1f4dd;《风格迁移》 &#x1f4dd;《目标检测》 &#x1f4dd;《暗光增强》 &a…

BERT论文略读

《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》 &#xff08;https://arxiv.org/abs/1810.04805&#xff09; 摘要&#xff1a;前人优秀工作仅用了单向信息且不能很好的应用到各类下游任务&#xff0c;本文提出一种基于Transformer的双…

如何理解AKM?

关于Wi-Fi的加密认证过程&#xff0c;我们前面已经讲解&#xff1a;WLAN数据加密机制_tls加密wifi-CSDN博客 今天我们来理解下AKM&#xff0c;AKM&#xff08;Authentication and Key Management&#xff09;在Wi-Fi安全中是指认证和密钥管理协议。它是用于确定Wi-Fi网络中的认…

【Linux】Linux下使用套接字进行网络编程

&#x1f525;博客主页&#xff1a; 我要成为C领域大神&#x1f3a5;系列专栏&#xff1a;【C核心编程】 【计算机网络】 【Linux编程】 【操作系统】 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 本博客致力于知识分享&#xff0c;与更多的人进行学习交流 ​ 用于网络应用开…

揭秘数据合并的秘密:一文掌握一对一、多对一、多对多合并技巧与实战!

使用pd.merge()合并 类似 MySQL 中表和表直接的合并merge与concat的区别在于,merge需要依据某一共同的行或列来进行合并使用pd.merge()合并时,会自动根据两者相同column名称的那一列,作为key来进行合并每一列元素的顺序不要求一致1. 一对一合并 df1 = pd.DataFrame({"…

搜维尔科技:SenseGlove Nova2国内首款支持手掌心力回馈手套开售

《SenseGlove Nova 2》现正全球发行中! 搜维尔科技独家代理最新上市的 SenseGlove Nova 2 是世上首款&#xff0c;也是目前市面上唯一一款提供手掌力回馈的无缐VR力回馈手套&#xff0c;它结合了三种最先进的反馈技术&#xff0c;包括主动反馈、强力反馈及震动反馈&#xff0c…

k8s学习笔记(一)

configMap 一般用来存储配置信息 创建configMap 从文件中获取信息创建&#xff1a;kubectl create configmap my-config --from-file/tmp/k8s/user.txt 直接指定信息&#xff1a; kubectl create configmap my-config01 --from-literalkey1config1 --from-literalkey2confi…

小九首度回应与小水分手传闻揭秘

#小九首度回应&#xff01;与小水分手传闻揭秘#近日&#xff0c;泰国娱乐圈掀起了一股热议的狂潮&#xff01;传闻中的“金童玉女”组合——“小水”平采娜与“小九”NINE疑似分手的消息&#xff0c;如同巨石投入平静的湖面&#xff0c;激起了千层浪花。而在这股狂潮中&#xf…

CesiumJS【Basic】- #020 加载glb/gltf文件(Primitive方式)

文章目录 加载glb/gltf文件(Primitive方式)1 目标2 代码实现3 资源文件加载glb/gltf文件(Primitive方式) 1 目标 使用Primitive方式加载glb/gltf文件 2 代码实现 import * as Cesium from "cesium";const viewer = new Cesium.Viewer

x264 码率控制 VBV 算法原理:数学模型与数据流转

x264 码率控制 VBV 算法原理 关于 VBV原理的分析可以参考:x264 码率控制 VBV 原理。关于 VBV 算法的源码分析可以参考:x264 码率控制中实现 VBV 算法源码分析。VBV算法介绍 x264中的VBV(Video Buffering Verifier)算法是H.264编码标准的一部分,主要用于码率控制,确保视频…

C语言实战 | “俄罗斯方块”游戏重构

之前的游戏中,为了方便大家掌握框架,在“贪吃蛇”游戏中使用了大量的全局变量。全局变量空间利用率不高,全局变量在程序的执行过程中一直占用存储单元,而不是仅在需要时才开辟单元。另外,全局变量降低了通用性,程序执行时还需要依赖全局变量。例如,显示“食物”和“球”…

计算机的错误计算(十四)

摘要 解读 GPU和CPU计算上的精度差异&#xff1a;GPU 的 3个输出的相对误差分别高达 62.5%、50%、62.5%。 例1. 计算下列两个矩阵的乘积&#xff1a; 显然&#xff0c;其结果为第一列&#xff1a; 这个结果是准确的。 例2. 已知上面 3 个矩阵是由下面代码产生或输出&…