MATLAB分类与判别模型算法: 快速近邻法(FastNN)分类程序【含Matlab源码 MX_005期】

server/2024/9/24 12:19:09/

算法思路介绍:

1. 数据准备阶段:
   生成一个合成数据集 `X`,其中包含三个簇,每个簇分布在不同的区域。
   定义聚类层数 `L` 和每个层次的子集数量 `l`。

2. 聚类阶段:
   使用K均值聚类算法将初始数据集 `X` 分成 `l` 个簇。
   对于每个簇,计算其中心点 `Mp` 和最大半径 `Rp`,以及每个点到中心点的距离 `D`。
   对每个簇,存储其数据点 `Xp`,中心点 `Mp` 和半径 `Rp`。

3. 树搜索阶段:
     选择一个待判定的样本 `x`。
     初始化一个阈值 `B` 为正无穷,当前层数 `CurL` 为 1,以及节点指针 `p` 为 0。
     进入主循环,直到所有节点都被搜索完毕:
     在每一轮中,从当前节点的子节点中选择一个最有可能的节点,计算其与待判定样本的距离。
     如果当前节点是叶子节点:
               检查是否有更近的邻居点,更新最近邻距离 `B` 和最近邻点 `Xnn`。
       如果当前节点不是叶子节点:
               进入下一层,继续搜索。

4. 输出结果:
   输出最近邻点 `Xnn` 和其索引。

主要步骤:

数据准备阶段:
   1. 生成合成数据集 `X`。
   2. 定义聚类层数 `L` 和每个层次的子集数量 `l`。

聚类阶段:
   1. 对数据集进行 K 均值聚类。
   2. 存储每个簇的数据点、中心点和半径。

树搜索阶段:
   1. 初始化参数,如待判定样本 `x`、阈值 `B`、当前层数 `CurL` 和节点指针 `p`。
   2. 在循环中,从当前节点的子节点中选择一个最有可能的节点。
   3. 如果当前节点是叶子节点,则检查是否有更近的邻居点。
   4. 如果当前节点不是叶子节点,则进入下一层继续搜索。

输出结果:
    输出最近邻点 `Xnn` 和其索引。

部分代码(完整代码在最后):

% ---进行树搜索---
tic
x=randn(1,2);%待判样本
B=inf;CurL=1;p=0;TT=1;
while TT==1 %步骤2Xcurp=cell(1);CurTable=cell(l,1);CurPinT=zeros(l,1);Dx=zeros(l,1);RpCur=zeros(l,1);%当前节点的直接后继放入目录表   for i=1:l   CurTable(i,1)=Xp(i+p*l,1);CurPinT(i)=i+p*l;Dx(i)=norm(x-Mp(i+p*l,:))^2;RpCur(i)=Rp(i+p*l);end    while 1 %步骤3[rowT,colT]=size(CurTable);for i=1:rowT                   if Dx(i)>B+RpCur(i)+eps%从目录表中去掉当前节点pCurTable(i,:)=[];CurPinT(i)=[];Dx(i)=[];RpCur(i)=[];break;endend[CurRowT,CurColT]=size(CurTable);if CurRowT==0CurL=CurL-1;p=floor((p-1)/3);if CurL==0TT=0; break;  else%转步骤3endelseif CurRowT>0[Dxx,Dxind]=sort(Dx,'ascend');p1=CurPinT(Dxind(1));p=p1;%从当前目录表去掉p1for j=1:CurRowTif CurPinT(j)==p1Xcurp(1,1)=CurTable(j,1);CurTable(j,:)=[];CurPinT(j)=[];CurD=Dx(j);%记录D(x,Mp)Dx(j)=[];RpCur(j)=[];                    break;endendif CurL==LXcurpMat=cell2mat(Xcurp);[CurpRow,CurpCol]=size(XcurpMat);CurpMean=Mp(p,:);for k=1:CurpRowDxi=norm((XcurpMat(k,:)-CurpMean))^2;if CurD>Dxi+B+epselseDxxi=norm((x-XcurpMat(k,:)))^2;if Dxxi<B+epsB=Dxxi;Xnn=XcurpMat(k,:);endendendelseCurL=CurL+1;break;endendend
end
B,Xnn,NN=find(X(:,1)==Xnn(1))
time1=toc

结果展示:

完整代码:MATLAB分类与判别模型算法: 快速近邻法(FastNN)分类程序


http://www.ppmy.cn/server/47830.html

相关文章

计算机系统基础知识-经典题目

【第1题】 对计算机评价的主要性能指标有时钟频率、 (1) 、运算精度和内存容量等。对数据库管理系统评价的主要性能指标有 (2) 、数据库所允许的索引数量和最大并发事务处理能力等。 (1) A.丢包率 B.端口吞吐量 C.可移植性 D.数据处理速率 (2) A.MIPS B.支持协议和标准 C.最大…

ubuntu使用Docker笔记

一、参考资料 1、B站视频 尚硅谷Docker实战教程 2、有心人整理的笔记 Docker笔记&#xff08;周阳版&#xff09; 3、菜鸟教程 Docker 教程 以下是本人的折腾实践。 二、Docker的安装 2.1、使用清华源安装docker&#xff0c;清华源官方教程。 本人是在ubuntu20.04下安装的…

flink Transformation算子(更新中)

flink Transformation算子部分 Transformation算子 map 该方法是将一个DataStream调用map方法返回一个新的DataStream。本质是将该DataStream中对应的每一条数据依次迭代出来&#xff0c;应用map方法传入的计算逻辑&#xff0c;返回一个新的DataStream。原来的DataStream中对…

[12] 使用 CUDA 加速排序算法

使用 CUDA 加速排序算法 排序算法被广泛用于计算应用中有很多排序算法,像是枚举排序或者说是秩排序、冒泡排序和归并排序,这些排序算法具有不同的(时间和空间)复杂度,因此对同一个数组来说也有不同的排序时间,对于大数组而言,可能会很耗时如果排序算法能用 CUDA 加速,则…

VSCode和SAP WebIDE通过nginx代理访问HTTPS访问SAP ERP

如果SAP ERP的HTTPS是自签名证书&#xff0c;或者是开发系统证书过期了&#xff0c;通过导入证书等方式&#xff0c;还是比较麻烦&#xff0c;不然索性用http协议访问&#xff0c;方法是本地电脑安装个nginx 服务器&#xff0c;比如下面的配置&#xff0c;启动nginx&#xff0c…

Jtti:怎么在香港服务器上实现多点备份?

在香港服务器上实现多点备份可以采用多种方法和工具&#xff0c;主要目标是将数据备份到不同的存储位置&#xff0c;以增加数据的安全性和可靠性。以下是实现多点备份的一些常用方法&#xff1a; 1. 使用云存储服务 利用云存储服务将数据备份到不同的云存储提供商&#xff0c;以…

相机等效焦距

1. 背景 物理焦距我们很熟悉,但是在接触实际的相机参数时,相机厂家会提到一个参数等效焦距,甚至有时候不提供物理焦距,这时候如果我们得到真实的物理焦距需要进行一定的转换.在介绍两者之间的转换关系前,先介绍一下等效焦距的由来. 如上图,假设在某一个镜头,其成像面会出现图…

YOLO-Worldv2两分钟快速部署

本次部署使用的框架基于ultralytics&#xff0c; 并且已经集成最新版本的YOLOv8框架&#xff1a; 一键环境配置 pip install ultralytics基础使用 训练 from ultralytics import YOLOWorld model YOLOWorld(yolov8x-worldv2.pt) results model.train(datacoco8.yaml, epo…