K最临近(K-Nearest Neighbors,KNN)方法是一种简单且直观的分类和回归算法,主要用于分类任务。其基本原理是用到表决的方法,找到距离其最近的K个样本,然后通过K个样本的标签进行表决,预测结果给出的标签是表决多的一方。

在使用K最临近方法的时候,有两个方面可调:

一是K值的大小,K一般选用单数,这样不会导致在进行表决时出现概率相等的情况。

二是样本之间的距离,由于样本特征的分布不同,因此在描述两样本之间的距离时有多种方式可以描述,例如:欧氏距离(Euclidean Distance)、曼哈顿距离(Manhattan Distance)和闵可夫斯基距离(Minkowski Distance)等。而且往往由于选择的距离不同,对应的K值也不一样,大家可以根据自己的数据特点尝试用不用的距离构建分类模型。本文提供了这些方法供大家选择。

在matlab中实现K最临近方法构建分类模型的代码如下:

labels = res(:, 1);  % 第一列是标签
features = res(:, 2:end); % 后面的列是特征
features = zscore(features); %归一化处理 % %% 欧式距离
%
%
% % 设置 K 值
% K = 7;
%
% % 初始化分类准确度
% accuracy = 0;
%
% % 留一交叉验证
% for i = 1:size(features, 1)
% % 从样本中选择一个作为验证样本,其余作为训练样本
% validation_sample = features(i, :);
% validation_label = labels(i);
%
% train_samples = features([1:i-1, i+1:end], :);
% train_labels = labels([1:i-1, i+1:end]);
%
% % 计算验证样本与训练样本的距离
% distances = sqrt(sum((train_samples - validation_sample).^2, 2));
%
% % 寻找最近的 K 个邻居
% [~, idx] = mink(distances, K);
%
% % 投票确定验证样本的类别
% predicted_label = mode(train_labels(idx));
%
% % 检查预测结果是否正确
% if predicted_label == validation_label
% accuracy = accuracy + 1;
% end
% end
%
% % 计算分类准确度
% accuracy = accuracy / size(features, 1);
% disp(['分类准确度:', num2str(accuracy)]); %
%
% % 曼哈顿距离
%
%
% % 设置 K 值
% K = 9;
%
% % 初始化分类准确度
% accuracy = 0;
%
% % 留一交叉验证
% for i = 1:size(features, 1)
% % 从样本中选择一个作为验证样本,其余作为训练样本
% validation_sample = features(i, :);
% validation_label = labels(i);
%
% train_samples = features([1:i-1, i+1:end], :);
% train_labels = labels([1:i-1, i+1:end]);
%
% % 计算曼哈顿距离
% distances = sum(abs(train_samples - validation_sample), 2);
%
% % 寻找最近的 K 个邻居
% [~, idx] = mink(distances, K);
%
% % 投票确定验证样本的类别
% predicted_label = mode(train_labels(idx));
%
% % 检查预测结果是否正确
% if predicted_label == validation_label
% accuracy = accuracy + 1;
% end
% end
%
% % 计算分类准确度
% accuracy = accuracy / size(features, 1);
% disp(['分类准确度:', num2str(accuracy)]); % %% 闵可夫斯基距离
%
% % 设置 K 值
% K = 5;
%
% % 初始化分类准确度
% accuracy = 0;
%
% % 留一交叉验证
% for i = 1:size(features, 1)
% % 从样本中选择一个作为验证样本,其余作为训练样本
% validation_sample = features(i, :);
% validation_label = labels(i);
%
% train_samples = features([1:i-1, i+1:end], :);
% train_labels = labels([1:i-1, i+1:end]);
%
% % 计算闵可夫斯基距离
% distances = pdist2(train_samples, validation_sample, 'minkowski', 1); % p=1, 曼哈顿距离
%
% % 寻找最近的 K 个邻居
% [~, idx] = mink(distances, K);
%
% % 投票确定验证样本的类别
% predicted_label = mode(train_labels(idx));
%
% % 检查预测结果是否正确
% if predicted_label == validation_label
% accuracy = accuracy + 1;
% end
% end
%
% % 计算分类准确度
% accuracy = accuracy / size(features, 1);
% disp(['分类准确度:', num2str(accuracy)]);
% %% KD树搜索方法 % 设置 K 值
K = 5; % 初始化分类准确度
accuracy = 0;
predictedScores=zeros(56,2); % 留一交叉验证
for i = 1:size(features, 1)
% 从样本中选择一个作为验证样本,其余作为训练样本
validation_sample = features(i, :);
validation_label = labels(i); train_samples = features([1:i-1, i+1:end], :);
train_labels = labels([1:i-1, i+1:end]); % 创建KD树
mdl = fitcknn(train_samples, train_labels, 'NumNeighbors', K, 'Distance', 'euclidean', 'NSMethod', 'kdtree'); % 预测验证样本的类别
%predicted_label = predict(mdl, validation_sample); [predicted_label,predictedScore] = predict(mdl, validation_sample);
predictedScores(i,:)=predictedScore; % 检查预测结果是否正确
if predicted_label == validation_label
accuracy = accuracy + 1;
end
end % 计算分类准确度
accuracy = accuracy / size(features, 1);
disp(['分类准确度:', num2str(accuracy)]);

机器学习(三)——K最临近方法构建分类模型(matlab)的更多相关文章

  1. Spark学习笔记——构建分类模型

    Spark中常见的三种分类模型:线性模型.决策树和朴素贝叶斯模型. 线性模型,简单而且相对容易扩展到非常大的数据集:线性模型又可以分成:1.逻辑回归:2.线性支持向量机 决策树是一个强大的非线性技术, ...

  2. Caffe、TensorFlow、MXnet三个开源库对比+主流分类模型对比

    库名称 开发语言 支持接口 安装难度(ubuntu) 文档风格 示例 支持模型 上手难易 Caffe c++/cuda c++/python/matlab *** * *** CNN ** MXNet ...

  3. Spark2.0机器学习系列之8:多类分类问题(方法归总和分类结果评估)

    一对多(One-vs-Rest classifier) 将只能用于二分问题的分类(如Logistic回归.SVM)方法扩展到多类. 参考:http://www.cnblogs.com/CheeseZH ...

  4. 【Todo】【转载】Spark学习 & 机器学习(实战部分)-监督学习、分类与回归

    理论原理部分可以看这一篇:http://www.cnblogs.com/charlesblc/p/6109551.html 这里是实战部分.参考了 http://www.cnblogs.com/shi ...

  5. kNN算法:K最近邻(kNN,k-NearestNeighbor)分类算法

    一.KNN算法概述 邻近算法,或者说K最近邻(kNN,k-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一.所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它 ...

  6. 机器学习算法(九): 基于线性判别模型的LDA手写数字分类识别

    1.机器学习算法(九): 基于线性判别模型的LDA手写数字分类识别 1.1 LDA算法简介和应用 线性判别模型(LDA)在模式识别领域(比如人脸识别等图形图像识别领域)中有非常广泛的应用.LDA是一种 ...

  7. weka实际操作--构建分类、回归模型

    weka提供了几种处理数据的方式,其中分类和回归是平时用到最多的,也是非常容易理解的,分类就是在已有的数据基础上学习出一个分类函数或者构造出一个分类模型.这个函数或模型能够把数据集中地映射到某个给定的 ...

  8. 深度学习原理与框架-卷积神经网络-cifar10分类(图片分类代码) 1.数据读入 2.模型构建 3.模型参数训练

    卷积神经网络:下面要说的这个网络,由下面三层所组成 卷积网络:卷积层 + 激活层relu+ 池化层max_pool组成 神经网络:线性变化 + 激活层relu 神经网络: 线性变化(获得得分值) 代码 ...

  9. 机器学习入门-文本特征-使用LDA主题模型构造标签 1.LatentDirichletAllocation(LDA用于构建主题模型) 2.LDA.components(输出各个词向量的权重值)

    函数说明 1.LDA(n_topics, max_iters, random_state)  用于构建LDA主题模型,将文本分成不同的主题 参数说明:n_topics 表示分为多少个主题, max_i ...

  10. 【原】Coursera—Andrew Ng机器学习—编程作业 Programming Exercise 3—多分类逻辑回归和神经网络

    作业说明 Exercise 3,Week 4,使用Octave实现图片中手写数字 0-9 的识别,采用两种方式(1)多分类逻辑回归(2)多分类神经网络.对比结果. (1)多分类逻辑回归:实现 lrCo ...

随机推荐

  1. Angular cli 组件和服务的创建, 父传子,子传父,服务的简单使用

    1:Angular cli 创建组件component ng g component components\right ng g c wave 简写 需要定位到根路径下即可创建组件 Could not ...

  2. python 简明笔记

    python 简明笔记 基础内置类型 数值类型 字面量 3.14e-10 3.14E-10 3.14e+10 #八进制 0o123 #十六进制 0xabf #二进制 0b10101 #进制转换函数 # ...

  3. Canvas简历编辑器-我的剪贴板里究竟有什么数据

    Canvas图形编辑器-我的剪贴板里究竟有什么数据 在这里我们先来聊聊我们究竟应该如何操作剪贴板,也就是我们在浏览器的复制粘贴事件,并且在此基础上聊聊我们在Canvas图形编辑器中应该如何控制焦点以及 ...

  4. Android Studio自强迫升级到4.2版本后调试Native项目时总是卡死问题

    原文地址:https://www.zhaimaojun.top/Note/5464968 就在昨天,也就是2021年5月6号,Android Studio强迫用户升级到4.2版本, 原因就是jcent ...

  5. 02. x86处理器运行方式

    [CPU指令] CPU控制器通过读取存储器中的指令确定要执行的功能,CPU运行需要不停的读取指令,计算机启动后CPU会从固定地址处开始读取指令,首先读取 NOR Flash 存储器中的固件,固件执行完 ...

  6. three.js教程7-PBR材质与环境贴图CubeTextureLoader

    1.PBR材质 PBR是基于物理的渲染(physically-based rendering).模拟物体表面的反射算法. Three.js提供了两个PBR材质相关的类MeshStandardMater ...

  7. Splashtop用于远程实验室的功能得到增强

    ​ 加利福尼亚州圣何塞,2020年8月11日,远程访问和远程支持解决方案的领导者Splashtop Inc. 宣布更新其 Splashtop for Remote Labs 产品.该产品旨在帮助学生通 ...

  8. js 数组按指定字段转map-list结构

    js 数组按指定字段转map-list结构 背景介绍 在开发过程中经常会出现接口返回整个数组,我们需要将数组进行二次处理,如下格式按照不同功能模块(type)进行数据拆分 原始数据 const lis ...

  9. CH57x/CH58x/CH59x获取从机广播信息

    有时需要通过主机设备(MCU非手机)获取从设备的广播信息例如广播包,MAC地址,扫描应答包等 以下的程序片段及功能实现是在WCH的CH59X的observer例程上实现的: 1.获取广播包 所有的函数 ...

  10. webpack配置css预处理

    webpack默认只支持js的打包,不支持其它类型,为了让它支持样式的打包就需要加载一些loader 打包css文件 在webpack中配置对应的loader 在入口js文件中通过import导入样式 ...