机器学习——KNN算法

2023-11-08

机器学习——KNN算法



前言

机器学习笔记


一、KNN原理基础

KNN的算法原理,可以简单如下描述:
一个数据集中存在多个已有标签的样本值,这些样本值共有的n个特征构成了一个多维空间N。当有一个需要预测/分类的样本x出现,我们把这个x放到多维空间n中,找到离其距离最近的k个样本,并将这些样本称为最近邻(nearest neighbour)。对这k个最近邻,查看他们的标签都属于何种类别,根据”少数服从多数,一点算一票”的原则进行判断,数量最多标签类别就是x的标签类别。其中涉及到的原理是“越相近越相似”,这也是KNN的基本假设。 KNN中的K代表的是距离需要分类的测试点x最近的K个样本点,如果不输入这个值,KNN算法中的重要部分“选出K个最近邻”就无法实现。

若数据集只有两个特征,则针对于数据集的描述可用二维平面空间图来表示。如下图,二位平面空间的横坐标是特征1,纵坐标是特征2,每个样本点的分类(正或负)是该组样本的标签。图中给出了位于平面中心的,需要分类的数据点x,并用绿色分别标注了k为1,2,3时的最近邻状况。在图a中,x的1-最近邻是一个负例,因此x被指派到负类。图c中,3-最近邻中包括两个正例和一个负例,根据“少数服从多数原则”,点x被指派到正类。在最近邻中正例和负例个数相同的情况下(图b),算法将随机选择一个类标号来分类该点。
在这里插入图片描述

二、sklearn的基本建模流程

在这里插入图片描述

#======注意该代码仅作展示,无法运行=======#

from sklearn.neighbors import KNeighborsClassifier #导入需要的模块

clf = KNeighborsClassifier(n_neighbors=k)          #实例化
clf = clf.fit(X_train,y_train)                     #用训练集数据训练模型
result = clf.score(X_test,y_test)                  #导入测试集,从接口中调用需要的信息

三、KNN算法调优:选取最优的K值

从KNN的原理中可见,是否能够确认合适的k值对算法有极大的影响。如果K太小,则最近邻分类器容易受到由于训练数据中的噪声而产生的过分拟合的影响;相反。如果k太大,最近邻分类器可能会将测试样例分类错误,因为k个最近邻中可能包含了距离较远的,并非同类的数据点(如下图,k近邻由绿色表示)。因此,超参数K的选定是KNN中的头号问题。

那我们怎样选择一个最佳的K呢?在这里我们要使用机器学习中的神器:参数学习曲线。参数学习曲线是一条以不同的参数取值为横坐标,不同参数取值下的模型结果为纵坐标的曲线,我们往往选择模型表现最佳点的参数取值作为这个参数的取值。

以手写数据集为例:

代码如下(示例):

from sklearn.neighbors import KNeighborsClassifier
from sklearn.datasets import load_digits
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
#探索数据集
data = load_digits()

Xtrain,Xtest,Ytrain,Ytest = train_test_split(X,y              #特征和标签
                                           ,test_size=0.3    #测试集所占的比例
                                           ,random_state=1)
# 绘制学习曲线
score = [] #用来存放模型预测结果
krange = range(1,20) 

for i in krange:
   clf = KNeighborsClassifier(n_neighbors=i)
   clf = clf.fit(Xtrain,Ytrain)
   score.append(clf.score(Xtest,Ytest))
score
bestK = krange[score.index(max(score))]
print(bestK)
print(max(score))

plt.rcParams['font.family'] = ['sans-serif']
plt.rcParams['font.sans-serif'] = ['SimHei'']

plt.figure(figsize=(6,4),dpi=80)  #dpi是像素值
plt.plot(krange,score)

plt.title('K值学习曲线',fontsize=15)
plt.xlabel('K值',fontsize=12)
plt.ylabel('预测准确率',fontsize=12)
plt.xticks(krange[::3])  # x轴刻度
plt.show()

四、KNN中距离的相关讨论

1. KNN使用的是什么距离?

KNN属于距离类模型,原因在于它的样本之间的远近是靠数据距离来衡量的。欧几里得距离、曼哈顿距离、切比雪夫距离、闵可夫斯基距离等都是很常见的距离衡量方法。KNN中默认使用的是欧氏距离(也就是欧几里得距离)。

2. 距离类模型的归一化需求

我们再看一下,欧氏距离的计算公式: d ( A , B ) = ∑ i = 1 n ( x i A − x i B ) 2 d(A, B) = \sqrt{\sum_{i = 1}^{n}(x_{iA}-x_{iB})^2} d(A,B)=i=1n(xiAxiB)2

试想看看,如果某个特征

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

机器学习——KNN算法 的相关文章

随机推荐

  • 异常检测(二)——IsolationForest

    1 简介 孤立森林 Isolation Forest 是另外一种高效的异常检测算法 它和随机森林类似 但每次选择划分属性和划分点 值 时都是随机的 而不是根据信息增益或者基尼指数来选择 在建树过程中 如果一些样本很快就到达了叶子节点 即叶子
  • Google Chrome “网站连接不安全”NET::ERR_CERT_AUTHORITY_INVALID

    Chrome 浏览器打开任何网站显示 网站连接不安全 报错 NET ERR CERT AUTHORITY INVALID 具体操作方法如下 1 运行输入cmd 右击以管理员身份运行命令提示符 2 输入 netsh winsock reset
  • Android Studio远程连接模拟器调试

    目录 需求 ADB端口说明 远程连接步骤 启动模拟器 ADB连接 端口映射 远程连接 需求 Android Studio 高版本已经可以使用 Pair Devices Using Wi fi 功能连接同一局域网下的真机设备了 低版本也可以使
  • 时序预测

    时序预测 MATLAB实现GWO LSTM灰狼算法优化长短期记忆神经网络时间序列预测 目录 时序预测 MATLAB实现GWO LSTM灰狼算法优化长短期记忆神经网络时间序列预测 预测效果 基本介绍 模型描述 程序设计 参考资料 预测效果 基
  • 从0搭建Vue3组件库(五): 如何使用Vite打包组件库

    本篇文章将介绍如何使用 vite 打包我们的组件库 同时告诉大家如何使用插件让打包后的文件自动生成声明文件 d ts 打包配置 vite 专门提供了库模式的打包方式 配置其实非常简单 首先全局安装 vite 以及 vitejs plugin
  • Java API操作HDFS文件,利用Junit单元测试

    操作HDFS文件 约有以下两种方法 1 shell 这个相信大家基本都会 2 Java API 的操作 这次主要记录下Java API操作HDFS文件的相关测试 环境 IDEA JDK10 0 1 虚拟机centos 版本 hadoop2
  • XML 和 JSON 学习笔记(基础)

    XML Why XML 的出现背景 在实际开发中 不同语言 如Java JavaScript等 的应用程序之间数据传递的格式不同 导致它们进行数据交换时很困难 XML就应运而生了 XML 是一种通用的数据交换格式 可以十分方便地实现格式交换
  • 亚稳态的消除及解决方法

    亚稳态产生 我们就要对亚稳态进行消除 常用对亚稳态消除有三种方式 1 对异步信号进行同步处理 2 采用FIFO对跨时钟域数据通信进行缓冲设计 3 对复位电路采用异步复位 同步释放方式处理 1 对异步信号进行同步处理 input sig ns
  • ConnectionString 属性尚未初始化

    ConnectionString 属性尚未初始化 的另类解决办法现在稍微熟悉Asp net的朋友都习惯把数据库连接配置写到web config中 这样的优点主要是能随时更改数据库配置 比如帐号密码 而不用再编译 web config中的数据
  • 古典概型——概率论与数理统计(宋浩)

    事件的概率 1 2 1概率的初等描述 概率的定义 事件发生的可能性的大小 P A 性质 P 1 P 0 规范性 0 lt P A lt 1 非负性 有限可加 A1 A2 A3 An互不相容 P A1 A2 A3 A4 P A1 P A2 P
  • GO面试必须得会的137个面试题

    go的调度 go struct能不能比较 因为是强类型语言 所以不同类型的结构不能作比较 但是同一类型的实例值是可以比较的 实例不可以比较 因为是指针类型 go defer for defer 先进后出 后进先出 func b for i
  • WIN10驱动程序的卸载与更新

    方法一 在设备管理器中找到对应驱动 右键选择 卸载 记得勾选删除此设备的驱动程序软件 然后点击确定 这一步删除了旧得问题驱动 重装得时候就可以根据需要自己选择如何安装驱动了 方法二 以官网下载无线网卡驱动为例 https downloadc
  • VS2012 error C2668: “sqrt”: 对重载函数的调用不明确-已解决

    源程序如下 include
  • Kubernetes RBAC 为指定用户授权访问不同命名空间权限

    在开启了 TLS 的集群中 每当与集群交互的时候少不了的是身份认证 使用 kubeconfig 即证书 和 token 两种认证方式是最简单也最通用的认证方式 以kubectl为例介绍kubeconfig的配置 kubectl只是个go编写
  • pytorch 多GPU训练

    代码库地址 mnist 目录 普通单机单卡训练流程 DDP分布式训练 horovod方式 普通单机单卡训练流程 以mnist为例 主要包括数据加载 模型构建 优化器和迭代训练等部分 import argparse import torch
  • Csharp:字符串操作

    public class StringControl
  • C++中的map

    1 简介 2 pair类型 2 1 pair类型的定义和初始化 2 2 pair对象的一些操作 3 map基本操作 3 1 头文件 3 2 创建map对象 3 3 map元素访问 3 3 1 使用下标 访问 3 3 2 使用 at 方法访问
  • matlab——三元二次函数求最值

    fmincon函数 今天晚上帮姐姐求一个方程的最值 果断用matlab啊 刚开始想得挺简单的 就是for循环 后来一想计算量太大 百度了一下都是用fmincon这个函数 可是算出来的是最小值 然后又找求最大值的函数 可是找了半天没找到 最后
  • 右键菜单添加命令行,右键菜单增加editplus

    我们在运行中输入cmd命令 默认的输入路径是 C Documents and Settings Administrator 而我们所用工具的安装路径常常不在这个路径下 这样会为一些命令的输入造成麻烦 下面通过修改注册表解决这个麻烦 运行 r
  • 机器学习——KNN算法

    机器学习 KNN算法 文章目录 机器学习 KNN算法 前言 一 KNN原理基础 二 sklearn的基本建模流程 三 KNN算法调优 选取最优的K值 四 KNN中距离的相关讨论 1 KNN使用的是什么距离 2 距离类模型的归一化需求 五 K