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. AtCoder赛后反思

    先贴上本人主页 ABC347 \(\color{blue}1624\color{red}-24\color{black}=\color{blue}1600\) 蓝名保卫战,极限 1600 C 题还是有 ...

  2. 飞桨动态图PyLayer机制

    一.主要用法 如下是官方文档上的使用样例: import paddle from paddle.autograd import PyLayer # Inherit from PyLayer class ...

  3. Wordpress小技巧(一)

    ​★★★ Wordpress发表Post文章时,页面会出现评论框,如何禁止出现评论框.步骤如下: 一.使用wordpress的后台功能关闭文章评论依次进入"后台"-"设置 ...

  4. lvs之DR模式的实操演练

    理论 我是内部服务,代替我访问外部网络,这是正向代理:代替外部网络访问我,这是反向代理 槽位 sh根据源地址.调度到某个节点,dh,根据目标地址,调度到某个节点, 实战演练 默认策略以及修改策略 查看 ...

  5. GitHub SSH 快速配置

    每次更换系统或者电脑时,都需要重新配置一番 Github SSH 的验证,记性不太好,写了一个快速部署的辅助脚本,直接安装脚本提示使用即可,经测试,Linux 和 Windows 下均能使用. 脚本功 ...

  6. Vue cli路由

    上面是将Forecast组件作为了Home的子组件使用,现在我们将其作为一个路由组件使用. 在router/index.js路由系统注册路由: { path: '/forecast', name: ' ...

  7. Vue——模板语法

    Vue.js 使用了基于 HTML 的模板语法,允许开发者声明式地将 DOM 绑定至底层组件实例的数据.所有 Vue.js 的模板都是合法的 HTML,所以能被遵循规范的浏览器和 HTML 解析器解析 ...

  8. Java自增

    Java自增 本文分为以下部分: 栗子 栗子解释 来点复杂的 字节码解读 总结 栗子 java存在一种神奇的操作符,++,自增1,但是经常分不清楚 i++ 和++i 两者的区别,虽然最后结果可能都是 ...

  9. Swift 模式下面LLDB 输出对象

    (lldb) expr -l Swift -- import UIKit (lldb) expr -l Swift -- let $pin = unsafeBitCast(0x7f81c8d459f0 ...

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

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