模式识别(K近邻算法)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
K 近邻算法
1.算法思想
取未知样本的x 的k 个近邻,看这k 个近邻中多数属于哪一类,就把x 归于哪一类。具体说就是在N 个已知的样本中,找出x 的k 个近邻。设这N 个样本中,来自1w 类的样本有1N 个,来自2w 的样本有2N 个,...,来自c w 类的样本有c N 个,若c k k k ,,,21 分别是k 个近邻中属于c w w w ,,,21 类的样本数,则我们可以定义判别函数为:
c i k x g i i ,,2,1,)( ==
决策规则为:
若i i j k x g max )(=,则决策j w x ∈ 2.程序代码
%KNN 算法程序
function error=knn(X,Y ,K)
%error 为分类错误率
data=X;
[M,N]=size(X);
Y0=Y;
[m0,n0]=size(Y);
t=[1 2 3];%3类向量
ch=randperm(M);%随机排列1—M
error=0;
for i=1:10
Y1=Y0;
b=ch(1+(i-1)*M/10:i*M/10);
X1=X(b,:);
X(b,:)=[];
Y1(b,:)=[];
c=X;
[m,n]=size(X1); %m=15,n=4
[m1,n]=size(c); %m1=135,n=4
for ii=1:m
for j=1:m1
ss(j,:)=sum((X1(ii,:)-c(j,:)).^2);
end
[z1,z2]=sort(ss); %由小到大排序
hh=hist(Y1(z2(1:K)),t);
[w,best]=max(hh);
yy(i,ii)=t(best); %保存修改的分类结果
end
error=error+sum(Y0(b,:)~=yy(i,:)');
X=data;
end
error=error/M;
%算法主程序:
clc
clear all
load iris.mat
%iris.mat中存放X为150*4的iris数据,Y为150*1的分类结果,以下均使用该数据
n=0;
for i=1:10
error=knn(X,Y,1);
n=n+error;
end
correct=1-n/10
3.程序运行结果
做十折交叉验证得到:
当K=1时,正确分类概率为:0.9587
当K=3时,正确分类概率为:0.9613
当K=5时,正确分类概率为:0.9640
当K=7时,正确分类概率为:0.9653
当K=10时,正确分类概率为:0.9667
当K=30时,正确分类概率为:0.9480
当K=60时,正确分类概率为:0.9027
4.结果分析
从以上的结果我们可以看出当k较小时,随着k的增加,其正确分类的概率也逐渐增加;然而当k增加到一定的值时,即k取较大的值时,随着k的增加,其正确率并没有随之增加,反而大大降低了。因此在实际中选择K的值时应慎重考虑,结合实际结果,选取合适的K 值。