分类算法系列②:KNN算法

目录

KNN算法

1、简介

2、原理分析

数学原理

相关公式及其过程分析

距离度量

k值选择

分类决策规则

3、API

4、⭐案例实践

4.1、分析

4.2、代码

5、K-近邻算法总结


🍃作者介绍:准大三网络工程专业在读,努力学习Java,涉猎深度学习,积极输出优质文章

⭐分类算法系列①:初识概念

KNN算法

定义:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。

来源:KNN算法最早是由Cover和Hart提出的一种分类算法

1、简介

K最近邻(K-Nearest Neighbors,KNN)是一种简单但强大的监督学习算法,用于分类和回归任务。它的基本思想是:给定一个新的数据点,通过找到训练数据中最接近它的K个邻居,来进行分类或回归预测。KNN算法在许多实际问题中表现良好,但也有其局限性。

以下是KNN算法的基本工作原理:

  1. 数据表示: 对于每个样本,KNN使用一组特征来描述。这些特征可以是数值、类别或其他类型的数据。每个样本都由特征向量表示。
  2. 距离度量: KNN算法使用某种距离度量来计算数据点之间的相似性。常用的距离度量包括欧几里德距离、曼哈顿距离等。对于每个样本,都可以计算其与训练数据中其他样本之间的距离。
  3. 邻居选择: 对于一个新的数据点,KNN算法会计算它与训练数据中所有数据点的距离,并选择最近的K个邻居。这些邻居通常是距离最近的K个训练样本。
  4. 预测(分类问题): 对于分类问题,KNN算法会将这K个最近邻居的类别进行统计,然后将新数据点分类为在这些邻居中占多数的类别。这就是所谓的“多数投票”法。
  5. 预测(回归问题): 对于回归问题,KNN算法会将这K个最近邻居的目标值(即回归目标)进行平均,然后将新数据点的回归预测设置为这个平均值。

KNN算法的优点包括简单易用、适用于多类别分类、不需要训练阶段(直接存储训练数据)等。

然而,KNN算法也有一些缺点,包括:

  1. 效率问题:对于大规模数据集,计算所有样本之间的距离可能会很耗时。
  2. 高维数据:在高维特征空间中,距离计算变得困难,且容易出现维度灾难(curse of dimensionality)。
  3. 需要合适的距离度量和K值的选择。

在实际应用中,选择适当的K值、距离度量和数据预处理方法非常重要,以确保KNN算法的性能最优化。

2、原理分析

数学原理

K-近邻(K-Nearest Neighbors,KNN)算法背后的数学原理涉及距离度量、邻居选择和预测的计算。以下是KNN算法的数学原理的详细解释:

  1. 距离度量: KNN算法中最重要的概念之一是距离度量,它用于衡量样本之间的相似性。常用的距离度量包括欧几里德距离(Euclidean distance)和曼哈顿距离(Manhattan distance)。
  2. 邻居选择: 对于一个新的数据点,KNN算法计算它与训练数据中所有数据点之间的距离。然后,它选择距离最近的K个数据点作为最近邻居。这些最近邻居可以根据计算的距离值进行排序。
  3. 预测(分类问题): 对于分类问题,KNN算法会统计这K个最近邻居中每个类别的数量。然后,将新数据点分类为在这些邻居中占多数的类别。
  4. 预测(回归问题): 对于回归问题,KNN算法会计算这K个最近邻居的目标值的平均值,然后将新数据点的回归预测设置为这个平均值。

在实际应用中,选择适当的K值以及距离度量方法非常重要。K值较小可能会导致模型过拟合,而K值较大可能会导致模型欠拟合。同时,距离度量的选择应根据数据的特点进行调整,以确保能够捕获数据之间的相似性。在高维空间中,可能需要对特征进行标准化以避免某些特征对距离的影响过大。

相关公式及其过程分析

k 近邻法 (k-nearest neighbor, k-NN) 是一种基本分类与回归方法。是数据挖掘技术中原理最简单的算法之一,核心功能是解决有监督的分类问题。KNN能够快速高效地解决建立在特殊数据集上的预测分类问题,但其不产生模型,因此算法准确 性并不具备强可推广性。

k近邻法 的输入为实例的特征向量,对应与特征空间的点;输出为实例的类别,可以取多类。

k近邻法 三个基本要素:k 值的选择、距离度量及分类决策规则。

算法过程:

1, 计算训练样本和测试样本中每个样本点的距离(常见的距离度量有欧式距离,马氏距离等);
2, 对上面所有的距离值进行排序;
3, 选前k个最小距离的样本;
4, 根据这k个样本的标签进行投票,得到最后的分类类别;

输入:训练数据集 :T=\{\ (x_1,y_1),(x_2,y_2),\cdots,(x_N,y_N) \}

其中, x_i 为实例的特征向量, y_i 为实例的类别,i = 1,2,\cdots,N

输出:实例 x 所属的类 y

(1)根据给定的距离度量,在训练集 T 中找出与x最近邻的个点,涵盖这个 k 点的 x 的邻域记作N_k(x)

(2)在 N_k(x) 中根据分类决策规则(如多数决策)决定 x 的类别 y:

y=argmax_{cj}\sum_{x_i\in N_k(x)=1}{I(y_i=c_j)}

(i = 1,2,\cdots,N; j = 1,2,\cdots,K)

其中,I为指示函数,即y_i=c_jI为1,否则I为0

距离度量

特征空间中两个实例点的距离时两个实例点相似程度的反映。

在距离类模型,例如KNN中,有多种常见的距离衡量方法。 如欧几里得距离、曼哈顿距离、闵科夫斯基距离、切比雪夫距离及余弦距离。其中欧几里得距离为最常见。

下面是几种距离的论述:

欧几里得距离(Euclidean Distance):定义与欧几里得空间中,两点之间或多点之间的距离表示又称欧几里得度量。

二维平面:d=\sqrt{(x_a-x_b)^2+(y_a-y_b)^2}

三维空间:d=\sqrt{(x_a-x_b)^2+(y_a-y_b)^2+(z_a+z_b)^2}

推广到在n维空间中,有两个点A和B,两点的坐标分别为:

d(A,B)=\sqrt{(x_{1a}-x_{1b})^2+(x_{2a}-x_{2b})^2+\cdots+(x_{3a}-x_{3b})^2}=\sqrt{\sum_{i=1}^{n}{(x_{ia}-x_{ib})^2} }

坐标轴上的值 正是样本数据上的n个特征。

曼哈顿距离(Manhattan Distance):正式意义为城市区块距离,也被称作街道距离,该距离在欧几里得空间的固定直角坐标所形成的线段产生的投影的距离总和。

其计算方法相当于是欧式距离的1次方表示形式,其基本计算公式如下:d(a,b)=\sum_{i=1}^{n}{(|x_{ia}-x_{ib}|)}

闵科夫斯基距离(Minkowski Distance):闵氏距离不是一种距离,而是一组距离的定义,是对多个距离度量公式的概括性的表述。

无论是欧式距离还是曼哈顿距离,都可视为闵可夫斯基距离的一种特例。

公式如下:d(a,b)=\sqrt[p]{\sum_{i=1}^{n}{(|x_{ia}-x_{ib}|)^p}}

其中p是一个变参数:

当p=1时,就是曼哈顿距离;

当p=2时,就是欧氏距离;

当p→∞时,就是切比雪夫距离。

因此,根据变参数的不同,闵氏距离可以表示某一类 / 种的距离。

切比雪夫距离(Chebyshev Distance):国际象棋中,国王可以直行、横行、斜行,所以国王走一步可以移动到相邻8个方格中的任意一个。国王从格子(x1,y1)走到格子(x2,y2)最少需要多少步?这个距离就叫切比雪夫距离。

二维平面:d(a,b)=max(|x_a-x_b|,|y_a-y_b|)

n维空间:d(a,b)=max_i(|x_{ai}-x_{bi}|)

余弦距离:余弦相似度用向量空间中两个向量夹角的余弦值作为衡量两个样本差异的大小。

余弦值越接近1,说明两个向量夹角越接近0度,表明两个向量越相似

几何中,夹角余弦可用来衡量两个向量方向的差异;

机器学习中,借用这一概念来衡量样本向量之间的差异。

公式:cos(\theta)=\frac{\sum_{i=1}^{n}{(x_{ia}x_{ib})}}{\sqrt{\sum_{i=1}^{n}x_{ia}^2}\sqrt{\sum_{i=1}^{n}x_{ib}^2}}

k值选择

k 值的选择会对KNN 算法的结果产生重大影响。

  1. k 值的减小就意味着整体模型变得复杂,器容易受到由于训练数据中的噪声而产生的过分拟合的影响。
  2. k 值的的增大就意味着整体的模型变得简单。如果k太大,最近邻分类器可能会将测试样例分类错误,因为k个最近邻中可能包含了距离较远的,并非同类的数据点。

在应用中,k 值一般选取一个较小的数值,通常采用交叉验证来选取最优的k 值。

分类决策规则

根据 "少数服从多数,一 点算一票" 的原则进行判断,数量最多标签类别就是x的标签类别。其中涉及到的原理是"越相近越相似",这也是KNN 的基本假设。

3、API

sklearn.neighbors.KNeighborsClassifier(n_neighbors=5,algorithm='auto')

  1. n_neighbors:int,可选(默认= 5),k_neighbors查询默认使用的邻居数
  2. algorithm:{‘auto’,‘ball_tree’,‘kd_tree’,‘brute’},
    1. 可选用于计算最近邻居的算法:‘ball_tree’将会使用 BallTree,
    2. ‘kd_tree’将使用 KDTree。
    3. ‘auto’将尝试根据传递给fit方法的值来决定最合适的算法。

        (不同实现方式影响效率)

4案例实践

案例:预测签到位置:

数据介绍(train.csv和test.csv ):将根据用户的位置,准确性和时间戳预测用户正在查看的业务。

数据各项介绍:

row_id:登记事件的ID

x / y:坐标

accuracy性:定位准确性

time:时间戳

place_id:业务的ID,这是预测的目标

官网:https://www.kaggle.com/navoshta/grid-knn/data

4.1、分析

  1. 基本处理
    1.  缩小数据集范围 DataFrame.query()
    2. 删除没用的日期数据 DataFrame.drop(可以选择保留)
    3. 将签到位置少于n个用户的删除place_count = data.groupby('place_id').count()tf = place_count[place_count.row_id > 3].reset_index()data = data[data['place_id'].isin(tf.place_id)] 
  2. 分割数据集
  3. 标准化处理
  4. k-近邻预测

4.2、代码

代码如下:

# -*- coding: utf-8 -*-
# @Author:︶ㄣ释然
# @Time: 2023/8/30 23:48
import pandas as pd
from sklearn.model_selection import train_test_split  # 将数据集分割为训练集和测试集。
from sklearn.neighbors import KNeighborsClassifier  # 实现KNN分类器
from sklearn.preprocessing import StandardScaler  # 特征标准化'''
sklearn.neighbors.KNeighborsClassifier(n_neighbors=5,algorithm='auto')n_neighbors:int,可选(默认= 5),k_neighbors查询默认使用的邻居数algorithm:{‘auto’,‘ball_tree’,‘kd_tree’,‘brute’},可选用于计算最近邻居的算法:‘ball_tree’将会使用 BallTree,‘kd_tree’将使用 KDTree。‘auto’将尝试根据传递给fit方法的值来决定最合适的算法。(不同实现方式影响效率)
'''
def knncls():"""K近邻算法预测入住位置类别:return:"""# 一、处理数据以及特征工程# 1、读取收,缩小数据的范围data = pd.read_csv("./data/FBlocation/train.csv")# 数据逻辑筛选操作 df.query()data = data.query("x > 1.0 & x < 1.25 & y > 2.5 & y < 2.75")# 删除time这一列特征data = data.drop(['time'], axis=1)print(data)# 删除入住次数少于三次位置place_count = data.groupby('place_id').count()tf = place_count[place_count.row_id > 3].reset_index()data = data[data['place_id'].isin(tf.place_id)]# 3、取出特征值和目标值y = data['place_id']# y = data[['place_id']]x = data.drop(['place_id', 'row_id'], axis=1)# 4、数据分割与特征工程?# (1)、数据分割x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3)# (2)、标准化std = StandardScaler()# 队训练集进行标准化操作x_train = std.fit_transform(x_train)print(x_train)# 进行测试集的标准化操作x_test = std.fit_transform(x_test)# 二、算法的输入训练预测# K值:算法传入参数不定的值    理论上:k = 根号(样本数)# K值:后面会使用参数调优方法,去轮流试出最好的参数[1,3,5,10,20,100,200]knn = KNeighborsClassifier(n_neighbors=3)# 调用fit()knn.fit(x_train, y_train)# 预测测试数据集,得出准确率y_predict = knn.predict(x_test)print("预测测试集类别:", y_predict)print("准确率为:", knn.score(x_test, y_test))if __name__ == '__main__':knncls()

执行结果:

这段代码是一个使用K最近邻(KNN)算法进行分类预测的示例,用于预测移动设备的位置类别。下面逐行解释代码的每个部分:

  1. 导入必要的包
    • import pandas as pd:导入Pandas库,用于数据处理和分析。
    • from sklearn.model_selection import train_test_split:从scikit-learn中导入train_test_split函数,用于将数据集分割为训练集和测试集。
    • from sklearn.neighbors import KNeighborsClassifier:从scikit-learn中导入KNeighborsClassifier类,用于实现KNN分类器。
    • from sklearn.preprocessing import StandardScaler:从scikit-learn中导入StandardScaler类,用于特征标准化。
  2.  函数knncls()定义
    • 该函数实现了一个完整的KNN分类流程。
  3. 数据读取与预处理
    • data = pd.read_csv("./data/FBlocation/train.csv"):从CSV文件读取数据。
    • data = data.query("x > 1.0 & x < 1.25 & y > 2.5 & y < 2.75"):对数据进行逻辑筛选,选取特定范围内的数据。
    • data = data.drop(['time'], axis=1):删除数据中的时间列。
    • place_count = data.groupby('place_id').count():根据位置ID对数据进行分组统计。
    • tf = place_count[place_count.row_id > 3].reset_index():选取入住次数超过3次的位置。
    • data = data[data['place_id'].isin(tf.place_id)]:筛选出入住次数较多的位置。
  4. 数据分割与特征工程
    • y = data['place_id']:目标值为位置ID。
    • x = data.drop(['place_id', 'row_id'], axis=1):特征值为除位置ID和行ID外的其他特征。
    • x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3):将数据集分割为训练集和测试集。
    • std = StandardScaler():实例化一个标准化器。
    • x_train = std.fit_transform(x_train):对训练集进行标准化操作。
    • x_test = std.fit_transform(x_test):对测试集进行标准化操作。
  5.  KNN模型训练与预测
    • knn = KNeighborsClassifier(n_neighbors=1):实例化一个KNN分类器,其中n_neighbors参数设置为1。
    • knn.fit(x_train, y_train):训练KNN模型。
    • y_predict = knn.predict(x_test):使用训练好的模型进行预测。
    • print("准确率为:", knn.score(x_test, y_test)):输出模型在测试集上的准确率。

总体而言,这段代码演示了如何使用KNN算法进行分类预测。它包括数据读取、预处理、特征工程、模型训练和预测等步骤。同时,还使用了StandardScaler进行特征标准化,以及KNN分类器进行预测并计算准确率。

5K-近邻算法总结

优点:简单,易于理解,易于实现,无需训练

缺点:

        懒惰算法,对测试样本分类时的计算量大,内存开销大

        必须指定K值,K值选择不当则分类精度不能保证

使用场景:小数据场景,几千~几万样本,具体场景具体业务去测试

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

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

相关文章

QT连接数据库

目录 数据库 数据库基本概念 常用的数据库 SQLite3基础 SQLite特性&#xff1a; QT连接数据库 1.1 QT将数据库分为三个层次 1.2 实现数据库操作的相关方法 sql语句&#xff08;常用&#xff09; 1&#xff09;创建表格 2&#xff09;删除表格 3&#xff09;插入记录 …

期权交易策略及案例的基本策略有哪些?

目前我国上市交易的期权品种日益丰富&#xff0c;期权的基础的交易方法是建立相应头寸再反向平仓&#xff0c;赚取权利金差价&#xff0c;也可以持有期权到期行权。除了基础的交易方法之外&#xff0c;期权还有一些组合策略&#xff0c;下文介绍期权交易策略及案例的基本策略有…

修改部署后的SSM项目配置文件

修改部署后的SSM项目配置文件 环境配置&#xff1a;window10&#xff0c;JDK8&#xff0c;项目采用SSM编写&#xff0c;部署在tomcat上&#xff0c;maven打包是打成war包 1、找到配置文件 打开tomcat目录 D:\Programming\apache-tomcat-8.5.58\webapps\MyPRO\WEB-INF\class…

docker安装redis实操记录

1.Docker拉取镜像 docker pull redis2.Docker挂载配置文件 创建挂载文件夹 mkdir -p /home/redis/data下载默认配置文件 redis.conf 3.启动redis 容器 docker run --restartalways --log-opt max-size100m --log-opt max-file2 -p 6379:6379 --name redis -v /home/redi…

react16之前diff算法的理解和总结

此篇文章所讨论的是 React 16 以前的 Diff 算法。而 React 16 启用了全新的架构 Fiber&#xff0c;相应的 Diff 算法也有所改变&#xff0c;本片不详细讨论Fiber。 fiber架构是为了支持react进行可中断渲染&#xff0c;降低卡顿&#xff0c;提升流畅度。 react16之前的版本&…

16、Flink 的table api与sql之连接外部系统: 读写外部系统的连接器和格式以及Apache Hive示例(6)

Flink 系列文章 1、Flink 部署、概念介绍、source、transformation、sink使用示例、四大基石介绍和示例等系列综合文章链接 13、Flink 的table api与sql的基本概念、通用api介绍及入门示例 14、Flink 的table api与sql之数据类型: 内置数据类型以及它们的属性 15、Flink 的ta…

docker使用(一)生成,启动,更新(容器暂停,删除,再生成)

docker使用&#xff08;一&#xff09; 编写一个 Dockerfile构建镜像构建失败构建成功 运行镜像运行成功 修改代码后再次构建请不要直接进行构建&#xff0c;要将原有的旧容器删除或暂停停止成功删除成功再次构建且构建成功&#xff01; 要创建一个镜像&#xff0c;你可以按照以…

二叉树的介绍及二叉树的链式结构的实现(C语言版)

前言 二叉树是一种特殊的树&#xff0c;它最大的度为2&#xff0c;每个节点至多只有两个子树。它是一种基础的数据结构&#xff0c;后面很多重要的数据结构都是依靠它来进行实现的。了解并且掌握它是很重要的。 目录 1.二叉树的介绍 1.1概念 1.2现实中的二叉树 1.3特殊的二叉…

Linux下 Socket服务器和客户端文件互传

目录 1.项目描述 2.函数准备 2.1 gets函数 2.2 popen函数、fread函数 2.3 access 函数 2.4 exit 函数 2.5 strtok 函数 2.6 chdir函数 3.项目代码 3.1服务器代码 3.2客户端代码 4.问题总结 1.项目描述 基于Soket聊天服务器&#xff0c;实现服务器和客户端的文件传输。…

Mendix如何实现导出文件

刚刚接触Mendix低代码两周&#xff0c;花了一周在b站看初级视频然后考完初级&#xff0c;第二周开始做个列表查询感觉照葫芦画瓢没啥难度。但最近要求写个导出列表数据&#xff0c;在mendix社区翻了翻&#xff0c;这个功能算是常见的。找了mendix官方提供的Docs磕磕盼盼才实现了…

双向交错CCM图腾柱无桥单相PFC学习仿真与实现(4)一些优化总结

前言 上一次说到单相的PFC硬件功能已经实现&#xff0c;THD3.15%满足了国标要求的范围&#xff0c;还是有优化的空间&#xff0c;目前系统设计的是6.6Kw&#xff0c;220V交流输出&#xff0c;400-800V直流输出。目前基本功能完成&#xff0c;但是还有很多细节需要优化&#xf…

科技驱动产业升级:浅谈制造型企业对MES系统的应用

在科技不断进步的背景下&#xff0c;制造型行业也在持续发展&#xff0c;但随之而来的挑战也不断增加。传统的管理方式已经无法满足企业的需求&#xff0c;因此许多制造型企业开始寻找新的管理模式。制造执行系统&#xff08;MES&#xff09;作为先进的制造信息技术之一&#x…

学会这几步,教你1分钟辨出B站优质UP主!

品牌想要投放某UP主&#xff0c;该如何判断UP主是否优质并且同品牌相匹配呢&#xff1f;运用这一套多维度的UP主评估方法 &#xff0c;帮助你高效判断&#xff0c;快来看看具体怎么操作吧&#xff01; 一、up主粉丝涨跌 有些广告主在判断UP主是否值得投放时&#xff0c;会陷入…

9.3.tensorRT高级(4)封装系列-自动驾驶案例项目self-driving-车道线检测

目录 前言1. 车道线检测总结 前言 杜老师推出的 tensorRT从零起步高性能部署 课程&#xff0c;之前有看过一遍&#xff0c;但是没有做笔记&#xff0c;很多东西也忘了。这次重新撸一遍&#xff0c;顺便记记笔记。 本次课程学习 tensorRT 高级-自动驾驶案例项目self-driving-车道…

工服穿戴检测联动门禁开关算法

工服穿戴检测联动门禁开关算法通过yolov8深度学习框架模型&#xff0c;工服穿戴检测联动门禁开关算法能够准确识别和检测作业人员是否按照规定进行工服着装&#xff0c;只有当人员合规着装时&#xff0c;算法会发送开关量信号给门禁设备&#xff0c;使门禁自动打开。YOLO的结构…

港陆证券:五日线破位怎么看?

在股票交易中&#xff0c;五日线是个重要的技术指标之一&#xff0c;它能够反映出最近的商场趋势。假如五日线破位&#xff0c;这意味着商场呈现了趋势反转&#xff0c;出资者需求注重趋势改动&#xff0c;并采取相应的出资战略。 首先&#xff0c;咱们来看看五日线破位的原因…

【算法与数据结构】654、LeetCode最大二叉树

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;【算法与数据结构】106、LeetCode从中序与后序遍历序列构造二叉树这两道题有些类似&#xff0c;相关代…

OLED透明屏原彩优势和特点解析:开创显示技术新时代

OLED透明屏 原彩作为一项领先的显示技术&#xff0c;正以其卓越的性能和创新的设计特点引起广泛关注。 本文将通过深入探讨OLED透明屏 原彩的优势和特点、应用领域、技术发展以及未来前景等方面内容&#xff0c;并结合具体数据、报告和行业动态&#xff0c;为读者提供专业可信…

解决DNS服务器未响应错误的方法

​当你将设备连接到家庭网络或具有互联网接入功能的Wi-Fi热点时,由于各种原因,互联网连接可能无法正常工作。本文中的说明适用于Windows 10、Windows 8和Windows 7。 无法连接到DNS服务器的原因 故障的一类与域名系统有关,域名系统是世界各地互联网提供商使用的分布式名称…

W5500-EVB-PICO进行MQTT连接订阅发布教程(十二)

前言 上一章我们用开发板通过SNTP协议获取网络协议&#xff0c;本章我们介绍一下开发板通过配置MQTT连接到服务器上&#xff0c;并且订阅和发布消息。 什么是MQTT&#xff1f; MQTT是一种轻量级的消息传输协议&#xff0c;旨在物联网&#xff08;IoT&#xff09;应用中实现设备…