模式识别(K近邻算法)

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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 值。

相关文档
最新文档