kNN分类

news2025/1/4 19:28:12

一、 概述

  kNN(k nearest neighbor,k近邻)是一种基础分类算法,基于“物以类聚”的思想,将一个样本的类别归于它的邻近样本。
![在这里插入图片描述] Alt

二、算法描述

1.基本原理

  给定训练数据集 T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x N , y N ) } T=\left\{ \left( x_1,y_1 \right),\left( x_2,y_2 \right),...,\left( x_N,y_N \right) \right\} T={(x1,y1),(x2,y2),...,(xN,yN)},其中 x i = ( x i ( 1 ) , x i ( 2 ) , . . . , x i ( n ) ) x_i=\left( x_{i}^{(1)},x_{i}^{(2)},...,x_{i}^{(n)} \right) xi=(xi(1),xi(2),...,xi(n))为特征向量, y i y_i yi为样本类别。对于一个待测样本 x x x,计算 x x x与训练集样本的距离,找到离它最近的 k k k个邻居,考察这 k k k个邻居,它们更倾向于哪个类别,就把 x x x归到那个类别。算法由三个基本要素构成: k k k值选择距离度量分类决策规则

k值选择:
  若 k k k 值过小,模型偏向复杂,易于过拟合;若 k k k 值过大,模型偏向简单,易于欠拟合。通常由交叉验证法选择最优的 k k k值,一般不超过20。

距离度量:
  距离度量的方式有很多,通常使用欧氏距离,也就是差向量的 L 2 L2 L2范数。对两个样本向量 A = ( x 11 , x 12 , . . . , x 1 n ) A=\left( x_{11},x_{12},...,x_{1n} \right) A=(x11,x12,...,x1n) B = ( x 21 , x 22 , . . . , x 2 n ) B=\left( x_{21},x_{22},...,x_{2n} \right) B=(x21,x22,...,x2n),它们之间的欧氏距离为 d = ∑ k = 1 n ( x 1 k − x 2 k ) 2 d=\sqrt{\sum_{k=1}^{n}{\left( x_{1k}-x_{2k} \right)^{2}}} d=k=1n(x1kx2k)2

分类决策规则:
  一般是多数表决,即由 k k k个邻居中较多的决定。也可以根据距离的远近,赋以样本不同的权重。

2.算法描述

输入:训练数据集 T T T ;待测样本 x x x.
输出: x x x所属类别.
(1)计算 x x x与训练样本间的距离.
(2)确定与 x x x最近的 k k k个邻居.
  按距离对样本进行排序,选取前 k k k 个距离最小的样本,构成邻居集合 N k ( x ) N_{k}\left( x \right) Nk(x).样本数量为 ∣ N k ( x ) ∣ = M \left| N_k\left( x \right) \right|=M Nk(x)=M
(3)确定 x x x 的类别 y y y .
  多数表决,由邻居集合中类别的多数决定
y = arg ⁡ m a x c j ∑ x i ∈ N k ( x ) I ( y i = c j ) y=\arg max_{c_j}{\sum_{x_i\in N_k\left( x \right)}{I\left( y_i=c_j \right)}} y=argmaxcjxiNk(x)I(yi=cj)
  其中 I I I 为指示函数
I = { 1 i f ( y i = c j ) 0 i f ( y i ≠ c j ) I= \left\{ \begin{array}{lr} 1 \quad if\left( y_i=c_j \right)&\\ 0 \quad if\left( y_i\ne c_j \right) \end{array} \right. I={1if(yi=cj)0if(yi=cj)   i = 1 , 2 , . . . , M i=1,2,...,M i=1,2,...,M; j = 1 , 2 , . . . , K j=1,2,...,K j=1,2,...,K.

三、 python实现

'''
功能:由sklearn实现kNN分类。
'''
import numpy as np
from sklearn.neighbors import KNeighborsClassifier

## 1.构造训练集和待测样本
#训练集数据
train_x=[
    [1.1, 2, 3, 4],
    [1, 2.2, 3, 4],
    [1, 2, 3.3, 4],
    [1, 2, 3, 4.4],
    [1.1, 2.2, 3, 4],
    [1, 2, 3.3, 4.4]
]
#训练集数据标签
train_y=[
    1,
    2,
    2,
    3,
    3,
    1
]
train_y = list(map(float,train_y)) #浮点化

#待测样本
test_x = [
    [1.2, 2, 3, 4],
    [1, 2.3, 3, 4]
]
#转为array形式
train_x = np.array(train_x)
train_y = np.array(train_y)
test_x = np.array(test_x)


## 2.定义分类器
knnClf = KNeighborsClassifier(
    n_neighbors=2,  #选取的k值,即邻居样本数
    weights='uniform',  #分类决策权重,默认uniform,为均等权重
    algorithm='auto',
    leaf_size=30,
    p=2,metric='minkowski', #距离度量,闵可夫斯基空间下的欧氏距离(p=2)
    metric_params=None,
    n_jobs=None
)

## 3.训练
Fit_knnClf = knnClf.fit(train_x,train_y)

## 4.预测
pre_y = Fit_knnClf.predict(test_x)

print('预测类别:')
print(pre_y)

在这里插入图片描述
End.


参考
1.李航.《统计学习方法》.清华大学出版社
2. https://blog.csdn.net/Albert201605/article/details/81040556?spm=1001.2014.3001.5502

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

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

相关文章

17. XML

文章目录一、XML概念二、XML语法1、基础语法2、快速入门3、组成部分4、约束1. 约束概述2. 分类3. DTD4. Schema三、XML解析1、操作xml文档2、 解析xml的方式1. DOM2. SAX3. xml常见的解析器(工具包)4. Jsoup(1)快速入门&#xff0…

VUE3 学习笔记(一):环境配置、项目创建

一、首先需要安装node.jsnodejs官网:Node.js (nodejs.org)下载安装包:下载稳定版本即可,目前(2023-01-07)是18.13.0版本c. 检查当前版本(CMD):至此,nodejs已经安装成功&a…

电力系统机组组合(Matlab代码实现)

💥💥💥💞💞💞欢迎来到本博客❤️❤️❤️💥💥💥🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清…

EM算法学习总结

序 这个和我的硕士毕业论文的题目就有一定关系,我的导师让我按时向她汇报学习进度。然而我还在进行实习,还要准备自己明年的秋招,只能想办法游走于三者之间。 EM算法是一个常用的数据挖掘算法,想必从事数据挖掘的相关工作的同学…

机器人操作系统ROS/ROS2(1)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、ROS和ROS2是什么?二、ROS2安装步骤1.Ubuntu虚拟机安装2.ROS2系统安装3.验证ROS2安装成功4.小海龟仿真示例总结前言 提示:这里可以添…

LeetCode刷题模版:21 - 30

目录 简介21. 合并两个有序链表22. 括号生成23. 合并K个升序链表24. 两两交换链表中的节点25. K 个一组翻转链表26. 删除有序数组中的重复项27. 移除元素28. 找出字符串中第一个匹配项的下标29. 两数相除【未理解】30. 串联所有单词的子串【未理解】结语简介 Hello! 非常感谢您…

devops 是什么东东了

DevOps,字面意思是Development &Operations的缩写。 DevOps是从实践中逐步总结提炼出的方法论理念。近而创造了DevOps这个词。 DevOps概念的萌芽阶段: 2008年敏捷大会上,来自Patrick Debois发表了题为 《Agile Infrastructure & Op…

基于.NET技术的动漫管理系统,给各位二次元老司机提供的动漫管理平台,基于.NET的前后端框架Blazor,含安装教程及使用说明

介绍 老司机驾驶舱——给各位二次元老司机提供的动漫管理平台。 下载地址:基于.NET技术的动漫管理系统 编写本应用的目的主要是实践巨硬(Microsoft)的新一代前端框架Blazor与EntityFramework,本应用也给想要学习这套框架的童鞋提…

Ubuntu20.04 hyperledger fabric2.4基于Docker搭建blockchain-explorer

准备 启动fabric测试网络。   这里默认已经完成了Fabric测试网络搭建以及运行。   后续会出Fabric安装,现在不会的就先去看别的博客 配置 1.在test-network 文件夹下面建立explorer文件夹: mkdir explorer2. 配置文件 2.1下载配置文件 先进文件…

Isaac Sim 机器人仿真器介绍、安装与 Docker [1]

前言与参考 此文书写于: January 6, 2023, 更新于 January 6, 2023 ;可能会随着时间的变化 此教程会有过时概念哦 Isaac Sim 相关参考链接: 官方文档地址官方docker image 镜像地址官方讨论 论坛链接,建议没啥事就可…

【JavaGuide面试总结】Java基础篇·中

【JavaGuide面试总结】Java基础篇中1.重载和重写有什么区别?2.什么是可变长参数?3.为什么浮点数运算的时候会有精度丢失的风险?4.如何解决浮点数运算的精度丢失问题?5.超过 long 整型的数据应该如何表示?6.基本类型和包…

JSP——标准标签库 (JSTL)

✅作者简介:热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏:JAVA开发者…

5G NR标准: 第19章 毫米波射频技术

第19章 毫米波射频技术 现有的 2G、3G 和 4G 移动通信 3GPP 规范适用于 6 GHz 以下的频率范围,相应的 RF 要求考虑了与 6 GHz 以下操作相关的技术方面。 NR 也在这些频率范围内运行(标识为频率范围 1),但另外还将定义为在 24.25…

【人工智能原理自学】梯度下降和反向传播:能改

😊你好,我是小航,一个正在变秃、变强的文艺倾年。 🔔笔记来自B站UP主Ele实验室的《小白也能听懂的人工智能原理》。 🔔本文讲解梯度下降和反向传播:能改,一起卷起来叭! 目录一、“挪…

Rollup Decentralization

1. 引言 当前的Rollup为中心化的,这并不是必须的,而是当前的选择。 2. 何为Rollup? Rollup与其它L2或侧链的主要区别在于: L1数据可用性 Rollup:只要L1的数据可用性存在,用户可重构L2状态,然…

SQL LIKE 操作符

LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式。 SQL LIKE 操作符 LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式。 SQL LIKE 语法 SELECT column1, column2, ... FROM table_name WHERE column LIKE pattern; 参数说明: column1, column2, ...&…

php://filter伪协议(总结)

文章目录php://filter伪协议总结php://filter伪协议介绍php://filter伪协议使用方法php://filter过滤器分类filter字符串过滤器string.rot13string.toupperstring.tolowerstring.strip_tagsfilter转换过滤器convert.base64-encodeconvert.base64-decodeconvert.quoted-printabl…

【Kotlin】空安全 ① ( Kotlin 的空安全机制 | 变量可空性 | 默认变量不可赋空值 | 声明可空类型变量 )

文章目录一、Kotlin 的空安全机制二、变量可空性1、默认变量不可赋空值2、声明可空类型变量一、Kotlin 的空安全机制 Java 中的空指针问题 : 在 Java 语言 编写的程序中 , 出现最多的崩溃就是 NullPointerException 空指针异常 , 该异常是 运行时 才爆出的 , 在 代码编写时 以…

冰冰学习笔记:C++11的新特性

欢迎各位大佬光临本文章!!! 还请各位大佬提出宝贵的意见,如发现文章错误请联系冰冰,冰冰一定会虚心接受,及时改正。 本系列文章为冰冰学习编程的学习笔记,如果对您也有帮助,还请各位…

k8s入门教程

文章导读 kubernetes,是一个全新的基于容器技术的分布式架构领先方案,是谷歌严格保密十几年的秘密武器----Borg系统的一个开源版本,于2014年9月发布第一个版本,2015年7月发布第一个正式版本。 kubernetes的本质是一组服务器集群&…