KNN分类器谈论
1.1 KNN研究内容
(1)分类器的原理和算法流程
(2)利用现有的公开数据集(鸢尾花)实现分类器分类
(3)利用某种评价标准对分类结果进行分析评判
1.2 题目研究的工作基础或实验条件
Matlab程序实现
1.3 主要程序代码
tic %计时
load fisheriris %数据中包含:meas(150*4花特征数据)
% 和species(150*1 花的类属性数据)
meas= meas(1:100,1:2); %选取前两类花的前两个属性进行分类
train=[(meas(1:40,:));(meas(51:90,:))]; %选取数据中每类对应的 前40个作为训练数据
test=[(meas(41:50,:));(meas(91:100,:))]; %选取数据中每类对应的 后10个作为测试数据
trainGroup=[ones(1,40),2*ones(1,40)]'; %类属性设置为1,2
testGroup=[ones(1,10),2*ones(1,10)]';
%KNN分类
mdl=fitcknn(train,trainGroup,'Distance','cityblock','NumNeighbors',100,'Standardize',1,'BreakTies','nearest');
class = predict(mdl,test);
%在matlab中,关于KNN分类的函数为fitcknn,'NumNeighbors'是k值,'cityblock'是计算数据间距离的方法 这里采用曼哈顿距离
%确定类属性的规则,这里选用 最近的K个的最多数 规则
%用plot显示出测试数据分类结果
testGroup=[ones(1,10),2*ones(1,10)]';
figure;
hold on;
plot(testGroup,'o');
plot(class,'*');
legend('正确分类','KNN分类结果');
disp(class);
%计算分类测试的准确率
%正确的分类情况为testGroup,实验测试获得的分类情况为class
count=0;
for i=(1:20)
if class(i)==testGroup(i)
count=count+1;
end
end
fprintf('分类精度为:%f\n' ,count/20);
toc
disp(['运行时间:',num2str(toc)]);
end
1.4 运行结果及分析
运行结果
(1)K=1时:
(3)K=100时:
分析
通过程序的运行得出如下结果,当k=1时,分类准确率为95%、当k=17时,分类准确率为100%、当k=100时,分类准确率为95%。通过结果可以看出,k值的选择会很大程度影响分类效果。
当k值过小时,得到的最邻近数据太少,很大程度影响分类效果。
当k值过大时,模型就会变得过于泛化,影响分类精度。