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

2023-11-04

基于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’ ‘inverse’ ‘squaredinverse’,分别表示无权重、与距离的一次方成反比、与距离的二次方成反比。
  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^=argminy=1,2,...,Kk=1KP^(kx)C(yk)
    其中 y ^ \hat{y} y^表示被预测的类别; K K K表示类别的数量; P ^ ( k ∣ x ) \hat{P}(k|x) P^(kx)表示在已知观察值 x x x已知的条件下其为第 k k k类的后验概率; C ( y ∣ K ) C(y|K) C(yK)表示把第 k k k类误判成第 y 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)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于MATLAB R2018a库函数构建KNN分类器 的相关文章

  • 如何在matlab中显示图像上的点?

    我有一些像素点 比如 p1 1 1 和 p2 1 10 等等 我想以任何颜色在图像上显示这些点 这个怎么做 MATLAB plot http www mathworks com help techdoc ref plot html文档非常全
  • 如何从 Matlab 在 vi​​rtualenv 中执行 Python 代码

    我正在创建一个用于研究的 Matlab 工具箱 我需要执行 Matlab 代码 但也需要执行 Python 代码 我想允许用户从 Matlab 执行 Python 代码 问题是 如果我立即执行此操作 我将必须在 Python 环境中安装所有
  • 在Matlab中使用中心切片定理实现滤波反投影算法

    我正在研究一种使用中心切片定理的滤波反投影算法作为家庭作业 虽然我理解纸上的理论 但在 Matlab 中实现它时遇到了问题 我得到了一个可以遵循的框架 但我认为我可能误解了一个步骤 这是我所拥有的 function img sampleFB
  • 优化数组压缩

    假设我有一个数组k 1 2 0 0 5 4 0 我可以按如下方式计算掩码m k gt 0 1 1 0 0 1 1 0 仅使用掩码 m 和以下操作 左移 右移 And Or 加 减 乘 我可以将 k 压缩为以下形式 1 2 5 4 以下是我目
  • 如何打开 matlab p 代码文件

    有谁知道如何查看 matlab p 代码文件的代码 p 代码文件专门存在 以便您可以共享代码 以便其他人无法查看它 换句话说 您看不到 Matlab p 代码文件的代码
  • MATLAB:生成给定三种颜色的颜色图

    我正在尝试在 MATLAB 中生成给定三种颜色 最高值 零值和最低值 的颜色图 我的思维过程是从最高端到中间循环 并将每个步骤存储到一个 3xN 第一列是 R 第二列是 G 第三列是 B 矩阵 所以我正在使用 fade from high
  • 在matlab中设置图例符号的精度

    我有这个 leg2 strcat Max Degree num2str adet 1 1 ch l leg3 strcat Min Degree num2str adet 1 2 ch l leg4 strcat Max Request n
  • 增加 .fig 文件中的散点标记大小

    我有一个图形文件 scatter fig 该图有许多使用 scatter 的散点绘图仪 现在我只有这个无花果文件 我需要增加所有散点的标记大小 手动尝试过 但非常困难 有没有办法我可以做类似的事情 H 图形句柄 s 点 h 设置 s 标记大
  • 使用 varargin (...) 时如何显示不同的函数用法?

    当您输入 Matlab 函数名称并打开大括号时 例如sum 在命令窗口中 将打开一个工具提示 显示此函数的所有可能用法 当我编写自己的接受函数时varargin 工具提示仅显示一个选项 而不是varargin puts e g myfunc
  • MATLAB 是否已有 YAML 库/解析器?

    我想使用 YAML 跨多种语言交流一些数据 将其视为 与语言无关的序列化 其中一种语言是 MATLAB 但我似乎找不到该语言的 YAML 库 我在 Google 上检查了 matlab yaml 和 matlab yaml parse 似乎
  • Matlab 的快速 JSON 解析器

    您知道 Matlab 中有一个非常快速的 JSON 解析器吗 目前我正在使用JSONlab http www mathworks com matlabcentral fileexchange 33381 jsonlab a toolbox
  • 在 Matlab 中对列进行排序

    我有 2 列使用 textscan 导入的数据 数据看起来像这样 其中U is undetect and D is detect mydata 51 U 57 D 48 U 47 D my data 4x1 double 4x1 char
  • 如何建立数据流挖掘的滑动窗口模型?

    我们遇到的情况是 流 来自传感器的数据或服务器上的点击流数据 采用滑动窗口算法 我们必须将最后 例如 500 个数据样本存储在内存中 然后 这些样本用于创建直方图 聚合并捕获有关输入数据流中异常的信息 请告诉我如何制作这样的滑动窗 如果您询
  • 查找数组中元素之间的平均差异的有效方法

    希望标题不会让人困惑 通过例子来展示很简单 我有一个像这样的行向量 1 5 6 我想找到每个元素之间的平均差异 此示例中的差异为 4 和 1 因此平均值为 2 5 这是一个小例子 我的行向量可能非常大 我是 MatLab 新手 那么有没有一
  • Matlab 编辑器不使用 emacs 快捷方式

    Is there some way I can make the matlab integrated editor not use emacs shortcut but use more normal shortcuts such that
  • 如何获取活动对象 MATLAB GUI 的句柄

    我正在尝试使用 MATLAB GUI 创建日历 我有两个Edit Text对象 edittext1 and edittext2 我想做这个 我把光标放在edittext1然后在日历中选择日期 它会进入文本字段edittext1 同样对于ed
  • 这是 `min` 和 `nanmin` 之间的区别; Matlab 中的“max”和“nanmax”?

    Matlab描述nanmin and nanmax像这样 NANMIN最小值 忽略NaNs NANMAX最大值 忽略NaNs 但实际上 min and max ignore NaNs too 那我应该使用哪个 根据我的测试 nanmin a
  • 在 MATLAB 中用两个值替换向量值

    我必须创建一个以向量作为输入的函数v和三个标量a b and c 该函数替换了的每个元素v等于a有一个二元素数组 b c 例如 给定v 1 2 3 4 and a 2 b 5 c 5 输出将是 out 1 5 5 3 4 我的第一次尝试是尝
  • 在 Matlab 中快速加载大块二进制文件

    我有一些相当大的 int16 格式的数据文件 256 个通道 大约 75 1 亿个样本 每个文件约 40 50 GB 左右 它以平面二进制格式编写 因此结构类似于 CH1S1 CH2S1 CH3S1 CH256S1 CH1S2 CH2S2
  • 整数的十进制表示形式中的分隔数字

    例如 我想将用户输入作为整数输入 45697 并将前两位数字存储在数组 向量或其他内容中 例如 4 5 6 9 7 这样我就可以使用一些函数调用来检查前两个值 4 5 并对它们进行计算 问题 我不知道如何存储恢复前两个值 有没有简单的函数调

随机推荐

  • Linux系统安装Java

    1 下载JDK 下载网址 https www oracle com technetwork java javase downloads index html 下拉 找到jdk8 使用Xshell远程连接虚拟机 2 先新建一个文件夹 目录是
  • oracle 分区表插入数据_Oracle数据库分区表整理笔记

    关键词 partition 分区subpartition 辅助分区已经存在的表没有方法可以直接转化为分区表 分区索引 一 分区表类型 1 范围分区 1 1 按指定要求划分 假设有一个CUSTOMER表 表中有数据200000行 我们将此表通
  • JS reduce 用法

    定义 reduce 方法接收一个函数作为累加器 数组中的每个值 从左到右 开始缩减 最终计算为一个值 语法 array reduce function total currentValue currentIndex arr initialV
  • HEVC对场编码的支持

    HEVC值得注意的是它没有提供专用于隔行视频的工具 而是将隔行视频的一帧看作两个独立的场 对各个场数据分别进行编码 简化了编码器的实现 这也是因为随着数字视频技术的快速发展 视频的隔行扫描方式日渐式微 https blog csdn net
  • vue+element-ui实现表格里嵌套表格

    效果图 点击某行数据展开另一个嵌套在里面的table 核心代码 从后台请求的数据格式 代码实现
  • table 表格合并

    table 表格合并 开发工具与关键技术 DW JavaScript 作者 刘东标 撰写时间 2019 03 14 div div span colspan和rowspan这两个属性用于创建特殊的表格 span span colspan用来
  • JAVA查搜索文件内容

    上周突然遇到了个要查找历史sql的中是否包含某个字段的问题 Everting虽然可以查找某个后缀的文件 可是并不能搜索文件内容 所以就花费一点功夫自己写一个了 使用起来还是非常方便 1 单文件查找内容 2 单文件夹下读取所有文件 并查找内容
  • 【时间序列预测算法】——ARIMA 算法介绍及代码实现

    基本概念 一阶差分 时间序列在t 与t 1 时刻函数值的差值 提升时序数据的平稳性 ARIMA算法对数据平稳性有要求 二阶差分 在一阶差分的基础上再做一次 一般时序数据最多做两阶 再多则预测意义不大 自回归模型 f t
  • Google Protocol Buffer持久化框架分析

    一 三大主流开源持久化框架介绍 1 1 Google Protocol Buffer protocol buffer是google 的一种数据交换的格式 它独立于语言 独立于平台 google 提供了三种语言的实现 java c 和 pyt
  • The type or namespace name ‘MenuItemAttribute‘ could not be found类似报错处理方法

    类似报错主要是使用了UnityEditor相关的API 解决方法的话 只要将相关脚本放进Asset下的Editor文件夹之中即可 并不涉及其他的逻辑 只与UnityEditor相关 否则在打包的时候还可能会发生类似的报错
  • KEIL编译报错 Error: L6220E: Load region LR_IROM1 size (65552 bytes) exceeds limit (65536 bytes)……

    问题描述 STM32F103CBT6 KEIL编译报错 Error L6220E Load region LR IROM1 size 65552 bytes exceeds limit 65536 bytes Region contains
  • 7107小时时,加入创业公司(没有股份,当作经验吧)

    只是第一个项目是web项目 与vr无关 所以此项目耗费时间不计入1万小时之内 也不算是第五个项目 不过也算是里程碑 至少2017年有稳定项目来源了吧 主要也是学经验 以后如果开自己的公司的话 能有所借鉴 还是要努力的 才能多接触各方面 主要
  • windows 10 vs2017 x264的编译和使用测试

    做了一次更新 工具改成vs2019了 x264这个sdk非常棒 主页 x264 the best H 264 AVC encoder VideoLANhttps www videolan org developers x264 html 在
  • 01. Web漏洞靶场的搭建

    01 Web漏洞靶场的搭建 Web漏洞靶场的搭建 上 什么是Web安全 什么是Web Web是互联网的总称 全称为World Wide Web 缩写WWW 即全球广域网 也称为万维网 它是一种基于超文本和HTTP的 全球性的 动态交互的 跨
  • Vue3正式发布那么久了,你认识Pinia了吗?

    个人简介 个人主页 前端杂货铺 学习方向 主攻前端方向 正逐渐往全干发展 个人状态 研发工程师 现效力于中国工业软件事业 人生格言 积跬步至千里 积小流成江海 推荐学习 前端面试宝典 Vue2 Vue3 Vue2 3项目实战 Node js
  • StringBoot+Mybatis的增删改查(四)

    整体项目链接地址 StringBoot Mybatis的增删改查 一 StringBoot Mybatis的增删改查 二 StringBoot Mybatis的增删改查 三 StringBoot Mybatis的增删改查 四 StringB
  • vue练习,写游戏

  • 【异常问题】nvcc fatal : Unsupported gpu architecture ‘compute_86‘ 解决方案

    目录 异常问题 nvcc fatal Unsupported gpu architecture compute 86 解决方案 1 报错信息 2 系统环境 3 原因分析 4 解决方案 异常问题 nvcc fatal Unsupported
  • Verilog基础语法(一)

    一 数据类型 在Verilog语言中主要有三大数据类型 寄存器数据类型 线网数据类型 参数数据类型 1 寄存器数据类型 关键字 reg reg类型数据默认初始值为不定值X 需要注意的是reg类型的数据只能在always语句和initial语
  • 基于MATLAB R2018a库函数构建KNN分类器

    基于MATLAB R2018a库函数构建KNN分类器 基于MATLAB R2018a库函数构建KNN分类器 从一个库函数fitcknn 谈起 构造函数 类的属性 Properties 方法成员 Methods 构建和使用KNN分类器 基于M