knn(k近邻算法)——matlab

目录

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,参数选择需要根据数据来决定。

  • k值越大,模型的偏差越大,对噪声数据越不敏感,当k值很大时,可能造成欠拟合;
  • k值越小,模型的方差就会越大,当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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/564978.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言打开文件详解

C语言中操作文件之前必须先打开文件;所谓“打开文件”,就是让程序和文件建立连接的过程。 打开文件之后,程序可以得到文件的相关信息,例如大小、类型、权限、创建者、更新时间等。在后续读写文件的过程中,程序还可以记…

python turtle虎年来拜年了

1.画个虎 # codingutf-8 from turtle import * import timeCOLOR #B2814Ddef set_start(x, y, w, cCOLOR):penup()setx(x)sety(y)setheading(towards(0, 0))width(w)pencolor(c)pendown()speed(0)def left_rotate(time, angle, length):for i in range(time):left(angle)forwa…

TOPSIS法 —— matlab

目录 1.TOPSIS法介绍 2. 计算步骤 (1)数据标准化 (2)得到加权后的矩阵 (3)确定正理想解和负理想解 (4)计算各方案到正(负)理想解的距离 (…

TOPSIS法 —— python

目录 1.TOPSIS法介绍 2. 计算步骤 (1)数据标准化 (2)得到加权后的矩阵 (3)确定正理想解和负理想解 (4)计算各方案到正(负)理想解的距离 (…

C语言随机读写文件

实现随机读写的关键是要按要求移动位置指针,这称为文件的定位。 文件定位函数rewind和fseek 移动文件内部位置指针的函数主要有两个,即 rewind() 和 fseek()。 rewind() 用来将位置指针移动到文件开头,前面已经多次使用过,它的…

mysql-installer安装教程(详细图文)

目录 1.安装 2.配置系统环境变量 3.配置初始化my.ini文件 4.MySQL彻底删除 5.Navicat 安装 1.安装 先去官网下载需要的msi,在这放出官网下载地址下载地址 这里我具体以8.0.28 为安装例子,除了最新版安装界面有些变动以往的都是差不多的。 过去的版本…

Java三种随机数生成方法

java的三种随机数生成方式 随机数的产生在一些代码中很常用,也是我们必须要掌握的。而java中产生随机数的方法主要有三种:     第一种:new Random()     第二种:Math.random()     第三种:currentTimeMil…

Python MySQL入门连接

目录 基本环境准备 navicat的傻瓜使用方式 python连接 mysql安装教程:传送门 基本环境准备 WINR 输入cmd回车打开cmd,登录mysql: mysql -h localhost -u root -p然后输入密码回车即可。 创建用户名为testuser1: CREATE USER testuser1…

JDBC连接sql server数据库

IDEA使用JDBC连接Sqlserver数据库 在IDEA的项目中添加对应数据库的jar包 在项目中创建util包和DBUtil类用来存放数据库连接的java代码。 完整代码 package com.hnpi.util;import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; …

Python MySQL创建表

目录 一、创建表 二、检查表是否存在 三、关键字 一、创建表 在库student环境下创建表名为stu: # codinggbk #连接 import pymysqlmydb pymysql.connect(host"localhost", #默认用主机名port3306,user"root", #默认用户名password"123456"…

JDBC连接 Mysql数据库

IDEA使用JDBC连接Mysql数据库 在项目中添加连接Mysql数据库的jar包 在项目中创建util包和DBUtil类用来存放数据库连接的java代码。 完整代码 package com.zsh.util;import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import…

Python MySQL插入表

目录 1.插入表格 2.插入多行 3.获取插入的 ID 1.插入表格 要在 MySQL 中填充表,请使用“INSERT INTO”语句。 “stu”表中添加一条记录: 代码: # codinggbk #连接 import pymysqlmydb pymysql.connect(host"localhost", #默认…

Python MySQL选择

目录 1.从表中选择 2.选择列 3.使用 fetchone() 1.从表中选择 要从 MySQL 中的表中进行选择,请使用“SELECT”语句。从“stu”表中选择所有记录,并显示结果: # codinggbk #连接 import pymysqlmydb pymysql.connect(host"localhos…

Eclipse编辑器字体大小的设置

我们在第一次使用 Eclipse 编写程序时,由于 Eclipse 默认使用的是 Cosnolas 字体,字号为 10,所以编辑器中的字体非常小,不方便查看。 我们可以通过下面所示的方法来修改编辑器的字体大小。 操作方法: 1 . 选择“窗口…

Python MySQL查询在哪里(where)

目录 一.用过滤器选择 二.通配符 三.防止 SQL 注入 一.用过滤器选择 从表中选择记录时,可以使用“WHERE”语句过滤选择。例如:选择名字为”笨小孩“的记录:结果: # codinggbk #连接 import pymysqlmydb pymysql.connect(hos…

Python MySQL排序

目录 顺序排序 按 DESC逆序排序 顺序排序 使用 ORDER BY 语句按升序或降序对结果进行排序。ORDER BY 关键字默认对结果进行升序排序。要按降序对结果进行排序,请使用 DESC 关键字。 按名称的字母顺序对结果进行排序: # codinggbk #连接 import pymys…

Python MySQL删除

目录 删除记录 防止 SQL 注入 删除记录 您可以使用“DELETE FROM”语句从现有表中删除记录。例如删除地址为“笨小孩”的任何记录: # codinggbk #连接 import pymysqlmydb pymysql.connect(host"localhost", #默认用主机名port3306,user"root&q…

Python MySQL更新表

目录 更新表 防止 SQL 注入 更新表 您可以使用“UPDATE”语句更新表中的现有记录。将地址栏从“Valley 345”改写为“Canyoun 123”: # codinggbk #连接 import pymysqlmydb pymysql.connect(host"localhost", #默认用主机名port3306,user"root…

Python MySQL合并

目录 创建新表 表中添加数据 连接两个或多个表 左连接 右连接 创建新表 创建表名为product # codinggbk #连接 import pymysqlmydb pymysql.connect(host"localhost", #默认用主机名port3306,user"root", #默认用户名password"123456",…

如何用记事本编写运行java程序?

我们在安装好JDK和配置好环境变量后&#xff0c;许多人使用编译器编写程序而不会使用记事本编写运行java程序&#xff0c;下面就给大家讲解一下使用记事本编写运行java程序。 1.首先&#xff0c;要保证环境变量配置完成。组合键<WinR>打开运行命令框。 2.输入CMD进入命…