基于MATLAB R2018a库函数构建KNN分类器

基于MATLAB R2018a库函数构建KNN分类器

本文主要介绍基于MATLAB R2018a的KNN分类器介绍。主要内容是参考MATLAB 帮助文档。较低版本的MATLAB可能无法查询到相关的函数。

在matlab命令行输入“doc ClassificationKNN class”查看此帮助文档。

文中的一些函数名称可能会漏打或者多打几个字母,读者编程的时候以MATLAB帮助文档为主。

从一个库函数fitcknn()谈起

严格意义上,fitcknn不是一个函数,而是一个类(class)。函数fitcknn()可以被认为是这个类的构造函数。这个类的主要作用是构建一个KNN分类器对象。接下来将详细介绍ficknn类,这里偷个懒,相当于翻译一下帮助文档。

构造函数

  1. mdl = fitcknn(X,Y) 返回分类器模型对象,输入参数:X是训练数据,Y是标签。X是一个数值矩阵,每一行表示一个样本数据。Y可以是数值向量,逻辑向量,或者元组等,用于表示每个样本的标签。因此X的行数应该等于Y的长度,都表示样本的个数。
  2. mdl = fitcknn(Tbl,ResponseVarName) Tb1是一个table类型的数据,每一行表示一个样本的观察.每一列表示一个属性变量。“ResponseVarName”表示Tb1的最后一列表示标签。在原文中分别使用“predictor”和“response”来表示属性和标签这两个含义。
  3. mdl = fitcknn(Tbl,Y) 如果不使用“ResponseVarName”参数,那么默认Tb1只包含训练器要用到的数据,不包含标签,因此需要使用Y,其中存放着每个样本观察的标签。
  4. mdl = fitcknn(Tbl,formula) 使用formula来描述标签和属性变量的关系,比如标签只与Tb1的某几个属性有关,与其他属性无关时,就可以用这个formula。具体用法参见help文档。个人感觉这个用处不是很大,不作具体介绍。

类的属性(Properties)

所有类的属性,可以在使用构造函数时,通过键值对来赋值或者修改。

  1. W:与Y的长度和X的函数相同的非负数值向量。用于表示对应样本观测的权值。
  2. Sigma:数值向量,长度等于属性变量的个数,表示对应属性变量做归一化时的标准差。
  3. PredictorNames:属性变量的变量名。
  4. ResponseName:标签变量的变量名。
  5. ClassNames:标签的种类,存放每种标签的名字。
  6. Prior:数值向量。每一类标签的先验概率,也就是每种类别在X中的占比。向量中的元素对应ClassNames中的元素。
  7. NumNeighbors:正数,表示KNN最邻近的个数。
  8. NumObservations:用于训练分类器的样本数,小于或者等于X的行数。因为如果X中存在NaN,这些数据无效,会导致训练数据小于X的行数。或者说,即使X中有些数据错误,也不会导致程序报错,这个库函数是具有容错性的
  9. Mu:数值向量,长度等于属性变量的个数,表示每个属性变量的均值。用于归一化。
  10. Distance:字符向量或者函数句柄。表示KNN所选择的距离标准,比如是欧几里得距离还是其他距离等。可选参数见Help文档。选择不同的距离标准还受到搜索方法的限制,搜索方法由NsMethod参数决定。
  11. ModelParameters:训练分类器使用到的参数。NsMethod就在其中。NsMethod参数有“exhaustive”和“kdtree”两种,分别是穷举搜索和基于树的搜索。
  12. DistanceWeight:字符向量或者函数句柄。可选参数有’equal’‘incerse’‘squareinverse’,分别表示无权重、与距离的一次方成反比、与距离的二次方成反比。
  13. DistParameter:距离标准的额外参数。可选参数’mahalanobis’‘minkowski’‘seuclidean’,分别表示正定相关矩阵C、闵可夫斯基距离指数(一个正的标量)、元素为正的向量且长度等于X的列数。笔者对于这个Property也不是很理解,望赐教
  14. ExpandedPredictorNames:如果模型是用了编码以后的属性变量,那么这个采纳数用于描述扩展的变量。
  15. HyperparameterOptimizationResults:
  16. IncludeTies:逻辑值。表示是否包含所有第k个距离最小的点。 如果不包含,需要通过BreakTies做更加详细的设置。
  17. Cost:代价矩阵。

方法成员(Methods)

在介绍方法成员之前,需要介绍一些名词的概念。这些概念当然也可以在帮助文档中找到。

后验概率(posterior probability)$\hat{P}(k|x)$在已有观察值x的基础上,判断其为第k类的概率。计算方法是用第k类邻近的点的个数除以观察值x所有邻近点的个数。

分数(score):一个模型的分数就是这个模型的后验概率。

裕度(margin):判断正确的类的分数与判断错误的类的最大分数之间的差距。

边(edge):裕度的均值。

  1. compareHoldout():比较两个模型的精确度。输入是两个模型各自的训练数据和测试数据,输出是假设检验结果、p值和分类损失。这个函数主要是建立在假设检验理论之上的。
  2. crossval():KNN分类器交叉验证。输入是KNN模型,输出是一个ClassificationPartitionedModel的对象。交叉验证分类模型是MATLAB中另一个比较重要的模型,将在之后的博客中介绍。
  3. edge():KNN分类器的边,是裕度的均值
  4. loss():KNN分类器的损失函数。损失函数有很多类别,具体使用哪总类别可以在输入参数中选择,在这里不做详细说明。
  5. margin():KNN分类器的裕度。
  6. pretict():使用KNN分类器模型预测标签。预测的目标是使分类误差平均代价最小。
    y ^ = a r g m i n y = 1 , 2 , . . . , K k = 1 K P ^ ( k x ) C ( y k ) \hat{y} = \displaystyle argmin_{y=1,2,...,K}\sum_{k=1}^{K}\hat{P}(k|x)C(y|k)
    其中 y ^ \hat{y} 表示被预测的类别; K K 表示类别的数量; P ^ ( k x ) \hat{P}(k|x) 表示在已知观察值 x x 已知的条件下其为第 k k 类的后验概率; C ( y K ) C(y|K) 表示把第 k k 类误判成第 y y 类的代价。
    在这里,预测的核心其实就是参数估计。
  7. resubEdge():通过重构的边。
  8. resubLoss():通过重构的损失函数。
  9. resubMargin():通过重构的裕度。
  10. resubPredict():通过重构的预测值。重构就是修改模型参数以后的模型。

构建和使用KNN分类器

% 这里没有数据源,因此假设X为训练数据,Y为训练数据对应的标签。
Mdl = Mdl = fitcknn(X,Y,'NumNeighbors',4); % 设置分类器邻近数为4
% 到这一步就已经把分类器模型建好了。这还得归功于MATLAB强大的库函数

% 假设Z是一个新的数据
Zclass = predict(Mdl,Z); %预测Z的类别

%自动优化超参数
Mdl = fitcknn(X,Y,'OptimizeHyperparameters','auto',...
    'HyperparameterOptimizationOptions',...
    struct('AcquisitionFunctionName','expected-improvement-plus')) 
    
%计算交叉验证损失,可以作为模型的指标,越小模型越好。
CVMdl = crossval(Mdl);
kloss = kfoldLoss(CVMdl)

猜你喜欢

转载自blog.csdn.net/qq7835144/article/details/84985680
今日推荐