EDA365电子论坛网
标题:
KNN算法MATLAB实现
[打印本页]
作者:
ulppknot
时间:
2020-10-29 13:24
标题:
KNN算法MATLAB实现
. {) m6 G7 J4 G3 l! p3 `! z& S0 Z
一、kNN概念描述
- i- S& k3 X# H" D( ?( |- a9 V
3 S6 m4 K% i; s+ B
kNN算法又称为k最近邻(k-nearest neighbor classification)分类算法。所谓的k最近邻,就是指最接近的k个邻居(数据),即每个样本都可以由它的K个邻居来表达。
% n7 @( X3 w3 [2 }) F9 M K
* W7 ^: p7 {, p; w N4 j
kNN算法的核心思想是,在一个含未知样本的空间,可以根据离这个样本最邻近的k个样本的数据类型来确定样本的数据类型。
$ j2 e3 v: y0 A7 j! ~2 W
# \, |7 H6 [# s4 ^. Q7 U5 e
该算法涉及3个主要因素:训练集、距离与相似的衡量、k的大小;
4 V* i3 g" t( G9 B9 v, u* M( I
5 x% e5 A& K4 B7 D/ H; \& I8 |
主要考虑因素:距离与相似度的;
+ T# d3 B* }' f* L7 U4 q
0 ]8 ?% N5 _: D/ k3 _" |
二、举例说明
' ~( h( h3 }0 l& l
右图中,绿色圆要被决定赋予哪个类,是红色三角形还是蓝色四方形?
- e+ M. j7 e' b0 d5 a
! C0 B" x9 ~7 u- `- c
如果K=3,由于红色三角形所占比例为2/3,绿色圆将被赋予红色三角形那个类,如果K=5,由于蓝色四方形比例为3/5,因此绿色圆被赋予蓝色四方形类。
( V6 A6 B+ t0 F) B! e: d- W! w
4 N9 ?2 w( M p/ u- t6 d8 l( |
6.png
(18.82 KB, 下载次数: 9)
下载附件
保存到相册
2020-10-29 13:23 上传
/ h0 c* {1 v9 ]0 f8 j
4 `$ e A2 I) I5 k, E0 l$ ?
三、MATLAB实现
3 k/ i: ^/ R1 I1 N
; f3 A0 C# v- V( f. y2 C# {( G
KNN.m:KNN标签预测,输入测试数据、样本数据、样本标签、K值
9 N6 {: w! I8 Z$ P$ y4 n. v
: w) T8 W! y% ^5 Z9 f$ p: O6 T
输出数据:对单个样本预测的标签值
* a- |8 A- D, F J+ v5 n
& D9 w4 T1 e# e" C
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
0 w: q& M# Z4 s# a: A! K
4 j$ r6 d2 d4 v/ }- Y
" V4 Y' x6 T) q0 `
Obj.m 目标函数,返回值为标签预测错误率
' v8 \8 z4 R+ X1 c: p: r
9 g( R* R" Q- A M% A! j7 d2 f/ B
function [value] = kgetObj2(train_F,train_L,test_F,test_L)
k=4;
numTest=size(test_f,1);
numTrain=size(train_F,1);
error=0;
for i=1:numTest
classifyresult= knnsix(test_f(i,:),train_f(1:numTrain,:),train_L(1:numTrain,:),k);
if(classifyresult~=test_L(i,:))
error=error+1;
end
end
value=error/numTest;
end
( p- J6 s/ l+ k3 h! [ Q
作者:
xiaogegepcb
时间:
2020-10-29 13:59
KNN算法MATLAB实现
欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/)
Powered by Discuz! X3.2