k-近邻法是一种常用的分类算法。它基于实例之间的相似性度量进行分类,即将未知样本的类别标记为其k个最近邻居中最常见的类别。
1、基础
大概步骤:
1.准备数据:首先,需要准备训练数据集。训练数据集由特征向量和相应的类别标签组成。
2.创建模型:使用fitcknn
函数创建分类模型。可以指定K值(最近邻居的数量)以及其他参数。
3.训练模型:使用训练数据集来训练模型。这将根据特征向量和类别标签之间的关系构建模型。
4.准备测试数据:准备包含待分类样本的测试数据集。
5.进行分类预测:使用已训练的模型对测试数据进行分类预测。可以使用predict
函数来获取预测结果。
6.分类结果评估:对于有已知类别标签的测试数据,可以计算模型的准确率或其他评估指标来评估分类结果的质量。
例:
% 一组训练数据,包含两个特征和相应的类标签
X_train = [1,2; 2,4; 3,6; 1,4; 2,8; 3,12; 3,1; 5,3; 7,4];
Y_train = ['A'; 'A'; 'A'; 'B'; 'B'; 'B'; 'C'; 'C'; 'C'];
% 创建k-近邻模型
k = 2; % 设置k值
mdl = fitcknn(X_train, Y_train, 'NumNeighbors', k);
% 准备测试数据
% 一组测试数据,包含两个特征
X_test = [1.35, 2.7; 6, 4; 3, 13];
% 步骤4:使用k-近邻模型进行分类
Y_pred = predict(mdl, X_test);
% 显示预测结果
disp(Y_pred)
运行结果:
2、+可视化
clear,close all;
N=200; %生成样本数量为200个
X = [randn(N,2)+2*ones(N,2);...
randn(N,2)-2*ones(N,2);];
%生成两个高斯分布数据集,并将它们合并在一起,形成一个2N行2列的矩阵X
%其中前N行代表第一类样本,后N行代表第二类样本
% ====================================================================
fig=figure; %创建一个新的图窗
plot(X(1:N,1),X(1:N,2),'r.') %绘制第一类样本的散点图
hold on, %保持当前图窗,使得后续绘制的图形不会覆盖已有的图形
plot(X(N+1:2*N,1),X(N+1:2*N,2),'b.') %绘制第二类样本的散点图
title('初始样本分布图'), %给图像添加标题
axis([-10,10,-10,10]) %设置坐标轴的范围
% ====================================================================
x=randn(1,2); %生成一个待分类的样本
hold on, %保持当前图窗,使得后续绘制的图形不会覆盖已有的图形
plot(x(1),x(2),'m+','MarkerSize',10,'LineWidth',2)%在图上添加一个十字标记,表示待分类的样本
for i=1:2*N %对每个样本计算它与待分类样本之间的距离并存储在数组dist中
dist(i)=norm(x-X(i,:)); %计算待分类样本与第i个样本之间的欧氏距离
end
[Sdist,index]=sort(dist,'ascend');%对所有距离按照从小到大的顺序排序,并返回排序后的距离值和对应的索引
K=5; %设置近邻数目K,表示取K个近邻作为分类依据
for i=1:K %对前K个距离最小的样本,在图上标记出来
hold on,
plot(X(index(i),1),X(index(i),2),'ko');%在图上用黑色圆圈标记第index(i)个样本
end
legend('Cluster 1','Cluster 2','x','Location','NW')%添加图例,说明各个标记的含义
flag1=0; %初始化第一类近邻数目为0
flag2=0; %初始化第二类近邻数目为0
%统计前K个近邻中第一类样本和第二类样本的数目
for i=1:K
if ceil(index(i)/N)==1 %如果第index(i)个样本属于第一类,则将第一类近邻数目加1
flag1=flag1+1;
elseif ceil(index(i)/N)==2
flag2=flag2+1;
end
end
disp(strcat('K近邻中包含',num2str(flag1),'个第一类样本'));%显示在前K个近邻中有几个是第一类样本
disp(strcat('K近邻中包含',num2str(flag2),'个第二类样本'));%显示在前K个近邻中有几个是第二类样本
if flag1>flag2 %如果第一类近邻数目多于第二类近邻数目,则判断待分类的样本属于第一类
disp('判断待判样本属于第一类');
else
disp('判断待判样本属于第二类');
end
图形处理与可视化