K近邻的MATLAB实现
【原创】Liu_LongPo 转载请注明出处
【CSDN】http://blog.csdn.net/llp1992
参考https://blog.csdn.net/llp1992/article/details/45040685
KNN 算法其实简单的说就是“物以类聚”,也就是将新的没有被分类的点分类为周围的点中大多数属于的类。它采用测量不同特征值之间的距离方法进行分类,思想很简单:如果一个样本的特征空间中最为临近(欧式距离进行判断)的K个点大都属于某一个类,那么该样本就属于这个类。这就是物以类聚的思想。
当然,实际中,不同的K取值会影响到分类效果,并且在K个临近点的选择中,都不加意外的认为这K个点都是已经分类好的了,否则该算法也就失去了物以类聚的意义了。
KNN算法的不足点:
1、当样本不平衡时,比如一个类的样本容量很大,其他类的样本容量很小,输入一个样本的时候,K个临近值中大多数都是大样本容量的那个类,这时可能就会导致分类错误。改进方法是对K临近点进行加权,也就是距离近的点的权值大,距离远的点权值小。
2、计算量较大,每个待分类的样本都要计算它到全部点的距离,根据距离排序才能求得K个临近点,改进方法是:先对已知样本点进行剪辑,事先去除对分类作用不大的样本。
适用性:
适用于样本容量比较大的类域的自动分类,而样本容量较小的类域则容易误分
算法描述:
1、计算已知类别数据集合汇总的点与当前点的距离2、按照距离递增次序排序3、选取与当前点距离最近的K个点4、确定距离最近的前K个点所在类别的出现频率5、返回距离最近的前K个点中频率最高的类别作为当前点的预测分类
Matlab 实现
这里以一个完整实例呈现,代码如下:
function relustLabel = KNN(inx,data,labels,k)
%%
% inx 为 输入测试数据,data为样本数据,labels为样本标签
%%[datarow , datacol] = size(data);
diffMat = repmat(inx,[datarow,1]) - data ;
distanceMat = sqrt(sum(diffMat.^2,2));
[B , IX] = sort(distanceMat,'ascend');
len = min(k,length(B));
relustLabel = mode(labels(IX(1:len)));end
实际调用中,我们利用一个数据集进行测试,该数据集是由1000个样本的3维坐标组成,共分为3个类
首先可视化我们的数据集,看看它的分布:
第一维和第二维:可以清晰地看到数据大致上分为 3 类
第1维和第3维:从这个角度看,3类的分布就有点重叠了,这是因为我们的视角原因
画出3维,看看它的庐山真面目:
由于我们已经编写了KNN代码,接下来我们只需调用就行。了解过机器学习的人都应该知道,很多样本数据在代入算法之前都应该进行归一化,这里我们将数据归一化在[0,1]的区间内,归一化方式如下:
newData = (oldData-minValue)/(maxValue-minValue)
其中,maxValue为oldData的最大值,minValue为 oldData 的最小值。
同时,我们对于1000个数据集,采取10%的数据进行测试,90%的数据进行训练的方式,由于本测试数据之间完全独立,可以随机抽取10%的数据作为测试数据,代码如下:
function KNNdatgingTest
%%
clc
clear
close all
%%
data = load('datingTestSet2.txt');
dataMat = data(:,1:3);
labels = data(:,4);
len = size(dataMat,1);
k = 4;
error = 0;
% 测试数据比例
Ratio = 0.1;
numTest = Ratio * len;
% 归一化处理
maxV = max(dataMat);
minV = min(dataMat);
range = maxV-minV;
newdataMat = (dataMat-repmat(minV,[len,1]))./(repmat(range,[len,1]));% 测试
for i = 1:numTestclassifyresult = KNN(newdataMat(i,:),newdataMat(numTest:len,:),labels(numTest:len,:),k);fprintf('测试结果为:%d 真实结果为:%d\n',[classifyresult labels(i)])if(classifyresult~=labels(i))error = error+1;end
endfprintf('准确率为:%f\n',1-error/(numTest))
end
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
当我们选择K为4的时候,准确率为:97%
K近邻的MATLAB实现相关推荐
- k近邻算法matlab实现_k近邻算法
k 近邻法 (k-NN) 是一种基于实例的学习方法,无法转化为对参数空间的搜索问题(参数最优化 问题).它的特点是对特征空间进行搜索.除了k近邻法,本章还对以下几个问题进行较深入的讨 论: 切比雪夫距 ...
- knn(k近邻算法)——matlab
目录 1. 基本定义 2. 算法原理 2.1 算法优缺点 2.2 算法参数 2.3 变种 3.算法中的距离公式 4.案例实现 4.1 读取数据 4.2 分离训练集和测试集 4.3 归一化处理 4.4 ...
- 【MATLAB】Parzen窗与K近邻算法原理与代码详解
文章目录 1.非参数估计原理 2.Parzen窗 2.1.算法原理 2.2.Matlab实现与参数探究 3.K近邻 3.1.算法原理 3.2.Matlab实现与参数探究 1.非参数估计原理 \qqua ...
- 数据处理 | MATLAB实现KNN(K近邻)缺失数据填补
数据处理 | MATLAB实现KNN(K近邻)缺失数据填补 目录 数据处理 | MATLAB实现KNN(K近邻)缺失数据填补 基本介绍 插补描述 程序设计 参考资料 基本介绍 用于缺失值插补的单变量方 ...
- MATLAB实现k近邻学习(Iris数据集)
MATLAB实现kNN分类 简介 Iris也称鸢尾花卉数据集,是一类多重变量分析的数据集.数据集包含150个数据样本,分为3类,每类50个数据,每个数据包含4个属性.可通过花萼长度,花萼宽度,花瓣长度 ...
- MATLAB计算K近邻
在实验中经常会需要计算K近邻,为了避免多次重写,这里用MATLAB实现了一个计算K近邻的函数,该函数要求输入两个参数,第一个参数就是数据矩阵,要求每行为一个多维样本点,第二个参数就是K值了.函数返回K ...
- 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 ...
- 【图像处理】图像噪声去除实验 用 matlab 实现KNN(K近邻平滑滤波器)和 SNN(对称近邻平滑滤波器)
实验内容 实现KNN(K近邻平滑滤波器) 算法实现为函数[im]=KNN_denoise (I,K,N),其中I为读入的图像矩阵:K为最近邻个数,N为模板大小参数(N*N). 测试代码 im=imre ...
- Matlab实现加权K近邻
加权K近邻是K近邻的一种修正,当理解K近邻之后,加权K近邻则很好理解了,不说了,上代码, function label1=WKNN(training,testing,k) [row, column]= ...
最新文章
- 结合项目实例 回顾传统设计模式(九)迭代器模式
- vb6.0 mysql ado控件_VB6.0里的ADO控件怎么用?
- 对象属性结构赋值_(六)面向对象-下
- 从QQ进程内存中搜索出QQ号码
- 15分钟内使用Twilio和Stormpath在Spring Boot中进行身份管理
- jvm垃圾回收之类加载机制
- 准备一些万圣节的乐趣——UI设计素材模板
- 困惑我半年的一个问题终于解决了
- Linux命令解释之find
- 如何 珍惜自己和珍重别人。珍惜一切
- Ceph 撸源码系列(二):Ceph源代码里的那些锁 std::mutex(2 of 3)
- 图数据库 Titan 快速入门
- css单线边框_css border-collapse设置表格单线边框和双线边框
- 什么是PLC的响应时间
- 应届生面试自我介绍该怎么说?
- 智能家居软件测试用例,智能家居助理HomeAssistant的实践和测试
- Windows 11 中打印时提示打印机不兼容,都来是“+”惹的祸
- Maxcompute Sql性能调优(1)
- Linux之NTFS、FAT32、exFAT 各种格式硬盘挂载整理
- i5 8250u java_i5 8250U整机综合性能_笔记本评测-中关村在线