最近邻法和k-近邻法 学号:02105120 姓名:吴林 一.基本概念: 最近邻法:对于未知样本x,比较x 与N 个已知类别的样本之间的欧式距离,并决策x 与距离它最近的样本同类。 K 近邻法:取未知样本x 的k 个近邻,看这 k 个近邻中多数属于哪一类,就把 x 归为哪一类。K 取奇数,为了是避免 k1=k2 的情况。 二.问题分析: 要判别x 属于哪一类,关键要求得与x 最近的k 个样本(当 k=1 时,即是最近邻法),然后判别这 k 个样本的多数属于哪一类。 可采用欧式距离公式求得两个样本间的距离s=sqrt((x1-x2)^2+(y1-y2)^2) 三.算法分析: 该算法中任取每类样本的一半作为训练样本,其余作为测试样本。例如 iris 中取每类样本的25 组作为训练样本,剩余 25 组作为测试样本,依次求得与一测试样本x 距离最近的k个样本,并判断 k 个样本多数属于哪一类,则 x 就属于哪类。测试 10 次,取 10 次分类正确率的平均值来检验算法的性能。 四.MATLAB 代码: 最近邻算实现对Iris 分类 clc; totalsum=0; for ii=1:10 data=load('iris.txt'); data1=data(1:50,1:4);%任取 Iris-setosa 数据的25 组 rbow1=randperm(50); trainsample1=data1(rbow1(:,1:25),1:4); rbow1(:,26:50)=sort(rbow1(:,26:50));%剩余的25 组按行下标大小顺序排列 testsample1=data1(rbow1(:,26:50),1:4); data2=data(51:100,1:4);%任取 Iris-versicolor 数据的25 组 rbow2=randperm(50); trainsample2=data2(rbow2(:,1:25),1:4); rbow2(:,26:50)=sort(rbow2(:,26:50)); testsample2=data2(rbow2(:,26:50),1:4); data3=data(101:150,1:4);%任取 Iris-virginica 数据的25 组 rbow3=randperm(50); trainsample3=data3(rbow3(:,1:25),1:4); rbow3(:,26:50)=sort(rbow3(:,26:50)); testsample3=data3(rbow3(:,26:50),1:4); trainsample=cat(1,trainsample1,trainsample2,trainsample3);%包含75组数据的样本集 testsample=cat(1,testsample1,testsample2,testsample3); newchar=zeros(1,75);sum=0; [i,j]=size(trainsample);%i=60,j=4 [u,v]=size(testsample);%u=90,v=4 for x=1:u for y=1:i result=sqrt((testsample(x,1)-trainsample(y,1))^2+(testsample(x,2)-trainsample(y,2))^2+(testsample(x,3)-trainsample(y,3))^2+(testsample(x,4)-trainsample(y,4))^2); %欧式距离 newchar(1,y)=result; end; ...