2.机器学习-K最近邻(k-Nearest Neighbor,KNN)分类算法原理讲解

2️⃣机器学习-K最近邻(k-Nearest Neighbor,KNN)分类算法原理讲解

  • 个人简介
  • 一·算法概述
  • 二·算法思想
      • 2.1 KNN的优缺点
  • 三·实例演示
      • 3.1电影分类
      • 3.2使用KNN算法预测 鸢(yuan)尾花 的种类
      • 3.3 预测年收入是否大于50K美元

个人简介

🏘️🏘️个人主页:以山河作礼。
🎖️🎖️:Python领域新星创作者,CSDN实力新星认证,CSDN内容合伙人,阿里云社区专家博主,新星计划导师,在职数据分析师。
🎉🎉免费学习专栏

1. 《Python基础入门》——0基础入门
2.《Python网络爬虫》——从入门到精通
3.《Web全栈开发》——涵盖了前端、后端和数据库等多个领域

💕💕悲索之人烈焰加身,堕落者不可饶恕。永恒燃烧的羽翼,带我脱离凡间的沉沦。

一·算法概述

K-最近邻算法(K-Nearest Neighbor,简称KNN)是一种基于实例学习的算法,可以应用于分类和回归任务。作为一种非参数算法KNN不对数据分布做任何假设,而是直接使用数据中的最近K个邻居的标签来预测新数据点的标签

在KNN算法中,每个数据点都可以表示为一个n维向量,其中n是特征的数量。对于一个新的数据点,KNN算法会计算它与每个训练数据点之间的距离,并选择最近的K个训练数据点。对于分类问题,KNN算法会将这K个训练数据点中出现最多的类别作为预测结果。而对于回归问题,KNN算法会将这K个训练数据点的输出值的平均值作为预测结果。

在KNN算法中,K的取值是一个超参数,需要根据数据集的特点和算法的性能进行选择。通常情况下,较小的K值可以使模型更复杂,更容易受到噪声的影响,而较大的K值可以使模型更简单、更稳定,但可能会导致模型的欠拟合。因此,选择合适的K值对于KNN算法的性能至关重要。
在这里插入图片描述

二·算法思想

KNN(K-最近邻)算法是一种基于实例的分类方法,通过计算不同特征值之间的距离来进行分类

1️⃣其核心思想是
如果一个样本在特征空间中的k个最邻近的样本中的大多数属于某一个类别,则该样本也划分为这个类别。KNN算法中,所选择的邻居都是已经正确分类的对象。该方法在定类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。

2️⃣ KNN算法的主要步骤如下

  1. 确定k值,即选取多少个最近邻居参与投票。
  2. 计算待分类样本与已知分类样本之间的距离,通常使用欧氏距离作为距离度量。
  3. 对距离进行排序,找出最近的k个邻居。
  4. 统计这k个邻居中各个类别的数量,将数量最多的类别作为待分类样本的类别。

3️⃣KNN算法涉及3个主要因素
实例集、距离或相似的衡量、k的大小。实例集是指已知分类的样本集合;距离或相似的衡量是指计算样本之间距离的方法,如欧氏距离;k的大小是指选取多少个最近邻居参与投票,k值的选择会影响分类结果的准确性。

一个实例的最近邻是根据标准欧氏距离定义的。更精确地讲,把任意的实例x表示为下面的特征向量:
在这里插入图片描述

其中ar(x)表示实例x的第r个属性值。那么两个实例xi和xj间的距离定义为d(xi,xj),其中:

在这里插入图片描述

在这里插入图片描述

2.1 KNN的优缺点

1️⃣K-最近邻算法(KNN)的优点

简单易懂:KNN算法的原理和实现都非常简单,容易理解和掌握。
非参数化:KNN是一种非参数化算法,不需要对数据分布做任何假设。
对异常值不敏感:KNN能够有效处理包含异常值的数据。
多用途:适用于分类和回归问题。
高维数据处理:可以处理高维特征空间的数据。
非线性问题处理:能够适应非线性的数据分布。
高度可解释性:结果直观,易于解释。

2️⃣KNN算法的缺点

效率低:在大型数据集上计算距离时效率较低,尤其是在高维数据中。
对噪声敏感:训练数据中的噪声可能影响最近邻的选择,导致预测结果不准确。
K值选择:K值的选择对算法性能有很大影响,需要通过实验来确定最佳值。
距离度量:选择合适的距离度量方法对算法性能至关重要。
特征缩放敏感:需要对特征进行归一化或标准化,否则可能导致某些特征过于主导。
缺失值处理:处理缺失值较为困难,需要采取特定策略来应对。
解释性差:由于是基于实例的预测,相对于其他模型来说解释性较差。

三·实例演示

3.1电影分类

1.导入数据分析三剑客

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

2.导入KNN算法

# 谷歌的机器学习库 
from sklearn.neighbors import KNeighborsClassifier

3.导入warnings模块,并设置警告过滤器为忽略所有警告

import warnings
warnings.filterwarnings(action='ignore')

4.使用电影数据

movies = pd.read_excel('../data/movies.xlsx',sheet_name=1)
movies

在这里插入图片描述

#  有标签的:有监督学习# 训练数据
# x_train,y_train # 测试数据
# x_test,y_test# data  : x特征数据
# target :y标签数据
data = movies[['武打镜头','接吻镜头']]
data # 二维target = movies.分类情况
target  # 一维

在这里插入图片描述

KNN模型
1.创建模型

# n_neighbors=5, k值  k = 5
# p = 2 距离算法,p=2表示欧氏距离 ,p = 1 表示曼哈顿距离
# 
knn = KNeighborsClassifier(n_neighbors=5,p=2)

2.训练

knn.fit(data,target)

3.预测

# 自己提供测试数据,训练数据和测试数据列得相同,行可以不同x_test=np.array([[20,1],[0,20],[10,10],[33,2],[2,13]])
x_test = pd.DataFrame(x_test,columns= data.columns)
y_test = np.array(['动作片','爱情片','爱情片','动作片','爱情片'])
y_pred = knn.predict(x_test)
y_pred

在这里插入图片描述
4.得分 ,准确率
在这里插入图片描述

3.2使用KNN算法预测 鸢(yuan)尾花 的种类

在这里插入图片描述

1.导入数据分析三剑客

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

2.导入KNN算法

# 谷歌的机器学习库 
from sklearn.neighbors import KNeighborsClassifier

3.导入warnings模块,并设置警告过滤器为忽略所有警告

import warnings
warnings.filterwarnings(action='ignore')

4.得到鸢尾花数据

from sklearn.datasets import load_iris
# return_X_y=True  只返回data和target
#  data,target = load_iris(return_X_y=True)

5.使用sklearn库中的load_iris()函数加载鸢尾花数据集,并将数据集分为数据(data)、目标(target)、目标名称(target_names)、特征名称(feature_names)四个部分。

iris = load_iris()
data = iris['data']
target = iris['target']
target_names = iris['target_names']
feature_names = iris['feature_names']
df = pd.DataFrame(data,columns=feature_names)
df

在这里插入图片描述

6.拆分数据集
把data和target取一部分作为测试数据,剩下的作为训练数据
从sklearn库的model_selection模块中导入train_test_split函数,该函数用于将数据集划分为训练集和测试集。

from sklearn.model_selection import train_test_split 
# test_size
# 整数:测试数据的数量
# 小数:测试数据的占比,一般比较小,0.2,0.3x_train, x_test, y_train, y_test = train_test_split(data,target,test_size=0.2)
x_train.shape, x_test.shape
# y_test 表示测试数据的真实结果
# y_pred:表示测试数据的预测结果

7.使用KNN算法

knn = KNeighborsClassifier()
knn.fit(x_train, y_train)
knn.score(x_test,y_test)
#0.33 
#0.7以上:得分正常
#0.8以上:比较好
#0.9以上:非常好

在这里插入图片描述

3.3 预测年收入是否大于50K美元

1.导入数据分析三剑客

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

2.导入KNN算法

# 谷歌的机器学习库 
from sklearn.neighbors import KNeighborsClassifier

3.导入warnings模块,并设置警告过滤器为忽略所有警告

import warnings
warnings.filterwarnings(action='ignore')读取adults.csv文件,最后一列是年收入,并使用KNN算法训练模型,然后使用模型预测一个人的年收入是否大于50```python
adults = pd.read_csv('../data/adults.csv')
adults

在这里插入图片描述

4.获取年龄age、教育程度education、职位workclass、每周工作时间hours_per_week 作为机器学习数据 获取薪水作为对应结果

data = adults[['age','education','workclass','hours_per_week']].copy()
target = adults['salary']

5.数据转换,将String/Object类型数据转换为int,用0,1,2,3…表示
使用factorize()函数

data['education'] = data['education'].factorize()[0]
data['workclass'] = data['workclass'].factorize()[0]
data

在这里插入图片描述
6.拆分数据集:训练数据和预测数据

x_train,x_test,y_train,y_test = train_test_split(data,target,test_size=0.2)
x_train

在这里插入图片描述

7.使用KNN算法

knn = KNeighborsClassifier()
knn.fit(x_train,y_train)
knn.score(x_test,y_test)

在这里插入图片描述

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

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

相关文章

android 导航app 稳定性问题总结

一 重写全局异常处理: 1 是过滤掉一些已知的无法处理的 问题,比如TimeoutException 这种无法根除只能缓解的问题可以直接catch掉 2 是 一些无法继续的问题可以直接杀死重启,一些影响不是很大的,可以局部还原 比如: p…

题记(23)--整除问题

目录 一、题目内容 二、输入描述 三、输出描述 四、输入输出示例 五、完整C语言代码 一、题目内容 给定n&#xff0c;a求最大的k&#xff0c;使n&#xff01;可以被a^k整除但不能被a^(k1)整除。 二、输入描述 两个整数n(2<n<1000)&#xff0c;a(2<a<1000) 三、…

实时流媒体传输开源库——Live555

Live555&#xff08;LiveMedia Libraries&#xff09;是一个开源的多媒体流处理库&#xff0c;主要用于实现基于标准网络协议的实时流媒体传输。Live555提供了一套 C 类库&#xff0c;可以用于开发支持 RTP/RTCP、RTSP、SIP 等协议的流媒体服务器和客户端应用程序。它广泛用于视…

flink部署模式介绍

在一些应用场景中&#xff0c;对于集群资源分配和占用的方式&#xff0c;可能会有特定的需求。Flink 为各种场景提供了不同的部署模式&#xff0c;主要有以下三种&#xff0c;它们的区别主要在于&#xff1a; 集群的生命周期以及资源的分配方式&#xff1b;应用的 main 方法到…

XXL-Job的搭建接入Springboot项目(详细)

一、XXL-Job介绍 XXL-Job 是一款开源的分布式任务调度平台&#xff0c;由 Xuxueli&#xff08;徐雪里&#xff09;开发。它基于 Java 技术栈&#xff0c;提供了一套简单易用、高可靠性的任务调度解决方案。 XXL-Job 的主要作用是帮助开发者实现定时任务的调度和执行。它可以用…

OpenCvSharp 通道拆分、空间转换

通道拆分、空间转换 通道拆分 //通道拆分&#xff08;BGR&#xff09; Mat[] BGR Cv2.Split(src); //通道合并 Mat dst new Mat(); Cv2.Merge(BGR, dst);空间转换 //BGR转灰度图 Mat dst new Mat(); Cv2.CvtColor(src, dst , ColorConversionCodes.BGR2GRAY); Cv2.ImShow…

MySQL 深度分页

文章目录 一、深度分页二、测试数据三、分页策略3.1 默认分页3.2 索引分页3.3 子查询3.4 延迟关联 一、深度分页 MySQL 深度分页是指在分页查询数据量比较大的表时&#xff0c;需要访问表中的某一段数据&#xff0c;而这段数据的位置非常靠后&#xff0c;需要通过较大的 offse…

2024年轻人返乡创业潮,外卖平台市场需求是怎么样的?

目前&#xff0c;县域经济正面临着几大利好。“返乡就业、返乡创业和告老还乡”现象越发普遍&#xff0c;这不仅在小县城中有所体现&#xff0c;同样在乡镇中也呈现出同样的趋势。一些产业链和工厂纷纷下沉到乡镇&#xff0c;带来了更多的就业机会。这不仅能够吸引年轻人回乡就…

Spring Boot 4.0:构建云原生Java应用的前沿工具

目录 前言 Spring Boot简介 Spring Boot 的新特性 1. 支持JDK 17 2. 集成云原生组件 3. 响应式编程支持 4. 更强大的安全性 5. 更简化的配置 Spring Boot 的应用场景 1. 云原生应用开发 2. 响应式应用程序 3. 安全性要求高的应用 4. JDK 17的应用 总结 作…

【Java万花筒】代码安全护航:Java自动化测试与BDD

自动化测试与行为驱动开发&#xff08;BDD&#xff09;库&#xff1a; 前言 在当今软件开发领域&#xff0c;自动化测试和行为驱动开发&#xff08;BDD&#xff09;已经成为确保软件质量和可维护性的不可或缺的一部分。Java开发者可以借助多种库和框架来实现自动化测试&#…

CRM系统--盘点五大CRM客户管理系统

在当今市场经济中&#xff0c;销售工作的重要性日益凸显&#xff0c;有效的客户管理成为了提升销售业绩的关键因素。面对日新月异的市场环境和客户需求的多样化&#xff0c;销售人员通常会面临以下问题&#xff1a; 接到了新的销售任务&#xff0c;该如何选择和确定目标客户&am…

什么是线程?线程和进程有什么区别?在Java中如何创建线程?你能解释一下Java中的synchronized关键字吗?

什么是线程&#xff1f;线程和进程有什么区别&#xff1f; 线程是操作系统进行运算调度的最小单位&#xff0c;它是进程中的实际运作单位。线程自己不拥有系统资源&#xff0c;只拥有一点在运行中必不可少的资源&#xff0c;但它可与同属一个进程的其它线程共享进程所拥有的全部…

API协议设计的十种技术

文章目录 前言一、REST二、GraphQL三、gRPC&#xff08;google Remote Procedure Calls&#xff09;四、Webhooks五、服务端的事件发送——SSE&#xff08;Server-sent Events&#xff09;六、EDI&#xff08;Electronic Data Interchange&#xff09;七、面向API 的事件驱动设…

Visual Studio2022实用使用技巧集

前言 对于.NET开发者而言Visual Studio是我们日常工作中比较常用的开发工具&#xff0c;掌握一些Visual Studio实用的搜索、查找、替换技巧可以帮助我们大大提高工作效率从而避免996。 Visual Studio更多实用技巧 https://github.com/YSGStudyHards/DotNetGuide 代码和功能搜…

Verilog基础:强度建模与net型信号的多驱动问题(三)

相关阅读 Verilog基础https://blog.csdn.net/weixin_45791458/category_12263729.html?spm1001.2014.3001.5482 四、一般情况下的net型信号的线与组合&#xff08;线网多驱动&#xff09; 在Verilog基础&#xff1a;强度建模与net型信号的多驱动问题&#xff08;二&#xff0…

如何在Linux部署JumpServer堡垒机并实现远程访问本地服务

文章目录 前言1. 安装Jump server2. 本地访问jump server3. 安装 cpolar内网穿透软件4. 配置Jump server公网访问地址5. 公网远程访问Jump server6. 固定Jump server公网地址 前言 JumpServer 是广受欢迎的开源堡垒机&#xff0c;是符合 4A 规范的专业运维安全审计系统。JumpS…

如何使用支付宝沙箱环境本地配置模拟支付并结合内网穿透远程调试

文章目录 前言1. 下载当面付demo2. 修改配置文件3. 打包成web服务4. 局域网测试5. 内网穿透6. 测试公网访问7. 配置二级子域名8. 测试使用固定二级子域名访问 正文开始前给大家推荐个网站&#xff0c;前些天发现了一个巨牛的 人工智能学习网站&#xff0c; 通俗易懂&#xff…

如何自己实现一个Spring Boot Starter

现在很多开源的组件都会提供对应的 springboot-starter 包给我们去用&#xff0c;要做一个 starter 包并不难。参照Spring内置的实现就好了&#xff1a; 1、在工程里引入 starter 打包相关的依赖。 2、在我们工程内建 spring.factories 文件&#xff0c;编写我们配置类的全限类…

使用代理加速docker pull

创建配置目录和文件 docker pull是由守护进程dockerd执行&#xff0c;因此代理需添加在dockerd的systemd配置中。 sudo mkdir -p /etc/systemd/system/docker.service.d sudo touch /etc/systemd/system/docker.service.d/proxy.conf编辑proxy.conf文件 [Service] Environme…

ubuntu源码安装MySQL

mysql下载路径 创建新数组 mysql sudo groupadd mysql# 创建用户 mysql ,指定属组为 mysql&#xff0c;禁止其登录 # --no-create-home选项&#xff0c;创建用户时不会自动创建主目录 sudo adduser --system --no-create-home --ingroup mysql --shell /sbin/nologin mysql创…