机器学习算法:一文掌握 K近邻算法 的详细用法(2个案例可直接运行)

news2025/3/20 1:28:42

文章目录

    • 一、KNN 算法概述
      • 1.1 算法原理
      • 1.2 KNN 的优缺点
      • 1.3 K 值的选择
    • 二、Python 实现 KNN 案例
      • 2.1 使用 KNN 算法进行手写数字识别
      • 2.2 使用 Python 实现 KNN 分类
    • 三、总结

KNN(K-Nearest Neighbors,K近邻算法) 是一种简单且常用的分类和回归算法。它属于监督学习算法,基于实例的学习方法。KNN 的核心思想是:给定一个样本,找到训练集中与该样本最接近的 K 个样本,然后根据这 K 个样本的标签来预测当前样本的标签。

一、KNN 算法概述

1.1 算法原理

KNN 算法的步骤如下:
1、计算距离:计算待分类样本与训练集中每个样本的距离(通常使用欧氏距离、曼哈顿距离等)。
2、选择 K 个最近邻:根据距离排序,选择距离最近的 K 个样本。
3、投票或平均

  • 如果是分类问题,统计 K 个样本中每个类别的数量,选择数量最多的类别作为预测结果。
  • 如果是回归问题,计算 K 个样本的平均值作为预测结果。

4、输出结果:返回预测的类别或值。

1.2 KNN 的优缺点

优点

  • 简单易懂,易于实现。
  • 无需训练过程,直接基于数据计算。
  • 适用于多分类问题。

缺点

  • 计算复杂度高,尤其是当数据集很大时。
  • 对噪声数据和异常值敏感。
  • 需要选择合适的 K 值(K 值过小容易过拟合,K 值过大会导致欠拟合)。

1.3 K 值的选择

K 值的选择对 KNN 的性能有很大影响。
通常通过 交叉验证(Cross-Validation) 来选择最优的 K 值。
较小的 K 值对噪声敏感,较大的 K 值会平滑决策边界。

二、Python 实现 KNN 案例

2.1 使用 KNN 算法进行手写数字识别

import numpy as np
from sklearn.datasets import load_digits
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score

# 加载手写数字数据集
digits = load_digits()
X = digits.data
y = digits.target

# 将数据集划分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 创建KNN分类器,设置K值为5
knn = KNeighborsClassifier(n_neighbors=5)

# 训练模型
knn.fit(X_train, y_train)

# 对测试集进行预测
y_pred = knn.predict(X_test)

# 计算模型的准确率
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy}")

2.2 使用 Python 实现 KNN 分类

1. 导入库

import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score, classification_report

2. 加载数据集
这里使用经典的 Iris 数据集:

# 加载数据集
iris = load_iris()
X = iris.data  # 特征
y = iris.target  # 标签

3. 数据预处理
将数据集分为训练集和测试集,并进行标准化:

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 标准化特征
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

4. 训练 KNN 模型
使用 KNeighborsClassifier 训练模型:

# 创建 KNN 模型
knn = KNeighborsClassifier(n_neighbors=3)  # 选择 K=3

# 训练模型
knn.fit(X_train, y_train)

5. 预测与评估
使用测试集进行预测,并评估模型性能:

# 预测
y_pred = knn.predict(X_test)

# 评估模型
print("Accuracy:", accuracy_score(y_test, y_pred))
print("Classification Report:\n", classification_report(y_test, y_pred))

6. 完整代码

import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score, classification_report

# 加载数据集
iris = load_iris()
X = iris.data
y = iris.target

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 标准化特征
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

# 创建 KNN 模型
knn = KNeighborsClassifier(n_neighbors=3)

# 训练模型
knn.fit(X_train, y_train)

# 预测
y_pred = knn.predict(X_test)

# 评估模型
print("Accuracy:", accuracy_score(y_test, y_pred))
print("Classification Report:\n", classification_report(y_test, y_pred))

7. 运行结果
运行上述代码后,你会看到类似以下的输出:

Accuracy: 1.0
Classification Report:
               precision    recall  f1-score   support

           0       1.00      1.00      1.00        16
           1       1.00      1.00      1.00        14
           2       1.00      1.00      1.00        15

    accuracy                           1.00        45
   macro avg       1.00      1.00      1.00        45
weighted avg       1.00      1.00      1.00        45

三、总结

KNN算法作为一种简单而有效的分类和回归方法,在许多实际问题中都有广泛的应用。其核心思想是通过测量数据点之间的距离来进行预测,具有易理解、无需训练过程等优点。然而,KNN也存在计算量大、对特征缩放敏感等缺点。在实际应用中,合理选择K值、进行特征预处理以及利用高效的实现库(如Scikit-learn)可以充分发挥KNN的优势。

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

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

相关文章

「自动驾驶的数学交响曲:线性代数、微积分与优化理论的深度共舞」—— 解析人工智能背后的高阶数学工具链

引言 自动驾驶系统是数学工具链的集大成者。从传感器数据的多维空间映射到控制指令的生成,每一步都隐藏着线性代数、微积分、概率论和优化理论的精妙配合。本文将构建一个数学模型完整的自动驾驶案例,结合Python代码实现,揭示以下核心数学工具: 线性代数:张量运算与特征空…

调试 Rust + WebAssembly 版康威生命游戏

1. 启用 Panic 日志 1.1 让 Panic 信息显示在浏览器控制台 如果 Rust 代码发生 panic!(),默认情况下不会在浏览器开发者工具中显示详细的错误信息。这使得排查问题变得困难。 我们可以使用 console_error_panic_hook 这个 Rust crate,将 Panic 信息打…

VSCode通过SSH远程登录Windows服务器

系列 1.1 VSCode通过SSH远程登录Windows服务器 1.2 VSCode通过SSH免密远程登录Windows服务器 文章目录 系列1 准备工作2 远程服务器配置2.1 安装SSH服务器2.2 端口 3 本地电脑配置3.1 安装【Remote - SSH】。3.2 登录 1 准备工作 本地电脑Windows 11,已安装VS Cod…

qt下载和安装教程国内源下载地址

qt不断在更新中,目前qt6日渐成熟,先前我们到官方下载或者国内镜像直接可以下载到exe文件安装,但是最近几年qt官方似乎在逐渐关闭旧版本下载通道,列为不推荐下载。但是qt5以其广泛使用和稳定性,以及积累大量代码使得qt5…

mysql 到 doris 挪移数据

工具datax..... 下载地址:http://datax-opensource.oss-cn-hangzhou.aliyuncs.com/datax.tar.gz 下载以后解压:tar -xvzf datax.tar.gz 然后,理论上就可以直接使用了。但是,datax本身是python2写的,如果需要python3…

ubuntu系统下添加pycharm到快捷启动栏方法

一、背景 之前在ubuntu系统下使用pycharm时,总是要进入/home/dlut/pycharm-community-2022.1/bin文件夹下,然后终端执行命令下面的命令才可修改代码: ./pycharm.sh为了以后方便,这里给出添加pycharm到快捷启动栏的方法 二、添加…

开源:LMDB 操作工具:lmcmd

目录 什么是 LMDB为什么编写 lmcmd安装方法如何使用 连接数据库命令列表 小结 1. 什么是 LMDB LMDB(Lightning Memory-Mapped Database)是一种高效的键值存储数据库,基于内存映射(memory-mapping)技术,提供…

angular中的路由传参

目录 一、矩阵参数 一、矩阵参数 在angular中传参时可以使用矩阵参数,即直接通过变量值的形式在地址中体现,但需要注意参数的使用范围为当前路径段,而不是全局的查询参数。 const params {name: lhhh,age: 18,list: [{ name: htt }],}; //先…

AI时代下的心理咨询师新利器:心理咨询小程序

在AI技术日新月异的今天,心理咨询师们也需要与时俱进,借助新型工具来提升咨询效率和服务质量。正如一位优秀的厨师离不开一把锋利的菜刀,心理咨询师同样需要一款得力助手来辅助其工作。而心理咨询小程序,正是这样一款应运而生的工…

垃圾分类--环境配置

写在前面: 如果你们打这届比赛时,还有我们所保留的内存卡,那么插上即可运行(因为内存卡里我们已经配置好所有的环境) 本文提供两种环境的配置 一种是基于yolov8:YOLOv8 - Ultralytics YOLO Docshttps://d…

json字符串转对象,对象转JSON

背景: JSON字符串与对象之间的转换。在对接接口的数据的时候,因为是实时数据转发过来的。发现后端发过的数据是字符串【JSON字符串】但是我们前端需要的是一个对象。 核心代码: JSON.parse(JSON字符串) 效果展示: 接口JSON字符串转…

pandas中excel自定义单元格颜色

writerpd.ExcelWriter(filepathf05教师固定学生占比1月{today}.xlsx,engineopenpyxl) df.to_excel(writer,sheet_name明细) piv1.to_excel(writer,sheet_name1月分布) wswriter.book.create_sheet(口径) ws.cell(1,1).value综合占比: ws.cell(1,2).value固定学生占比…

3D标定中的平面约束-平面方程的几何意义

平面方程的一般形式为 AxByCzD0,其中系数 A、B、C、D共同决定了平面的几何特性。 系数对平面姿态的影响 1. 法向量方向2. 平面位置3. 比例关系4. 姿态变换5.平面空间变换 1. 法向量方向 法向量方向由 A、B、C 决定 核心作用:系数 A、B、C 构成的向量 (…

蓝桥杯第13届真题2

由硬件框图可以知道我们要配置LED 和按键 一.LED 先配置LED的八个引脚为GPIO_OutPut,锁存器PD2也是,然后都设置为起始高电平,生成代码时还要去解决引脚冲突问题 二.按键 按键配置,由原理图按键所对引脚要GPIO_Input 生成代码&a…

Linux-03 删除ubuntu系统文件夹Videos和Templates后,如何恢复

文章目录 问题解决方法1. 重新创建 Videos 和 Templates 文件夹2. 配置 user-dirs.dirs 文件3. 更新用户目录配置xdg-user-dirs-update4. 重启系统:sudo reboot 问题 手欠的嫌弃Videos和Templates文件夹是空的,也不会用,就删除了&#xff0c…

Linux系统移植篇(十)根文件系统构建 V3 - Yocto

可以简单的将 Ubuntu 理解为一个根文件系统,和我们用 busybox、buildroot 制作的根文件系统一样。因此移植Ubuntu也就是将Ubuntu根文件系统移植到我们的开发板上,但是因为 I.MX6ULL 孱弱的性能,本章我们就只移植 Ubuntu 的最小根文件系统&…

E902基于bash与VCS的仿真环境建立

网上看见很多E902仿真的文章,但用到的编译器是类似于这种Xuantie-900-gcc-elf-newlib-x86_64-V3.0.1-20241120,而我按照相应的步骤与对应的编译器,仿真总会报错。后面将编译器换成riscv64-elf-x86_64-20210512,反而成功了。现在开…

Pycharm接入DeepSeek,提升自动化脚本的写作效率

一.效果展示: 二.实施步骤: 1.DeepSeek官网创建API key: 创建成功后,会生成一个API key: 2. PyCharm工具,打开文件->设置->插件,搜索“Continue”,点击安装 3.安装完成后&…

Windows安装Apache Maven 3.9.9

第一步下载资源 官网:下载 Apache Maven – Maven 环境变量配置 M2_HOME 指向bin目录 MAVEN_HOME 指向根目录 M2_HOME 不确定是否必须要 Path配置 ,需要注意MAVEN顺序应当在java之前 验证是否安装成功,在cmd中以管理员方式打开&#xff0c…

jmeter将返回的数据写入csv文件

举例说明,我需要接口返回体中的exampleid与todoid的数据信息(使用边界提取器先将其提取),并将其写入csv文件进行保存 使用后置处理器BeanShell 脚本实例如下 import java.io.*;// 设置要写入的文件路径 String filePath "…