matlab机器学习之knn算法实例

KNN(K-Nearest Neighbor)算法即K最邻近算法,是实现分类器中比较简单易懂的一种分类算法。
本片不讲算法原理,仅说明一下 matlab中使用该算法用的函数
详细参考:matlab官方文档

  1. 构造简单模型
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指定一个公式

  1. 使用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的值
在这里插入图片描述

  1. 默认交叉验证
    使用默认的10倍交叉验证对KNN分类器进行交叉验证。
    检查分类错误。
CVKNNMdl = crossval(Mdl);
classError = kfoldLoss(CVKNNMdl)
  1. 优化拟合的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'

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值