阅读 93

K-近邻分类(matlab数学建模)

本文主要简要介绍K-近邻分类概念,然后就怎样基于K-近邻分类找到待查询数据的K个邻居并可视化、怎样对待查询数据进行分类提供两个官方示例。后续将介绍怎样找到多个查询数据邻近点并分类、怎样自定义距离度量及一些距离度量的介绍、怎样质量检测并修改优化以及涉及到的一些函数用法介绍。关于怎样封装一个K-近邻分类函数且具备较强的可扩展性、可复用性后续也将尝试编辑并开源。

概念

官方解释:用官方的话来说,所谓K近邻算法,即是给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的K个实例(也就是上面所说的K个邻居), 这K个实例的多数属于某个类,就把该输入实例分类到这个类中。

其他解释:在特征空间中,如果一个样本附近的k个最近(即特征空间中最邻近)样本的大多数属于某一个类别,则该样本也属于这个类别。

找到查询数据K个邻居

示例(建议先直接复制体验)

%导入数据
load fisheriris
x = meas(:,3:4);
%绘制点图及图例
gscatter(x(:,1),x(:,2),species)
legend('Location','best')
%查询数据及可视化查询数据
newpoint = [5 1.45];
line(newpoint(1),newpoint(2),'marker','x','color','k',...
   'markersize',10,'linewidth',2)
%准备kd-tree搜索模型
Mdl = KDTreeSearcher(x)
%找到查询数据的10个邻近点
[n,d] = knnsearch(Mdl,newpoint,'k',10);
%可视化邻近点
line(x(n,1),x(n,2),'color',[.5 .5 .5],'marker','o',...
    'linestyle','none','markersize',10)
    
%{
%使轴相等,以便计算出的距离与绘图轴上的视距离相等,然后放大以更好地查看相邻对象。
xlim([4.5 5.5]);
ylim([1 2]);
axis square
%}    

%计算不同邻近点所占比例
tabulate(species(n))

%{
%通过在周围画一个圆圈,直观地识别出他们的邻居
ctr = newpoint - d(end); %定义圆心
diameter = 2*d(end); %定义直径
h = rectangle('position',[ctr,diameter,diameter],...
   'curvature',[1 1]); %绘图
h.LineStyle = ':'; %圆圈样式
%}
复制代码

使用k-近邻对查询数据进行分类

示例

%导入数据
load fisheriris
X = meas;
Y = species;
%构造KNN分类器并指定近邻数量
Mdl = fitcknn(X,Y)
Mdl.NumNeighbors = 4;
%预测分类
flwr = mean(X);
flwrClass = predict(Mdl,flwr)

%{
%质量检测
%检查再置换损失
rloss = resubLoss(Mdl)
%检查交叉验证损失
CVMdl = crossval(Mdl);
kloss = kfoldLoss(CVMdl)
%}
复制代码
文章分类
阅读
文章标签