机器学习-3 K最近邻算法

news2025/1/12 16:06:23

K最近邻算法

  • 算法概述
    • 分类
      • 什么是分类?
      • 分类需要什么?
    • k近邻(KNN)分类
  • KNN算法关键问题
    • k近邻模型的两个关键问题
    • 相似性度量——欧氏距离
    • K值的选取
  • KNN算法流程
    • 算法原理
    • 算法步骤
  • 数据标准化
    • 离差标准化数据
    • 标准差标准化数据
    • 小数定标标准化数据
    • 小结
    • 特征缩放
      • sklearn转换器的三个方法
      • 特征缩放的不同方法
      • 特征缩放的语法
  • 算法实例
    • sklearn中的K近邻分类器
    • k近邻分类器的使用
  • 算法应用

算法概述

分类

什么是分类?

  • 用于分类任务的机器学习模型称为分类模型或分类器。
  • 分类任务的目标是通过训练样本构建合适的分类器C(X),完成对目标的分类。
  • 分类类别只有两类的分类任务称为二值分类或者二分类,这两个类别分别称为正类和负类,通常用+1和-1分别指代。
  • 分类类别多于两类的分类任务通常称之为多值分类。

分类需要什么?

  • 数据:
    1)将对象表示为量化的一组特征。
    2)给定类别标签。
  • 对象间相似性的度量。

k近邻(KNN)分类

  • k-近邻算法,顾名思义,即由某样本k个邻居的类别来推断出该样本的类别。
  • 给定测试样本,基于特定的某种距离度量找到与训练集中最接近的k个样本,然后基于这k个样本的类别进行预测。
    在这里插入图片描述

KNN算法关键问题

k近邻模型的两个关键问题

  • 正确的"K"值,即K值的选取。
  • 如何度量相邻两点之间的相似性/距离?即相似性度量方式的选取。

相似性度量——欧氏距离

欧氏距离也称为欧几里得距离。
在这里插入图片描述
其他距离衡量:余弦值距离(cos)、相关度(correlation)、曼哈顿距离(Manhattan distance)。

相似性度量实例:
使用如下的训练集,其中包含4个样例,每个样例有三个数值属性,以此判断物体x=[2,4,2]的类别。
在这里插入图片描述
通过计算x与所有训练样例之间的欧式距离,我们发现x的最近邻是 e x 2 ex_2 ex2。因为它的类标是pos,因此最近邻分类器返回正类的类标。

K值的选取

在这里插入图片描述
k值大小的影响:

  1. 较小的k值
  • 用较少训练实例预测,非常相似的实例才起作用,学习的近似误差会减小。
  • 预测结果与少量实例有关,对近邻数据非常敏感,学习的估计误差会增大。
  • 噪声敏感。
  • K值的减小意味着模型变复杂,容易过拟合。(我个人对这一点的理解:当k值很小时,模型会更加关注局部信息,而忽略全局信息,这意味着,如果训练数据中存在一些随机噪声或异常值,它们可能会对模型产生不良影响,并导致模型对数据的过度拟合。)
    2.较大的k值
  • 用较多训练实例进行预测,学习的估计误差会减小。
  • 与输入数据距离较远的实例也会起作用,学习的近似误差会增大。
  • K值的增大意味着模型变简单,容易欠拟合。

KNN算法流程

算法原理

  • 为了判断未知实例的类别,以所有已知类别的实例作为参照选择参数K。
  • 计算未知实例与所有已知实例的距离。
  • 选择最近K个已知实例。
  • 根据少数服从多数的投票法则,让未知实例归类为K个最邻近样本中最多数的类别。

算法步骤

  • 选用合适的测试元组和合适的数据存储结构训练数据。
  • 维护一个大小为k,按距离由大到小的优先级队列,用于存储最近邻训练元组。随机从训练元组中选取k个元组作为初始的最近邻元组,分别计算测试元组到这k个元组的距离,将训练元组标号和距离存入优先级队列。
  • 遍历训练元组集,计算当前训练元组与测试元组的距离。(通常使用欧氏距离)
  • 之后将所得距离L与优先级队列中的最大距离L_max进行比较。若L≥ L m a x L_max Lmax,则舍弃该元组,将当前训练元组存入优先级队列。
  • 遍历完毕后,计算优先级队列中k 个元组的多数类,并将其作为测试元组的类别。
  • 测试元组集测试完毕后计算误差率,继续设定不同的k值重新进行训练,最后取误差率最小的k值。
    在这里插入图片描述

数据标准化

数据的所有特征都要做可比较的量化。
在这里插入图片描述

离差标准化数据

离差标准化是对原始数据的一种线性变换,结果是将原始数据的数值映射到[0,1]区间之间,转换公式为:
X ∗ = X − m i n m a x − m i n X^*=\frac{X-min}{max-min} X=maxminXmin
其中max为样本数据的最大值,min为样本数据的最小值,max-min为极差。离差标准化保留了原始数据值之间的联系,是消除量纲和数据取值范围影响最简单的方法。

  • 数据的整体分布情况并不会随离差标准化而发生改变,原先取值较大的数据,在做完离差标准化后的值依旧较大。
  • 当数据和最小值相等的时候,通过离差标准化可以发现数据变为0。
  • 若数据极差过大就会出现离差标准化后数据之间的差值非常小的情况。
  • 同时,还可以看出离差标准化的缺点:若数据集中某个数值很大,则离差标准化的值就会接近于0,并且相互之间差别不大。若将来遇到超过目前属性[min,max]取值范围的时候,会引起系统出错,这时便需要重新确定min和max。

标准差标准化数据

  • 标准差标准化也叫零均值标准化或分数标准化,是当前使用最广泛的数据标准化方法。经过该方法处理的数据均值为0,标准差为1,转化公式如下:
    X ∗ = X − X ‾ δ X^*=\frac{X-\overline X}{\delta} X=δXX
  • 其中 X ‾ \overline X X为原始数据的均值, δ \delta δ为原始数据的标准差。标准差标准化后的值区间不局限于[0,1],并且存在负值。同时也不难发现,标准差标准化和离差标准化一样不会改变数据的分布情况。

小数定标标准化数据

通过移动数据的小数位数,将数据映射到区间[-1,1]之间,移动的小数位数取决于数据绝对值的最大值。转化公式如下:
X ∗ = X 1 0 k X^*=\frac{X}{10^k} X=10kX

小结

总之,三种标准化方法各有其优势:

  • 离差标准化方法简单,便于理解,标准化后的数据限定在[0,1]区间内。
  • 标准差标准化受到数据分布的影响较小。
  • 小数定标标准化方法的适用范围广,并且受到数据分布的影响较小,相较于前两种方法而言该方法适用程度适中。

特征缩放

sklearn转换器的三个方法

sklearn把相关的功能封装为转换器(transformer)。使用sklearn转换器能够实现对传入的NumPy数组进行标准化处理、归一化处理、二值化处理、PCA降维等操作。转换器主要包括三个方法:

方法名称说明
fitfit方法主要通过分析特征和目标值,提取有价值的信息,这些信息可以是统计量,也可以是权值系数等
transformtransform方法主要用来对特征进行转换。从可利用信息的角度可分为无信息转换和有信息转换。无信息转换是指不利用任何其他信息进行转换,比如指数和对数函数转换等。有信息转换根据是否利用目标值向量又可分为无监督转换和有监督转换。无监督转换指只利用特征的统计信息的转换,比如标准化和PCA降维等。有监督转换指既利用了特征信息又利用了目标值信息的转换,比如通过模型选择特征和LDA降维等
fit_transformfit_transform方法就是先调用fit方法,然后调用transform方法

特征缩放的不同方法

  • Standard Scaler:即标准化,尽量将数据转化为均值为0,方差为1的数据,形如标准正态分布(高斯分布)。
  • Minimum-Maximum Scaler:将数据缩放到某一给定范围(通常是[0,1])。
  • Maximum Absolute Value Scaler:通过除以最大绝对值,将数据缩放到[-1,1]。
  • 使各特征的数值都处于统一数量级上。
函数名称说明
MinMaxScaler对特征进行离差标准化
StandardScaler对特征进行标准差标准化
Normalizer对特征进行归一化
Binarizer对定量特征进行二值化处理
OneHotEncoder对定性特征进行独热编码处理
FunctionTransformer对特征进行自定义函数变换

特征缩放的语法

导入包含缩放方法的类:
from sklearn.preprocessing import StandardScaler
创建该类的一个对象:
stdsc=StandardScaler()
拟合缩放的参数,然后对数据做转换:
stdsc=stdsc.fit(X_data)
X_scaled=stdsc.transform(X_data)
或者
X_scaled=stdsc.fit_transform(X_data)

算法实例

sklearn中的K近邻分类器

在sklearn库中,可以使用sklearn.neighbors.KNeighborsClassifier创建一个K近邻分类器,主要参数有:

  • n_neighbors:用于指定分类器中K的大小(默认值为5,注意区分与kmeans的区别)
  • weights:设置选中的K个点对分类结果影响的权重(默认值为平均权重),可以选择“distance”代表越近的点权重越高,或者传入自己编写的以距离为参数的权重计算函数。
  • algorithm:设置用于计算临近点的方法,因为当数据量很大的情况下计算当前点与所有点的距离再选出最近的k各点,这个计算量是很费时的,所以选项中有ball_tree、kd_tree和brute,分别代表不同的寻找邻居的优化算法,默认值为auto,根据训练数据自动选择。

k近邻分类器的使用

#创建一组数据X和它对应的标签y
X=[[0],[1],[2],[3]]
y=[0,0,1,1]
#使用import语句导入K近邻分类器
from sklearn.neighbors import KNeighborsClassifier
#参数n_neighbors设置为3 即使用最近的3个邻居作为分类的依据 其他参数保持默认值 并将创建好的实例赋值给变量neigh
neigh=KNeighborsClassifier(n_neighbors=3)
#调用fit函数 训练
neigh.fit(X,y)
#调用predict函数 对未知分类样本[1.1]分类
print(neigh.predict([[1.1]]))
#预测分类为0

算法应用

案例研究:鸢尾花数据集

  • 150个鸢尾花样例load_iris()
  • 用4个特征度量:花萼的长度和宽度,花瓣的长度和宽度
  • 来自3个不同的属种:Setosa、Versicolor、Virginica,每种50个样例
  • 分类问题:给定一株鸢尾花,判定其属种
    在这里插入图片描述
    代码实现
    普通版本:
from sklearn import neighbors
from sklearn import datasets
knn=neighbors.KNeighborsClassifier()
iris=datasets.load_iris()
X,y=iris.data,iris.target
knn.fit(X,y)
predictedLabel=knn.predict([[0.1,0.2,0.3,0.4]])
print(iris.target_names[predictedLabel])

K折交叉验证版:

from sklearn import neighbors
from sklearn import datasets
from sklearn.model_selection import cross_val_score
iris=datasets.load_iris()
X,y=iris.data,iris.target
knn=neighbors.KNeighborsClassifier()
knn.fit(X,y)
scores=cross_val_score(knn,X,y,cv=5)
predictedLabel=knn.predict([[0.1,0.2,0.3,0.4]])
print(iris.target_names[predictedLabel])
print(scores.mean())

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

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

相关文章

文献阅读-A Survey on Transfer Learning

期刊会议:IEEE TRANSACTIONS ON KNOWLEDGE AND DATA ENGINEERING 时间:2010 级别:CCF A 1、为什么需要迁移 许多机器学习和数据挖掘算法的一个主要假设是,训练数据和未来数据必须在相同的特征空间中,并且具有相同…

CSS的z-index属性

之前以为z-index越大,它的层级就越高,从我遇到的bug来看很显然不是这样。重新回顾一下z-index的知识: 1、z-index只对定义了position属性的,且属性值是非static元素有效。它的默认值是auto,auto的意思是游览器自动进行…

配置工具篇(tmux+ranger+lazygit)

Tmux 简介 官网解释:tmux是一个终端多路复用器:它允许在单个屏幕上创建、访问和控制多个终端。tmux可以从屏幕上分离出来,继续在后台运行,然后再重新连接。 此版本在Open BSD、Free BSD、Net BSD、Linux、mac OS和Solaris上运行…

数据结构 --- 堆

1、堆的基本概念 之前在学习优先级队列的时候&#xff0c; 学习到了堆的概念&#xff0c;现在重新回忆一下&#xff1a; 堆在逻辑上&#xff0c;是一颗完全二叉树堆在物理上&#xff0c;是存储在数组中的任意根节点值>子树节点值&#xff0c;叫做大顶堆。任意根节点值<…

学习RabbitMQ高级特性

目标&#xff1a; 了解熟悉RabbitMQ的高级特性 学习步骤&#xff1a; 高级特性主要分为以下几点, 官网介绍 1、消息可靠性投递 【confirm 确认模式、return 退回模式】 2、Consumer ACK 【acknowledge】 3、消费端限流 【prefetch】 4、TTL过期时间 【time to live】 5、死信队…

SQL注入 - Part 3(带外)

1、DNSLog注入 &#xff08;一种注入新思路&#xff09; 可以看到DNS的解析日志中包含了用户名。 基于此原理&#xff0c;可以手工构造注入点&#xff0c;让DNSlog显示库名、表名等&#xff0c;也可以使用自动化脚本Dnslogsqlinj进行获取。 2、SQL注入的防御 基于关键字&…

rollup打包react组件

这次主要简单实现用rollup打包react组件&#xff0c;组件的话简单写了一个弹窗组件&#xff0c;效果如下&#xff1a; 点击打开弹框&#xff0c;点击关闭按钮关闭弹框 首先创建react项目&#xff0c;这边还是用mfex-project脚手架创建 mfex-project create react-demo 然后编…

Linux·深入理解IO复用技术之epoll

目录 1.写在前面 2.初识复用技术和IO复用 3. Linux的IO复用工具概览 4. 初识epoll 5. epoll的底层细节 6.LT模式和ET模式 7.epoll的惊群问题 1.写在前面 今天一起来学习一下高并发实现的的重要基础&#xff1a;I/O复用技术 & epoll原理。 通过本文你将了解到以下内容…

【JavaScript】ES6,Proxy,Reflect,Promise,生成器,async/await

❤️ Author&#xff1a; 老九 ☕️ 个人博客&#xff1a;老九的CSDN博客 &#x1f64f; 个人名言&#xff1a;不可控之事 乐观面对 &#x1f60d; 系列专栏&#xff1a; 文章目录 ES6模板字符串&#xff0c;标签模板字符串函数的默认参数函数的剩余参数剩余参数和arguments有什…

为什么要学习C++软件调试技术?掌握调试技术都有哪些好处?

目录 1、为什么要学习C软件调试技术&#xff1f; 1.1、IDE调试手段虽必不可少&#xff0c;但还不够 1.2、通过查看日志和代码去排查异常崩溃问题&#xff0c;费时费力&#xff0c;很难定位问 1.3、有的问题很难复现&#xff0c;可能只在客户的环境才能复现 1.4、开发联调工…

使用git远程上传github

如果你不是很熟悉git&#xff0c;在使用git前请先对你的项目进行备份 进入本地文件目录&#xff0c;打开git的cmd界面&#xff08;Git Bash Here&#xff09;如果当面目录使用过git&#xff0c;有.git隐藏文件&#xff0c;则跳过第二步&#xff0c;没有则输入以下命令 git ini…

零基础如何自学网络安全?

第一阶段&#xff1a;学习一种或几种编程语言。 网络安全也属于计算机范畴&#xff0c;涉及到IT行业的&#xff0c;编程语言是不可难免的。 《Head First Python(第2版)》 作为一种高级编程语言&#xff0c;Python越来越受到网络专家的欢迎。它之所以吸引人&#xff0c;主要…

【Java 28岁了】一个有趣的例子,再推荐一些经典好书(文末惊喜福利)

文章目录 1 写在前面2 C语言与Java语言的互相调用2.1 C语言调用Java语言2.2 Java语言调用C语言 3 友情推荐4 更多分享 1 写在前面 众所周知&#xff0c;C语言和Java语言是两种不同的编程语言&#xff0c;它们的关系可以描述为Java语言是在C语言的基础上发展而来的一种高级编程…

内网如何映射到公网访问互联网

我们通常会根据本地应用场景来选择合适的中间件来搭建服务器。tomcat、 apache是比较常用的搭建服务器的中间件&#xff0c;它们之间还是有一些区别差异的。在内网本地部署搭建服务器后&#xff0c;还可以通过快解析端口映射方法&#xff0c;将内网应用地址发布到互联网&#x…

Springboot +spring security,使用过滤器方式实现验证码功能

一.简介 在前面文章章节通过自定义认证器实现了验证码功能&#xff0c;这篇文章使用过滤器来实现验证码功能。 二.思路分析 实现逻辑和通过过滤器实现json格式登录一样&#xff0c;需要继承UsernamePasswordAuthenticationFilter&#xff0c;所以文档这块主要记录下代码实现…

每日一题——两数之和(返回下标和返回数值两种情况)

每日一题 两数之和 题目链接 思路 注&#xff1a;本题只采用暴力解法&#xff0c;时间复杂度为O(n2)&#xff0c;如果采用哈希表&#xff0c;可以将时间复杂度降到O(n)&#xff0c;但由于笔者还未对哈希表展开学习&#xff0c;故不做讨论 我们直接用两层for循环来解决问题 第…

安装部署 Mastodon 长毛象去中心化微博系统

注意&#xff1a;本文采用的为 Docker Compose 方式安装部署。 首先选择你安装的版本&#xff0c;有以下两种推荐&#xff1a; 官方版本&#xff1a; https://github.com/mastodon/mastodonGlitch 版本&#xff1a; https://github.com/glitch-soc/mastodon 项目包含一个 Doc…

不同的去耦电容 阻抗VS频率

不同的去耦电容 阻抗VS频率 • 并联电容可以在一个较宽的频带内降低阻抗 • 小的去耦电容尽可能靠近电源引脚 为什么每个电源引脚都需要去耦 去耦电容总结 • 旁路电容离电容引脚尽可能的近 • SMT磁珠对于降低Ripple非常有效 • 高频时需要地平面 – 最小化寄生参数 • 使用…

记两道小明文攻击题

题一 题目描述&#xff1a; flag **************************** flag "asfajgfbiagbwe" p getPrime(2048) q getPrime(2048) m1 bytes_to_long(bytes(flag.encode()))e1e2 3087 n p*q print()flag1 pow(m1,e1,n) flag2 pow(m1,e2,n) print(flag1 str(fla…

MATLAB 搜索某一点的R邻域点 (13)

MATLAB 搜索某一点的R邻域点 (13) 前言一、算法介绍1.1 :无序点云的R邻域点搜索1.2 :有序点云的R邻域点搜索二、具体实现示例2.1 算法一 (含详细注释)2.2 算法二 (含详细注释)前言 在点云处理中,最基本的算法之一就是搜索某一点的近邻点,这在重叠区域确定,点云密度…