算法金 | 再见!!!KNN


大侠幸会,在下全网同名「算法金」 0 基础转 AI 上岸,多个算法赛 Top 「日更万日,让更多人享受智能乐趣」

KNN算法的工作原理简单直观,易于理解和实现,这使得它在各种应用场景中备受青睐。

我们将深入探讨KNN算法,从基本概念到实现细节,从算法优化到实际应用,我们都会一一展开。通过本文,你将了解到KNN算法的核心要点,以及如何将这一强大的工具应用到实际问题中。

第一部分:KNN算法的基本概念

定义

KNN算法,全称为K-Nearest Neighbors,是一种基于实例的学习算法,或者说是一种基于记忆的学习方法。它的核心思想是,通过一个样本的K个最近邻居的多数属于某个类别,来预测该样本的类别。

工作原理

KNN算法通过以下步骤进行分类或回归:

  1. 确定距离度量:首先确定一个距离度量方法,如欧氏距离或曼哈顿距离。
  2. 寻找最近邻居:计算待分类样本与数据集中每个样本的距离,并找出距离最近的K个样本。
  3. 决策:在分类任务中,通过多数投票法决定待分类样本的类别;在回归任务中,则通过计算K个最近邻居的属性的平均值来预测。

算法特点

KNN算法具有以下显著特点:

  • 简单性:算法原理简单,易于理解和实现。
  • 无需训练:不需要训练阶段,直接使用整个数据集进行预测。
  • 自适应性:随着数据集的变化,KNN算法可以自适应地调整其预测结果。

第二部分:KNN算法的工作原理

距离度量

在KNN算法中,距离度量是确定样本之间相似性的关键。以下是几种常用的距离度量方法:

寻找最近邻居

确定一个样本的K个最近邻居涉及以下步骤:

  1. 计算距离:对于数据集中的每个点,使用选定的距离度量计算与待分类样本的距离。
  2. 排序:根据计算出的距离对所有点进行排序。
  3. 选择邻居:选择距离最小的前K个点作为最近邻居。

多数投票法(分类任务)

在分类任务中,KNN算法通过以下步骤进行决策:

  1. 收集标签:收集K个最近邻居的类别标签。
  2. 统计:统计每个类别的出现次数。
  3. 投票:选择出现次数最多的类别作为待分类样本的预测类别。

平均值法(回归任务)

在回归任务中,KNN算法预测一个连续值,通常通过以下步骤:

  1. 收集属性值:收集K个最近邻居的属性值。
  2. 计算平均值:计算这些属性值的平均值。
  3. 预测:将平均值作为待分类样本的预测结果。

第三部分:KNN算法的优缺点

优点

  1. 易于理解和实现:KNN算法的原理简单直观,易于理解,且实现起来相对容易。
  2. 不需要训练阶段:由于KNN算法在预测时直接使用整个数据集,因此它不需要一个专门的训练阶段。
  3. 自适应性强:KNN算法能够随着数据集的更新而更新,能够适应数据的变化。
  4. 可用于非线性问题:KNN算法不假设数据的分布,因此可以用于非线性问题的分类和回归。

缺点

  1. 计算密集型:由于在每次预测时都需要计算新样本与所有训练样本之间的距离,KNN算法在大数据集上可能变得非常慢。
  2. 存储需求高:KNN算法需要存储全部数据集,因此对内存的需求较高。
  3. 维数灾难:随着特征维度的增加,距离度量可能会变得不那么有效,导致所谓的“维数灾难”。
  4. 对不平衡数据敏感:KNN算法对类别不平衡的数据集比较敏感,少数类可能会被多数类所淹没。
  5. 对噪声敏感:KNN算法对噪声数据点比较敏感,噪声点可能会对预测结果产生较大影响。

第四部分:KNN算法的适用场景与局限性

适用场景

  1. 小规模数据集:KNN算法在小规模数据集上表现良好,因为它不需要复杂的训练过程。
  2. 基线模型:作为基线模型,KNN算法可以快速提供一个简单的性能标准,用于与其他更复杂的模型进行比较。
  3. 实时决策:由于KNN算法不需要预先训练,它可以用于需要快速响应的实时决策场景。
  4. 低维数据:在特征维度不是非常高的情况下,KNN算法能够很好地工作,因为它依赖于距离度量。

局限性

  1. 高计算成本:对于大规模数据集,KNN算法在预测时的计算成本非常高。
  2. 内存消耗:由于需要存储整个数据集,KNN算法对内存的需求可能会很大。
  3. 数据不平衡问题:当数据集中某些类别的样本数量远多于其他类别时,KNN算法可能会倾向于预测多数类。
  4. 噪声敏感性:KNN算法对异常值和噪声点比较敏感,这可能会影响其预测的准确性。

第五部分:KNN算法的实现与案例

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import load_iris# 加载内置的Iris数据集
iris = load_iris()
X = iris.data
y = iris.target
target_names = iris.target_names# 数据标准化
scaler = StandardScaler()
X = scaler.fit_transform(X)# 数据可视化(选择前两个特征进行可视化)
plt.figure(figsize=(10, 6))
for i, label in enumerate(target_names):plt.scatter(X[y == i, 0], X[y == i, 1], label=label)
plt.xlabel('特征 1 (标准化)')
plt.ylabel('特征 2 (标准化)')
plt.title('Iris 数据分布')
plt.legend()
plt.show()# 划分数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)# 选择最佳K值
best_k = 1# 使用最佳K值训练模型
best_knn = KNeighborsClassifier(n_neighbors=best_k)
best_knn.fit(X_train, y_train)
accuracy = best_knn.score(X_test, y_test)
print(f"测试集上的准确率: {accuracy:.2f}")# 可视化测试结果(选择前两个特征进行可视化)
plt.figure(figsize=(10, 6))
y_pred = best_knn.predict(X_test)
for i, label in enumerate(target_names):plt.scatter(X_test[y_test == i, 0], X_test[y_test == i, 1], label=f'真实: {label}')
for i, label in enumerate(target_names):plt.scatter(X_test[y_pred == i, 0], X_test[y_pred == i, 1], marker='x', label=f'预测: {label}')
plt.xlabel('特征 1 (标准化)')
plt.ylabel('特征 2 (标准化)')
plt.title('测试集上的预测结果')
plt.legend()
plt.show()

看运行输出,还是挺强的

第六部分:如何选择K值

选择合适的K值是KNN算法性能的关键因素之一,如下图不同的 K值,K=3 和 K=7 结果就不一样了。

以下是一些选择K值的策略:

经验法则

选择K值时,可以遵循一些经验法则:

  • 对于分类问题,K通常是奇数,以避免平票的情况。
  • K值通常小于20,并且与数据集中的样本数量成反比。

交叉验证

交叉验证是一种更系统的方法来确定最佳的K值。以下是步骤:

  1. 划分数据:将数据集划分为训练集和测试集。
  2. 循环选择K值:对一系列可能的K值进行循环。
  3. 训练和评估:对于每个K值,使用训练集训练KNN模型,并在测试集上评估其性能。
  4. 选择最佳K值:选择在测试集上表现最好的K值。

以下是使用交叉验证选择K值的Python代码示例:

from sklearn.model_selection import cross_val_score# 可能的K值列表
k_values = list(range(1, 21))
accuracies = []for k in k_values:knn = KNeighborsClassifier(n_neighbors=k)# 使用交叉验证评估模型性能accuracy = cross_val_score(knn, X, y, cv=10).mean()accuracies.append(accuracy)# 找到最佳K值
best_k = k_values[np.argmax(accuracies)]
print(f"最佳K值为:{best_k}")

数据集大小与K值的关系

  • 小数据集:选择较小的K值,因为数据点较少,每个点的影响较大。
  • 大数据集:可以选择较大的K值,因为数据点较多,每个点的影响较小。

运行后输出

啊这,各种类别交织在一起 看起来密集恐惧症都要犯了

  • 这段代码生成了一张散点图,不同门派用不同颜色表示,展示了内力和速度的标准化分布。
  • 通过循环选择不同的 K 值进行交叉验证,找到表现最好的 K 值.这张图展示了不同 K 值下的交叉验证准确率,可以看到在 K=4 时准确率最高。
  • 我们使用最佳 K 值(K=4)训练模型,并在测试集上进行预测和可视化,这张图展示了测试集上真实标签和预测标签的对比(略)
  • 模型的预测准确率较低,这主要是数据集的问题,数据类别见区分度太低了,感兴趣的大侠可以试着调一下,怎么可以获得更高的准确率。期待能在评论区见

第七部分:KNN算法的优化策略

为了提高KNN算法的性能和适用性,我们可以采取以下几种优化策略:

距离度量的选择

选择适当的距离度量对于KNN算法至关重要。根据数据的特性,可以选择不同的度量方法:

权重分配

在标准KNN中,所有邻居对预测结果的贡献是相等的。然而,我们可以根据距离的远近来分配权重,使得更近的邻居对预测结果有更大的影响。权重可以按照以下公式计算:

降维技术

高维数据会加剧“维数灾难”,导致KNN算法性能下降。使用降维技术如主成分分析(PCA)可以减少特征维度,同时保留数据的主要信息:

from sklearn.decomposition import PCA# 应用PCA进行降维
pca = PCA(n_components=2)  # 假设我们只保留两个主成分
X_pca = pca.fit_transform(X)# 现在使用降维后的数据训练KNN模型
knn = KNeighborsClassifier(n_neighbors=3)
knn.fit(X_pca, y)

其他优化方法

  • 使用不同的距离权重:根据问题的特性,可以为不同的特征赋予不同的距离权重。
  • 动态选择K值:根据样本的局部密度动态调整K值,以适应数据的不均匀分布。

第八部分:KNN算法与其他算法的比较

在机器学习领域,选择正确的算法对于解决特定问题至关重要。KNN算法因其简单性和直观性而广受欢迎,但与其他算法相比,它也有其局限性。以下是KNN算法与几种常见算法的比较:

与决策树的比较

  • 决策树:是一种监督学习算法,可以用于分类和回归。它通过学习简单的决策规则从数据特征中推断出目标值。
  • 优点:易于理解和解释,可以处理分类和回归问题,对噪声数据具有一定的鲁棒性。
  • 缺点:容易过拟合,对于不平衡的数据集表现不佳。

与支持向量机(SVM)的比较

  • 支持向量机:是一种强大的分类器,也可以用于回归问题(称为SVR)。它通过找到数据点之间的最优边界来区分不同的类别。
  • 优点:在高维空间中表现良好,对于线性和非线性问题都有解决方案。
  • 缺点:参数选择(如惩罚参数C和核函数)对性能影响很大,计算复杂度较高。

与随机森林的比较

  • 随机森林:是一种集成学习方法,由多个决策树组成。它通过构建多个树并进行投票来提高模型的准确性和鲁棒性。
  • 优点:通常比单个决策树更准确,能够处理高维数据,对过拟合有一定的抵抗力。
  • 缺点:模型可解释性较差,训练时间可能较长。

不同场景下算法选择的建议

  • 数据集大小:对于小数据集,KNN和决策树可能更合适;对于大数据集,考虑使用SVM或随机森林。
  • 数据维度:对于低维数据,KNN可以表现良好;对于高维数据,SVM或随机森林可能更合适。
  • 模型解释性:如果需要模型具有较高的解释性,决策树可能是更好的选择。
  • 计算资源:如果计算资源有限,应考虑使用计算成本较低的算法,如KNN或决策树。

[ 抱个拳,总个结 ]

在本文中,我们深入探讨了KNN算法的各个方面,从基本概念到实现细节,再到优化策略和与其他算法的比较。KNN算法以其简单直观的原理、易于实现的特点以及在小规模和低维数据集上的良好性能,确立了其在机器学习领域中的重要地位。

核心要点总结:

  • 定义:KNN是一种基于实例的分类和回归算法,通过查找测试样本的K个最近邻居来进行预测。
  • 工作原理:算法利用距离度量来确定最近邻居,并通过多数投票法或平均值法来进行决策。
  • 优点:易于理解和实现,不需要训练阶段,自适应性强。
  • 缺点:计算密集型,存储需求高,对不平衡数据和噪声敏感。
  • 适用场景:小规模数据集,基线模型,实时决策,低维数据。
  • 优化策略:包括选择合适的距离度量,权重分配,以及应用降维技术。

KNN算法虽然简单,但在许多实际应用中表现出色,尤其是在数据集较小且特征维度较低的情况下。然而,它也存在一些局限性,如高计算成本和对噪声的敏感性,这要求我们在应用时需要谨慎考虑。

[ 算法金,碎碎念 ]

全网同名,日更万日,让更多人享受智能乐趣

如过觉得内容有价值,烦请大侠多多 分享、在看、点赞,助力算法金又猛又持久、很黄很 BL 的日更下去;

同时邀请大侠 关注、星标 算法金,围观日更万日,助你功力大增、笑傲江湖

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

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

相关文章

Easy 同学:AI 时代将加速计算机专业和程序员职业的分化

一、原贴 2024 年 6 月 5 日 拥有 60多万粉丝的方糖气球(ftqq.com)博主 、独立开发者:Easy 发表了一篇 AI 对计算机专业和程序员行业影响的新浪博客,看后很有启发,故而将原文摘录于此: 单独开个贴说一下吧…

文心一言 VS 讯飞星火 VS chatgpt (275)-- 算法导论20.3 2题

二、修改 vEB 树以支持带有卫星数据的关键字。如果要写代码,请用go语言。 文心一言: vEB 树(van Emde Boas 树)是一种用于处理稀疏位集合的高效数据结构,它允许在常数时间内执行查找、插入、删除和前驱/后继操作。然…

6.更复杂的光照

一、Unity的渲染路径 渲染路径决定了光照是如何应用到Unity Shader中的。我们需要为每个Pass指定它使用的渲染路径 如何设置渲染路径? Edit>Project Settings>Player>Other Settinigs>Rendering 如何使用多个渲染路径?如:摄像…

Vuex 4与状态管理实战指南

title: Vuex 4与状态管理实战指南 date: 2024/6/6 updated: 2024/6/6 excerpt: 这篇文章介绍了使用Vuex进行Vue应用状态管理的最佳实践,包括为何需要状态管理,Vuex的核心概念如store、actions、mutations和getters,以及如何处理异步操作和模…

网工内推 | 网络运维工程师,H3CIE认证优先,13薪,享股票期权

01 畅读 🔷招聘岗位:高级网络运维工程师 🔷职责描述: 1.负责线上业务网络技术运维工作,保障并优化线上网络质量; 2.规划并构建公司线上业务网络架构; 3.规划线上业务网络质量评估与监控体系&…

USB (1)

再看USB 其实回过头看USB 是可以和无线 有线(internet) 可以和PCIe 甚至AXI类比的 它们共通处在于都是communication 有限通信 有7层网络协议 在USB也是分层的 不同的协议,依赖的介质不一样 这就要求相应的Physical层处理 USB的physical层是基于Serdes的,所以有串并/并串的…

找寻卓越的生成式人工智能应用案例?别浪费在无趣之处!

“ 生成式AI(AI)技术的强大众所周知。但不知道你们是否和我有一样感觉,目前市面上,企业对生成式AI的应用,场景大多较为单一。” Ingo Mierswa Altair产品开发高级副总裁 我说这些生成式AI的应用单一,是指…

让你工作效率飞起的五款软件

🌟 No.1:亿可达 作为一款自动化工具,亿可达被誉为国内版的免费Zaiper。它允许用户无需编程知识即可将不同软件连接起来,构建自动化的工作流程。其界面设计清新且直观,描述语言简洁易懂,使得用户可以轻松上…

【数据结构与算法 经典例题】反转链表(图文详解)

💓 博客主页:倔强的石头的CSDN主页 📝Gitee主页:倔强的石头的gitee主页 ⏩ 文章专栏:《数据结构与算法 经典例题》C语言 期待您的关注 ​ 目录 一、问题描述 二、解题思路分析 三、代码实现 一、问题描述 二、解题…

⾃动化批量管理-Ansible

目录 一、ansible 简介 自动化工具选择 (了解)​编辑 1、ansible 是什么? 2、ansible 特点 3、ansible 架构图 二、ansible 任务执行 1、ansible 任务执行模式 2、ansible 执行流程 3、ansible 命令执行过程 三、ansible 配置详解 …

一文看懂Llama 2:原理、模型与训练

一文看懂Llama 2:原理、模型与训练 Llama 2是一种大规模语言模型(LLM),由Meta(原Facebook)研发,旨在推动自然语言处理(NLP)领域的发展。本文将详细介绍Llama 2的原理、模…

echaerts图例自动滚动并隐藏翻页按钮

效果图 代码 legend: {itemHeight: 14,itemWidth: 14,height: "300", //决定显示多少个// 通过 CSS 完全隐藏翻页按钮pageButtonItemGap: 0,pageButtonPosition: end,pageIconColor: transparent, // 隐藏翻页按钮pageIconInactiveColor: transparent, // 隐藏翻页按…

数据资产入表-数据治理-指标建设标准

前情提要:数据价值管理是指通过一系列管理策略和技术手段,帮助企业把庞大的、无序的、低价值的数据资源转变为高价值密度的数据资产的过程,即数据治理和价值变现。上一讲介绍了标签标准设计的基本逻辑和思路。数据资产入表-数据治理-标签设计…

【外汇天眼】胜率提升秘籍:洞悉外汇市场五大参与者的角色与功能

外汇市场是全球最活跃、流动性最高的金融交易市场,每日交易量在6万亿到11万亿美元之间。它的日交易量是全球股票市场的27倍,全球期货市场的12倍,全球债券市场的7倍,超过了全球所有金融产品日交易量的总和。随着全球金融一体化的进…

混剪素材哪里找?分享几个热门混剪素材下载网站

在短视频和新媒体的世界里,高质量的混剪素材是吸引观众的关键。今天,我将为大家详细介绍几个优秀的素材网站,它们不仅资源丰富,而且完全满足新媒体创作者的需求。这篇文章将帮助你理解如何有效利用这些平台提升你的视频创作。 蛙…

Crosslink-NX器件应用连载(9): USB3.0相机

作者:Hello,Panda 大家晚上好,很久没有分享设计案例了,实在是太忙了,精力十分有限,今天分享一个CrosslinkNX系列器件用作USB3.0相机的案例。其实就是分享一下使用CrosslinkNX器件设计USB3.0相机主要有两种…

Freeswitch-soundtouch-变声开发

文章目录 一、介绍二、安装soundtouch2.1 源码安装方式(推荐)2.1.1下载源码2.1.2解压2.1.3 编译2.1.4 迁移(可选) 2.2 apt-get 安装 三、使用3.1 终端使用3.2 Freeswitch使用3.2.1编译Freeswitch的mod_soundtouch3.2.2启用 mod_so…

OpenCV学习(4.4) 平滑图像

1.目的 在本教程中将学习: 用各种低通滤波器模糊图像。对图像应用自定义过滤器(二维卷积)。 在图像处理中,平滑图像是一种去噪和模糊技术,用于减少图像中的噪声和细节,使得图像看起来更加平滑。平滑处理…

生信学习入门常见错误可能的原因分类总结和求助指南

文件或目录找不到 这是常见问题,常见提示有 No such file or directory Error in file(file, “rt”):无法打开链接 Fatal error: Unable to open file for reading (seq/WT1_1.fq) Fatal error: Unable to read from file (C:Program file/Git/usea…

Nginx实战:nginx支持带下划线的header

nginx对header 的名字字符做了限制,默认 underscores_in_headers 为off,表示如果header name中包含下划线,则忽略掉,后端服务就获取不到该请求头。 为了支持header带下划线的参数,可以在http内或者server内设置如下参数…