在实验中经常会需要计算K近邻,为了避免多次重写,这里用MATLAB实现了一个计算K近邻的函数,该函数要求输入两个参数,第一个参数就是数据矩阵,要求每行为一个多维样本点,第二个参数就是K值了。函数返回K近邻矩阵。计算K近邻比较好的一种算法是利用KD树,这里暂且用的是易于理解的常规方法。使用KD树的代码将来补充。

具体代码实现如下

function [ Result ] = KNN( Data,k )
%计算K近邻的一个通用函数
%要求一行为一个多维变量
%返回Result为一个矩阵,第i行为到第i个数据点的欧几里得距离最短的k个数据点序号的排列,列序数越小距离越近
%计算KNN用KD树要更好一点,这个第一版暂时先用普通方法了datasize = size(Data);
Distance = zeros(datasize(1),datasize(1));%距离矩阵,存放两点之间的距离%%%%% 计算距离矩阵%
%%%%
for i = 1:datasize(1)-1    for j = i+1:datasize(1)tempsum = 0;for ci = 1:datasize(2)tempsum = tempsum + (Data(i,ci)-Data(j,ci))*(Data(i,ci)-Data(j,ci));endDistance(i,j) = sqrt(tempsum);Distance(j,i) = sqrt(tempsum);end
endResult = zeros(datasize(1),k);%结果矩阵
%%%%% 计算结果矩阵%
%%%%
for i = 1:datasize(1)for j = 1:datasize(1)if i==jcontinue;endindex = k;while index>0 && Result(i,index)==0index = index-1;end       if index == 0Result(i,1) = j;elseif Distance(i,j)<Distance(i,Result(i,index))while index>0 && Distance(i,j)<Distance(i,Result(i,index))temp = Result(i,index);Result(i,index) = j;if index<kResult(i,index+1) = temp;endindex = index-1;endelseif index<kResult(i,index+1) = j;endendendendendend

使用的测试代码如下所示

clc,clear
load('Wine.mat')
Data = Wine(:,2:14);
Result = KNN(Data,10)

计算结果如下所示

测试使用的是加州大学欧文分校的机器学习测试数据集中的Wine数据集,下载地址是http://archive.ics.uci.edu/ml/datasets/Wine ,也可以从百度网盘链接链接:https://pan.baidu.com/s/1jKowB8E 密码:xift下载MATLAB的mat文件。

另外上面的测试方法其实是不太好的,最好是先将数据normlize一下。

计算一个向量v在数据集矩阵Data中的K近邻代码:

function [ Result ] = vKNN( v,Data,k )
% 对一个向量量v计算它在Data中的k近邻
% v是那个向量,Data是数据集矩阵,k为近邻数
% 要求向量是一个行向量datasize = size(Data);
Result = zeros(1,k);%结果向量
Distance = zeros(datasize(1),1);%距离矩阵%距离矩阵计算
for i = 1:datasize(1)tempsum = 0;for j = 1:datasize(2)tempsum = tempsum + (Data(i,j)-v(j))*(Data(i,j)-v(j));endDistance(i) = sqrt(tempsum);
endfor j = 1:datasize(1)index = k;while index>0 && Result(index)==0index = index-1;end       if index == 0Result(1) = j;elseif Distance(j)<Distance(Result(index))while index>0 && Distance(j)<Distance(Result(index))temp = Result(index);Result(index) = j;if index<kResult(index+1) = temp;endindex = index-1;endelseif index<kResult(index+1) = j;endendendendend

其实已经有一些人开发了一些在MATLAB中计算K近邻的工具箱,VLFeat就是一个例子,它实现了kmeans,KDTree等多种算法。其下载地址为http://www.vlfeat.org/download.html ,下载完成之后解压,在MATLAB命令行中运行其中的toolbox文件夹下的vl_setup.m即可完成该工具箱的配置,在MATLAB命令行中输入vl_version verbose,,命令如果结果显示类似下图,证明配置成功。

下面是一个使用VLFeat求K近邻的一个例子

clc,clearX = rand(2,100);%一百个二维列向量
kdtree = vl_kdtreebuild(X);%构建kd树Q = rand(2,1);
[index,distance] = vl_kdtreequery(kdtree, X, Q);%返回X中与Q最近的点[index, distance] = vl_kdtreequery(kdtree, X, Q, 'NumNeighbors', 10) ;%返回X中Q的K的近邻scatter(Q(1),Q(2),'p')
hold onfor i = 1:100has = 0;for j = 1:10if index(j)==ihas = 1;break;endendif has==1scatter(X(1,i),X(2,i),'o')hold onelsescatter(X(1,i),X(2,i),'.')hold onendend

MATLAB计算K近邻相关推荐

  1. MATLAB实现k近邻学习(Iris数据集)

    MATLAB实现kNN分类 简介 Iris也称鸢尾花卉数据集,是一类多重变量分析的数据集.数据集包含150个数据样本,分为3类,每类50个数据,每个数据包含4个属性.可通过花萼长度,花萼宽度,花瓣长度 ...

  2. 【MATLAB】Parzen窗与K近邻算法原理与代码详解

    文章目录 1.非参数估计原理 2.Parzen窗 2.1.算法原理 2.2.Matlab实现与参数探究 3.K近邻 3.1.算法原理 3.2.Matlab实现与参数探究 1.非参数估计原理 \qqua ...

  3. K近邻(KNN)算法是基于实例的算法,如果训练样本数量庞大,预测的时候挨个计算距离效率会很低下,如何破解?

    K近邻(KNN)算法是基于实例的算法,如果训练样本数量庞大,预测的时候挨个计算距离效率会很低下,如何破解? K近邻(KNN)是最简单的算法之一,它计算预测样本与训练数据集中每个数据点之间的距离,并找到 ...

  4. k近邻算法matlab实现_k近邻算法

    k 近邻法 (k-NN) 是一种基于实例的学习方法,无法转化为对参数空间的搜索问题(参数最优化 问题).它的特点是对特征空间进行搜索.除了k近邻法,本章还对以下几个问题进行较深入的讨 论: 切比雪夫距 ...

  5. 数据处理 | MATLAB实现KNN(K近邻)缺失数据填补

    数据处理 | MATLAB实现KNN(K近邻)缺失数据填补 目录 数据处理 | MATLAB实现KNN(K近邻)缺失数据填补 基本介绍 插补描述 程序设计 参考资料 基本介绍 用于缺失值插补的单变量方 ...

  6. 【图像处理】图像噪声去除实验 用 matlab 实现KNN(K近邻平滑滤波器)和 SNN(对称近邻平滑滤波器)

    实验内容 实现KNN(K近邻平滑滤波器) 算法实现为函数[im]=KNN_denoise (I,K,N),其中I为读入的图像矩阵:K为最近邻个数,N为模板大小参数(N*N). 测试代码 im=imre ...

  7. Matlab实现加权K近邻

    加权K近邻是K近邻的一种修正,当理解K近邻之后,加权K近邻则很好理解了,不说了,上代码, function label1=WKNN(training,testing,k) [row, column]= ...

  8. matlab knn,MATLAB K近邻算法 — knnsearch() 函数 | 学步园

    K近邻 IDX = knnsearch(X,Y) finds the nearest neighbor in X for each point in Y. X is an MX-by-N matrix ...

  9. 机器学习算法(7)——K近邻(KNN)、K-means、模糊c-均值聚类、DBSCAN与层次与谱聚类算法

    1.K-近邻算法(KNN)概述 (有监督算法,分类算法) 最简单最初级的分类器是将全部的训练数据所对应的类别都记录下来,当测试对象的属性和某个训练对象的属性完全匹配时,便可以对其进行分类.但是怎么可能 ...

最新文章

  1. 探究位置误差对单目3D目标检测影响
  2. 腾讯开放或将触发行业新一轮创业热潮
  3. 什么?用@Async会内存溢出?看看你的线程池配置了没!
  4. python调用dll例子
  5. php 点击按钮更新mysql_PHP与mysql超链接 有更新按钮 跳转更新,删除后数据表中的数据 怎么做来着?...
  6. python从入门到精通pdf百度云下载-跟老齐学Python从入门到精通 电子版(pdf格式)...
  7. 8.3. 测试 opensips
  8. 电脑任务组层叠窗口设置方法
  9. mysql定位前后端问题_Web 前后端分离的意义大吗?
  10. php for next,Nextcloud停留无限登录页面 PHP7的问题及解决方案
  11. linux 添加重定向域名,Linux系统中Nginx的安装并进行域名认证和重定向
  12. 用启动易合并启动光盘图解教程
  13. java 自己的 pid_Java获取自身PID方法搜集
  14. WordPress精美免费主题分享系列全集
  15. 机器学习--支持向量机(一)什么是支持向量机
  16. java中POJO类为什么要实现序列化
  17. Kaggle—共享单车数据分析
  18. win8电脑怎么把计算机快捷方式,Win8怎么隐藏桌面快捷方式小箭头_Win8去掉快捷方式箭头-192路由网...
  19. 稻米之缘农耕稻作文化 国稻种芯-万祥军:影响中国历史走向?
  20. Android 4.0 人脸,Android 4.0.3!原道N90人脸识别试用

热门文章

  1. unity2021.3.2+vuforia10.6.3开发第一个AR程序
  2. Error: setup script specifies an absolute path
  3. 华南理工计算机学硕学科,华南理工大学计算机科学与工程学院硕士研究生学位申请科研成果考核标准(2020年修订)...
  4. 你了解全面的ATE自动测试技术吗?
  5. DMHS部署实践(DM-DM)
  6. 工资条打印 Excel操作
  7. python手把手50天就业(四) 字符串常用操作 第四天上午
  8. 一本关于ChatGPT的书《ChatGPT 革命:了解大型语言模型的力量》免费下载
  9. 计算机软件维护合同违约条款,支持软件维护合同模板
  10. B. Even Array