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. kettle使用3-增量同步(插入的时候判断数据是否存在,存在就更新,不存在就插入)

    1.新建转换 2.在DB连接中,新建2个数据库连接 3.在输入中,新建:表输入 4.在输入中,新建:表输入 5.在输出中,新建:插入/更新 说明:更新字段: 是说更新目的表时候,哪些列更新,哪些不更新 ...

  2. 使用IIS部署WebDAV

    服务器开启WebDAV 在服务器安装IIS的同时 要启用Windows身份验证与WebDAV发布 如果不是服务器版本,参照下图 在IIS中新建WebDAV网站 配置好本地目录与端口 启用Windows ...

  3. Redis 的安装与配置详解【Redis系列一】

    〇.前言 关于 Redis 在日常开发中还是用的比较多的,特别是在秒杀.消息队列.排行榜等数据交互时效要求较高的场景,Redis 都可以轻松应对. 本文将针对 Redis 进行简单介绍,以及如何安装, ...

  4. sass 混合指令 (Mixin Directives)详解

    ​ 混合指令(Mixin)用于定义可重复使用的样式,避免了使用无语意的 class,比如 .float-left.混合指令可以包含所有的 CSS 规则,绝大部分 Sass 规则,甚至通过参数功能引入变 ...

  5. linux wget命令的重要用法:下载文件并保存,后台下载

    Linux wget命令是一个下载文件的工具,它用在命令行下. #从网络下载一个文件并保存在当前目录 [root@node5 ~]# wget http://cn.wordpress.org/word ...

  6. C#简易商城收银系统v1.1简单工厂实现(2-2)

    C#简易商城收银系统v1.1简单工厂实现(2-2) 当初: C#简易商城收银系统v1.0 现在: 用之前的工厂模式对商城收银系统v1.0进行升级 可以参考之前的 C#简易商城收银系统v1.0 随笔  ...

  7. aardio桌面软件开发 简单,打包后文件小,支持 .net python 和 众多插件

    aardio 编程语言 - 官网 aardio  专注于桌面软件开发,17年一直保持非常活跃地更新( 更新日志 ),aardio 被多年用于生产项目实践,久经测试和锤炼.aardio 在诞生之初就设计 ...

  8. ansible list错误

    [root@localhost ansible]# ansible all -list [WARNING]: * Failed to parse /etc/ansible/1.txt with ini ...

  9. pandas基础--层次化索引

    pandas含有是数据分析工作变得更快更简单的高级数据结构和操作工具,是基于numpy构建的. 本章节的代码引入pandas约定为:import pandas as pd,另外import numpy ...

  10. C语言常用数学函数

    目录 C语言常用数学函数(头文件#include "math.h") abs()函数 labs()函数 fabs()函数 floor()函数 floorf() floorl() c ...