k-NN 剪辑近邻法

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

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

相关文章

【分享】30秒在线自助制作电子证件照

近期由于自己需要制作电子证件照&#xff0c;所以在网上找在线制作电子证件照的网站&#xff0c;找了很多网站都是收费的&#xff0c;也下载了很多app制作&#xff0c;都是要收费的。最后&#xff0c;所以索性自己开发一个网站制作电子证件照。这里分享给需要的朋友。&#xff…

Jenkins教程-9-发送企业微信测试报告通知

上一小节我们学习了Jenkins上下游关联自动化测试任务的构建的方法&#xff0c;本小节我们讲解一下发送企业微信测试报告通知的方法。 1、自动化用例执行完后&#xff0c;使用pytest_terminal_summary钩子函数收集测试结果&#xff0c;存入本地status.txt文件中&#xff0c;供J…

点云可视化 .ply文件 | 方案汇总

前言 本文分析可视化点云.ply文件的几种方法&#xff0c;包括MeshLab软件、在线可视化点云.ply文件、通过PyntCloud库编程实现。 PLY是一种用于存储三维数据的文件格式&#xff0c;常用于点云数据和多边形网格。 被广泛应用于计算机图形学、3D扫描和3D打印等领域。PLY文件可…

React的Props、生命周期

Props 的只读性 “Props” 是 React 中用于传递数据给组件的一种机制&#xff0c;通常作为组件的参数进行传递。在 React 中&#xff0c;props 是只读的&#xff0c;意味着一旦将数据传递给组件的 props&#xff0c;组件就不能直接修改这些 props 的值。所以组件无论是使用函数…

【GD32】08 - IIC(以SHT20为例)

GD32中的IIC 今天来了解一下GD32中的硬件IIC&#xff0c;其实我个人是觉得软件IIC比较方便的&#xff0c;不过之前文章里用的都是软件IIC&#xff0c;今天就算是走出自己的舒适圈&#xff0c;我们来了解了解GD32中的硬件IIC。 我这里用的型号是GD32F407&#xff0c;不同型号的…

ComfyUI中运行Stable Audio Open,实现背景音乐、音效自由

&#x1f9e8;背景 stability在一个月之前默默的发布了Stable Audio Open 1.0的音频音效生成模型&#xff0c;不过好像影响力一般&#xff0c;也没有太多文章分享测试&#xff0c;而今天看comfyui作者的一篇介绍文档&#xff0c;他已经让comfyui默认支持了这个模型。 原开源地…

Linux 基于sqlite3数据库的学生管理系统

一、数据库 sqlite官网&#xff1a;www.sqlite.org 1.1 数据库的安装 离线安装&#xff1a; sudo dpkg -i sqlite3_3.22.0-1ubuntu0.4_amd64.deb //数据库软件 sudo dpkg -i libsqlite3-dev_3.22.0-1ubuntu0.4_amd64.deb //数据库的库函数 在线安装&#xff1a; sudo apt-get …

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

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

知识图谱——Neo4j数据库实战

数据与代码链接见文末 1.Neo4j数据库安装 JDK 安装:https://www.oracle.com/java/technologies/javase-downloads.html Neo4j 安装:https://neo4j.com/download-center/ 配置好 JDK 和 Neo4j 的环境变量

嵌入式Linux系统编程 — 4.1 字符串输入输出

目录 1 字符串输出 1.1 字符串输出函数简介 1.2 示例程序 2 字符串输入 2.1 字符串输入简介 2.2 示例程序 程序运行时&#xff0c;需打印信息至标准输出 stdout 设备 或标准错误 stderr设备&#xff08;譬如屏幕&#xff09;&#xff0c;如调试信息、报错信息、中间产生的…

数据库课程知识点总结

数据库概述 数据库基本特点&#xff1a;数据结构化&#xff0c;数据独立性&#xff0c;数据冗余小&#xff0c;易扩充&#xff0c;统一管理和控制&#xff0c;永久存储&#xff0c;有组织&#xff0c;可共享 三级模式 模式&#xff1a;一个数据库只有一个模式&#xff0c;是对…

将idea项目代码部署到Linux系统中

目录 1. 将idea与虚拟机建立连接 2. 设置上传到虚拟机的目录 3.上传项目代码 1. 将idea与虚拟机建立连接 打开idea要上传的项目,找到Tools -> Development -> Configuration 设置一个连接的名称,我这里设置为centos 将Type设置为SFTP,点击SSH configuration 开始配…

数据库物理结构设计-定义数据库模式结构(概念模式、用户外模式、内模式)、定义数据库、物理结构设计策略

一、引言 如何基于具体的DBMS产品&#xff0c;为数据库逻辑结构设计的结果&#xff0c;即关系数据库模式&#xff0c;制定适合应用要求的物理结构 1、在设计数据库物理结构前&#xff0c;数据库设计人员首先 要充分了解所用的DBMS产品的功能、性能和特点&#xff0c;包括提供…

抖音集成:通过MessageBox引领数字化营销新潮流

抖音集成&#xff1a;通过MessageBox引领数字化营销新潮流 在数字化营销的大潮中&#xff0c;企业需要不断探索新的方式来优化其营销策略&#xff0c;以抓住更多的市场机会。抖音作为一款全球知名的短视频社交平台&#xff0c;凭借其庞大的用户群体和高度互动的特性&#xff0…

亿发进销存管理系统+:多终端无缝协同,实现经营销售场景全覆盖

亿发软件凭借产品、市场、业务的深入理解&#xff0c;在进销存基础上进行了延伸&#xff0c;推出多终端、一体化的“进销存管理系统”多元产品矩阵。对企业经营中进货、出货、销售、付款等进行全程跟踪管理。有效辅助企业解决业务管理、销售管理、库存管理、财务管理等一系列问…

【论文阅读】-- TSR-TVD:时变数据分析和可视化的时间超分辨率

TSR-TVD: Temporal Super-Resolution for Time-Varying Data Analysis and Visualization 摘要1 引言2 相关工作3 我们的循环生成方法3.1 损失函数3.2 网络架构 4 结果与讨论4.1 数据集和网络训练4.2 结果4.3 讨论 5 结论和未来工作致谢参考文献附录1 训练算法及优化2 网络分析…

02.Ambari自定义服务开发-metainfo.xml介绍

文章目录 metainfo.xml 介绍配置说明Hbase metainfo.xml配置说明配置参数详细介绍配置文件样例DORIS metainfo.xml 介绍 ​ 在Ambari自定义开发中&#xff0c;metainfo.xml 配置文件起着至关重要的作用。它用于定义服务的元数据信息&#xff0c;包括服务的版本、组件、执行脚本…

RabbitMQ基本概念

RabbitMQ是AMQP协议的一个开源实现&#xff0c;所以其基本概念也就是的 AMQP 协 议中的基本概念。如图3-1所示是 RabbitMQ 的整体架构图。 Message(消息):消息是不具名的&#xff0c;它由消息头和消息体组成。消息体是不透明的&#xff0c; 而消息头则由一系列可选属性组成&…

六西格玛绿带可以跳过,直接学六西格玛黑带吗?真实情况告诉你

在现代企业管理中&#xff0c;六西格玛&#xff08;Six Sigma&#xff09;已经成为提升质量和效率的重要工具。对于很多企业而言&#xff0c;培养内部的六西格玛专家&#xff0c;特别是黑带&#xff08;Black Belt&#xff09;&#xff0c;是推动持续改进的关键。然而&#xff…

如何用Vue3和Plotly.js实现一个交互式世界地图动画

本文由ScriptEcho平台提供技术支持 项目地址&#xff1a;传送门 利用 Plotly.js 创建交互式世界生命预期地图 应用场景 本代码展示了如何使用 Plotly.js 创建一个交互式世界生命预期地图&#xff0c;允许用户按年份浏览不同国家和地区的生命预期数据。该地图可以用于研究世…