目录

1. 基本定义

2. 算法原理

2.1 算法优缺点

2.2 算法参数

2.3 变种

3.算法中的距离公式

4.案例实现

4.1 读取数据

4.2 分离训练集和测试集

4.3 归一化处理

4.4 计算欧氏距离

4.5 排序和输出测试结果

4.6 计算准确率

总代码


1. 基本定义

k最近邻(k-Nearest Ne ighbor)算法是比较简单的机器学习算法。它采用测量不同特征值之间的距离方法进行分类。它的思想很简单:如果一个样本在特征空间中的多个最近邻(最相似〉的样本中的大多数都属于某一个类别,则该样本也属于这个类别。第一个字母k可以小写,表示外部定义的近邻数量。

简而言之,就是让机器自己按照每一个点的距离,距离近的为一类。

2. 算法原理

knn算法的核心思想是未标记样本的类别,由距离其最近的k个邻居投票来决定。
        具体的,假设我们有一个已标记好的数据集。此时有一个未标记的数据样本,我们的任务是预测出这个数据样本所属的类别。knn的原理是,计算待标记样本和数据集中每个样本的距离,取距离最近的k个样本。待标记的样本所属类别就由这k个距离最近的样本投票产生。
假设X_test为待标记的样本,X_train为已标记的数据集,算法原理的伪代码如下:

  1. 遍历X_train中的所有样本,计算每个样本与X_test的距离,并把距离保存在Distance数组中。
  2. 对Distance数组进行排序,取距离最近的k个点,记为X_knn。
  3. 在X_knn中统计每个类别的个数,即class0在X_knn中有几个样本,class1在X_knn中有几个样本等。
  4. 待标记样本的类别,就是在X_knn中样本个数最多的那个类别。

2.1 算法优缺点

2.2 算法参数

其算法参数是k,参数选择需要根据数据来决定。

2.3 变种

knn算法有一些变种,其中之一是可以增加邻居的权重。默认情况下,在计算距离时,都是使用相同权重。实际上,可以针对不同的邻居指定不同的距离权重,如距离越近权重越高。这个可以通过指定算法的weights参数来实现。
        另一个变种是,使用一定半径内的点取代距离最近的k个点。当数据采样不均匀时,可以有更好的性能。在scikit-learn里,RadiusNeighborsClassifier类实现了这个算法变种。

3.算法中的距离公式

与我们的线性回归不同,在这里我们并没有什么公式可以进行推导。KNN分类算法的核心就在于计算距离,随后按照距离分类。

在二维笛卡尔坐标系,相信初中同学应该对这个应该不陌生,他有一个更加常见的名字,直角坐标系。其中,计算两个点之间的距离公式,常用的有欧氏距离。点A(2,3),点B(5,6),那么AB的距离为

这,便是欧氏距离。但和我们平常经常遇到的还是有一些区别的,欧氏距离是可以计算多维数据的,也就是矩阵(Matrix)。这可以帮我们解决很多问题,那么公式也就变成了

4.案例实现

我们使用knn算法及其变种,对Pina印第安人的糖尿病进行预测。数据集可从下面下载。
链接:蓝奏云

4.1 读取数据

%读取数据
data=xlsread('D:\桌面\knn.xlsx');

4.2 分离训练集和测试集

ratio=0.1;%测试数据所占比例
[N,M]=size(data);
trainData=data(:,1:8);
trainClass=data(:,9);
num_test=N*ratio;

4.3 归一化处理

%归一化处理newData=(oldData-minValue)/(maxValue-minValue);
minValue=min(trainData);
maxValue=max(trainData);
trainData=(trainData-repmat(minValue,N,1))./(repmat(maxValue-minValue,N,1));

4.4 计算欧氏距离

%计算训练数据集与测试数据之间的欧氏距离dist
dist=zeros(N,1);
for i=1:Ndist(i,:)=norm(trainData(i,:)-testData);
end

4.5 排序和输出测试结果

%将dist从小到大进行排序
[Y,I]=sort(dist,1);
K=min(K,length(Y));
%将训练数据对应的类别与训练数据排序结果对应
labels=trainClass(I);
%确定前K个点所在类别的出现频率
idx=mode(labels(1:K));%mode函数求众数
fprintf('该测试数据属于类 %d  ',idx);

4.6 计算准确率

error=0;
for i=1:num_testidx=KNN(trainData(num_test+1:N,:),trainClass(num_test+1:N,:),trainData(i,:),K);fprintf('该测试数据的真实类为:%d\n',trainClass(i,:));if idx~=trainClass(i,:);error=error+1;end
end
fprintf('准确率为:%f\n',1-error/num_test);

总代码

clc;clear;
% 警告消息消除
warning('off');
%读取数据
data=xlsread('D:\桌面\knn.xlsx');
ratio=0.1;%测试数据所占比例
[N,M]=size(data);
K=4;
trainData=data(:,1:8);
trainClass=data(:,9);
num_test=N*ratio;
%归一化处理newData=(oldData-minValue)/(maxValue-minValue);
minValue=min(trainData);
maxValue=max(trainData);
trainData=(trainData-repmat(minValue,N,1))./(repmat(maxValue-minValue,N,1));
error=0;
for i=1:num_testidx=KNN(trainData(num_test+1:N,:),trainClass(num_test+1:N,:),trainData(i,:),K);fprintf('该测试数据的真实类为:%d\n',trainClass(i,:));if idx~=trainClass(i,:);error=error+1;end
end
fprintf('准确率为:%f\n',1-error/num_test);

返回:

其中 KNN 函数:

function [ idx ] = KNN( trainData,trainClass,testData,K )
%UNTITLED Summary of this function goes here
%   Detailed explanation goes here[N,M]=size(trainData);
%计算训练数据集与测试数据之间的欧氏距离dist
dist=zeros(N,1);
for i=1:Ndist(i,:)=norm(trainData(i,:)-testData);
end
%将dist从小到大进行排序
[Y,I]=sort(dist,1);
K=min(K,length(Y));
%将训练数据对应的类别与训练数据排序结果对应
labels=trainClass(I);
%{
%确定前K个点所在类别的出现频率
classNum=length(unique(trainClass));%取集合中的单值元素的个数
labels=zeros(1,classNum);
for i=1:Kj=trainClass(i);labels(j)=labels(j)+1;
end
%返回前K个点中出现频率最高的类别作为测试数据的预测分类
[~,idx]=max(labels);
%}
%确定前K个点所在类别的出现频率
idx=mode(labels(1:K));%mode函数求众数
fprintf('该测试数据属于类 %d  ',idx);
end

knn(k近邻算法)——matlab相关推荐

  1. knn K近邻算法python实现

    本文主要内容: knn K近邻算法原理 sklearn knn的使用,以及cross validation交叉验证 numpy 实现knn knn改进方法 1 knn K近邻算法原理 K近邻算法:给定 ...

  2. k近邻算法matlab实现_k近邻算法

    k 近邻法 (k-NN) 是一种基于实例的学习方法,无法转化为对参数空间的搜索问题(参数最优化 问题).它的特点是对特征空间进行搜索.除了k近邻法,本章还对以下几个问题进行较深入的讨 论: 切比雪夫距 ...

  3. 【20210922】【机器/深度学习】KNN (K近邻) 算法详解

    一.算法概念 KNN, K-near neighbor,即最近邻算法.它是一种分类算法,算法思想是:一个样本与数据集中的 k 个样本最相似,如果这 k 个样本中的大多数属于某一个类别,则该样本也属于这 ...

  4. KNN K近邻算法学习

    KNN算法.k-nearest neighbor,或者K-近邻算法是一种经典的机器学习算法,可以完成分类和回归任务. KNN算法主要思想: 对于输入的特征X,选取与他记录最近的K个点,统计这K个点所属 ...

  5. K近邻算法KNN的简述

    什么是KNN K近邻算法又称KNN,全称是K-Nearest Neighbors算法,它是数据挖掘和机器学习中常用的学习算法,也是机器学习中最简单的分类算法之一.KNN的使用范围很广泛,在样本量足够大 ...

  6. 01 K近邻算法 KNN

    01 K近邻算法 KNN k近邻算法基础 等价于 scikit-learn中的机器学习算法封装 训练数据集,测试数据集 分类准确度 超参数 考虑距离权重 更多关于距离的定义 搜索明可夫斯基距离相应的p ...

  7. 【模式识别】实验二:K近邻算法(KNN)

    KNN是模式识别中的经典算法,本次实验就MNIST数据集来做KNN算法的实验,并结合前一次的LDA降维对数据进行进一步处理. 实验报告图片版 pdf版本可以戳这:模式识别实验报告:KNN K近邻算法 ...

  8. 机器学习7/100天-K近邻算法

    Day7 K近邻算法 github: 100DaysOfMLCode What is K-NN k近邻算法是常用的简单分类算法也可用于回归问题. KNN是一个无参的(不需要对数据分布做任何假设).基于 ...

  9. 数据处理 | MATLAB实现KNN(K近邻)缺失数据填补

    数据处理 | MATLAB实现KNN(K近邻)缺失数据填补 目录 数据处理 | MATLAB实现KNN(K近邻)缺失数据填补 基本介绍 插补描述 程序设计 参考资料 基本介绍 用于缺失值插补的单变量方 ...

最新文章

  1. C#操作XML总结1
  2. python入门题目及答案_Python基础自测题答案和基础知识梳理
  3. 面向对象3(final、static、instanceof、向上/向下转型、初始化次序)
  4. 通过自定义资源扩展Kubernetes
  5. Java读写大文本文件(2GB以上)
  6. @javax.inject.Inject,新的注入依赖规范
  7. windows route netstat arp命令
  8. yum安装软件出现的提示
  9. PAT L1-027 出租
  10. 理解 CMOS IMAGE Sensor
  11. 拼多多发单软件使用教程永久免费
  12. kdj买卖指标公式源码_买卖点KDJ (副图指标 源码 )
  13. AI只调整填充色的透明度
  14. vue使用prevent修饰符阻止标签的默认行为
  15. Python 唤起QQ对话框 QQ客服效果
  16. Pytorch搭建ResNet网络进行垃圾分类
  17. 锂电池】关于4.2V锂电池充电IC的一些记录
  18. python复利计算_python复利代码
  19. Sqoop将MySQL数据导入到HDFS和Hive中
  20. python实现剪刀石头布小游戏

热门文章

  1. 什么是数据库驱动?有哪几种jdbc驱动
  2. 互联网协议 — TCP/IP 分层体系结构
  3. AD09 DXP保姆级教程系列——001、汉化与新建工程
  4. 蛋糕商城项目完整源码
  5. Xshell安装使用教程
  6. 值得分享的一个团队培训小游戏
  7. [状压dp] 蒙德里安的梦想(模板题+状压dp)
  8. QT 调用Bartender C#动态库接口
  9. c++实现顺序表的基本操作
  10. 蓝松短视频SDK基本免费功能列表