KNN(K-Nearest Neighbor)算法即K最邻近算法,是实现分类器中比较简单易懂的一种分类算法。
本片不讲算法原理,仅说明一下 matlab中使用该算法用的函数
详细参考:matlab官方文档
- 构造简单模型
Mdl = fitcknn(X,Y)
返回分类器模型对象,输入参数:X是训练数据,Y是标签。
mdl = fitcknn(Tbl,ResponseVarName)
Tb1是一个table类型的数据,Tbl的每一行对应一个观察值,每一列对应一个预测变量。“ResponseVarName”表示Tb1的最后一列表示标签。
如果Tbl包含响应变量,并且您想将Tbl中所有剩余的变量用作预测变量,则可以使用ResponseVarName指定响应变量。
mdl = fitcknn(Tbl,Y)
如果不使用“ResponseVarName”参数,那么默认Tb1只包含训练器要用到的数据,不包含标签,因此需要使用Y,存放着每个样本观察的标签
mdl = fitcknn(Tbl,formula)
使用formula来描述标签和属性变量的关系
如果Tbl包含响应变量,并且您只想将Tbl中其余变量的子集用作预测变量,则可以使用formula指定一个公式
- 使用Minkowski指标训练k最近邻分类器
Train a 3-nearest neighbors classifier using the Minkowski metric. To use the Minkowski metric, you must use an exhaustive searcher. It is good practice to standardize noncategorical predictor data.
使用Minkowski度量训练3个最近邻居分类器。要使用Minkowski指标,必须使用穷举搜索器。优良作法是标准化非分类预测变量数据。
Mdl = fitcknn(X,Y,'NumNeighbors',3,...
'NSMethod','exhaustive','Distance','minkowski',...
'Standardize',1);
运行上述代码后—Mdl的值
- 默认交叉验证
使用默认的10倍交叉验证对KNN分类器进行交叉验证。
检查分类错误。
CVKNNMdl = crossval(Mdl);
classError = kfoldLoss(CVKNNMdl)
- 优化拟合的KNN分类器
使用fitcknn自动优化超参数
通过使用自动超参数优化,找到使交叉验证损失减少五倍的超参数。 为了获得可重现性,请设置随机种子并使用“ expected-improvement-plus”获取功能。
Mdl = fitcknn(X,Y,'OptimizeHyperparameters','auto',...
'HyperparameterOptimizationOptions',...
struct('AcquisitionFunctionName','expected-improvement-plus'))
运行后效果
找到最优的近邻数NumNeighbors和距离指标参数Distance
一个简单的预测方法:
%X是训练数据,Y是标签,Z是要预测的数据 代码里缺少具体数据
%采用自动优化参数 获得最优的近邻数NumNeighbors和距离指标参数Distance
%但运行速度较慢 获得最优参数后,可更改代码 直接赋值
%若要判断数据集的准确率 设计num计数
Mdl = fitcknn(X,Y,'OptimizeHyperparameters','auto',...
'HyperparameterOptimizationOptions',...
struct('AcquisitionFunctionName','expected-improvement-plus')) ;
Predict_labels = predict(Mdl,Z); %预测Z的类别
% 计算交叉验证损失,采用默认形式,可以作为模型的指标,越小模型越好。
CVMdl = crossval(Mdl);
kloss = kfoldLoss(CVMdl);
5. 交叉验证选项
①’CrossVal’-交叉验证标志
交叉验证标志,指定为由“ Crossval”和“ on”或“ off”组成的逗号分隔对。 如果指定“ on”,则该软件将执行10倍交叉验证。
Example: 'CrossVal','on'
②’CVPartition’—交叉验证分区
要创建交叉验证的模型,您只能使用以下四个名称/值对参数之一:CVPartition,Holdout,KFold或Leaveout。
示例:假设您使用 cvp = cvpartition(500,'KFold',5)
为500个观测值创建5倍交叉验证的随机分区。然后,您可以使用 'CVPartition',cvp
指定交叉验证的模型。
③’Holdout’-保留验证的数据部分
标量值范围(0,1)
用于保持验证的数据的分数,指定为逗号分隔的一对,由“保持”和范围在(0,1)之间的标量值组成。如果指定“ Holdout”,p,则软件将完成以下步骤:
1).随机选择并保留100%的数据作为验证数据,并使用其余数据训练模型。
2)将紧凑的,经过训练的模型存储在交叉验证模型的Trained属性中。
Example: 'Holdout',0.1
④’KFold’ — 折叠数
10(默认)|正整数值大于1
Example: 'KFold',5
⑤’Leaveout’-Leave-one-out交叉验证标志
留出交叉验证标志,指定为以逗号分隔的一对,由“ Leaveout”和“ on”或“ off”组成
作用:将观测值保留为验证数据,并使用其他n-1个观测值训练模型。将n个紧凑的,经过训练的模型存储在交叉验证模型的Trained属性中的n×1单元向量的单元格中。
Example: 'Leaveout','on'