用 KNN 算法解锁分类的奥秘:从电影类型到鸢尾花开

从电影分类说起:KNN 的核心思路

先来看一个有趣的例子。假设我们收集了一批电影的 "特征数据":用 "打斗镜头数量" 和 "接吻镜头数量" 来描述一部电影,并且已经知道其中一些电影的类型(爱情片或动作片):

电影名称 打斗镜头 接吻镜头 类型
California Man 3 104 爱情片
He's Not Really into Dudes 2 100 爱情片
Beautiful Woman 1 81 爱情片
Kevin Longblade 101 5 动作片
Robo Slayer 3000 99 2 动作片
Amped II 18 90 未知

现在问题来了:未知电影《Amped II》到底是爱情片还是动作片?

KNN 算法的思路特别 "实在":看它 "最像" 哪些已知的电影。就像我们判断一个人是内向还是外向,会观察他最常来往的几个朋友的性格 ------KNN 的核心逻辑就是 "近朱者赤,近墨者黑"。

KNN 是怎么工作的?分 5 步走

KNN 的全称是 "K-Nearest Neighbor"(K 近邻),它的工作步骤简单到可以用 5 句话概括:

  1. 算距离:计算未知样本(比如《Amped II》)与所有已知样本(已分类的电影)的 "距离"。这里的 "距离" 不是物理距离,而是特征之间的差异(比如打斗镜头和接吻镜头的数值差)。

  2. 排顺序:把这些距离按从小到大的顺序排序,越近的样本说明和未知样本 "越像"。

  3. 选邻居:挑出距离最近的 K 个样本(K 是我们自己设定的数,一般不超过 20),这就是未知样本的 "近邻"。

  4. 看多数:统计这 K 个近邻的类型,哪种类型出现的次数最多,就是 "主流意见"。

  5. 下结论:把 "主流意见" 作为未知样本的分类结果。

实战:给《Amped II》贴标签

我们用上面的电影数据实战一下。

首先,计算《Amped II》(打斗 18,接吻 90)与其他已知电影的距离。这里我们用最常用的 "欧式距离"(可以理解为 "直线距离"),二维空间的公式是: \(d = \sqrt{(x_1 - x_2)^2 + (y_1 - y_2)^2}\)

计算结果如下(只保留关键值):

  • 与《California Man》(3,104)的距离≈17.2
  • 与《He's Not Really into Dudes》(2,100)的距离≈13.1
  • 与《Beautiful Woman》(1,81)的距离≈18.4
  • 与《Kevin Longblade》(101,5)的距离≈108.6
  • 与《Robo Slayer 3000》(99,2)的距离≈107.6

排序后,最近的 3 个 "邻居"(K=3)是:《He's Not Really into Dudes》(爱情片)、《California Man》(爱情片)、《Beautiful Woman》(爱情片)。这 3 个都是爱情片,所以《Amped II》被分类为爱情片

距离怎么算?不止一种 "尺子"

刚才我们用了欧式距离,但 KNN 里还有其他 "尺子" 可以衡量距离,最常见的还有 "曼哈顿距离"。

  • 欧式距离:像乌鸦一样 "直线飞行" 的距离,适合衡量连续特征的差异(比如长度、数量)。 公式:\(d = \sqrt{\sum_{i=1}^{n}(x_i - y_i)^2}\)(n 为特征数量)

  • 曼哈顿距离:像出租车在城市里绕路一样,沿坐标轴 "直角转弯" 的距离总和,适合特征值是整数或离散的场景。 公式:\(d = \sum_{i=1}^{n}|x_i - y_i|\)

比如在电影分类中,用曼哈顿距离计算《Amped II》与《He's Not Really into Dudes》的距离:|18-2| + |90-100| = 16 + 10 = 26,同样能看出两者很接近。

从电影到花朵:KNN 的实际应用

KNN 的应用远不止给电影分类。在经典的 "鸢尾花分类" 问题中,它也能大显身手。

鸢尾花有 3 个品种(山鸢尾、变色鸢尾、维吉尼亚鸢尾),我们可以通过花萼长度、花萼宽度、花瓣长度、花瓣宽度这 4 个特征来区分它们。用 KNN 算法的步骤如下:

  1. 加载数据:用 Python 的 sklearn 库加载自带的鸢尾花数据集,包含 150 个样本的特征和标签。

  2. 拆分数据:把数据分成 "训练集"(80%,用来找 "邻居")和 "测试集"(20%,用来检验效果)。

  3. 训练模型:设定 K 值(比如 5),选择距离度量(比如欧式距离),让模型 "记住" 所有已知样本的特征和类别。

  4. 评估效果:用测试集验证模型的分类准确率,一般来说,K 值合适的话,鸢尾花分类准确率能达到 90% 以上。

总结:KNN 的 "简单" 与 "不简单"

KNN 算法最大的优点是简单直观:不需要复杂的数学推导,像 "看邻居投票" 一样就能分类,而且能处理多类问题。但它也有 "小脾气":

  • 计算量大:每预测一个样本,都要和所有已知样本算距离,数据量大时会变慢。
  • 依赖 K 值:K 太小容易 "以偏概全",K 太大可能 "模糊重点",需要根据数据调整。
  • 怕高维数据:特征太多时,距离计算会变得 "不准"(这就是 "维度灾难")。

但这并不影响它成为机器学习的 "入门好工具"。下次当你纠结一部电影的类型时,或许可以试试用 KNN 的思路 ------ 看看它和哪些已知电影 "最像",答案可能就藏在 "邻居" 里。

从电影到花朵,从距离计算到分类决策,KNN 用最朴素的逻辑告诉我们:有时候,解决复杂问题的钥匙,就藏在 "相似性" 里。

相关推荐
Jerry4 小时前
LeetCode 101. 对称二叉树
算法
可编程芯片开发5 小时前
基于MPPT最大功率跟踪的离网光伏发电系统Simulink建模与仿真
算法
AI科技星5 小时前
线性算子不是空间映射函数,是全域双螺旋场之间拉伸、旋转、耦合、坍缩的跨空间标准化变换载体《全域数学vs传统数学:人类文明进阶200讲》第80讲
线性代数·算法·矩阵·数据挖掘·回归·乖乖数学·全域数学
米罗篮6 小时前
矩阵快速幂 (Exponentiation By Squaring Applied To Matrices)
c++·线性代数·算法·矩阵
dream_home84076 小时前
图像算法模型NPU适配与算法服务实战指南
人工智能·python·算法·npu 图像服务
大鱼>6 小时前
多宠物家庭智能管理平台:云端架构与多设备协同实战
python·算法·iot·宠物
To_OC7 小时前
LC 22 括号生成:刷完这道题,我终于搞懂回溯剪枝了
javascript·算法·leetcode
To_OC7 小时前
LC 39 组合总和:回溯入门必刷题,我踩过的两个坑都在这了
javascript·算法·leetcode
数字杂技师7 小时前
每条推荐都很准,为什么我还是越刷越无聊?
算法
兰令水7 小时前
hot100【acm版】【2026.7.14打卡-java版本】
java·数据结构·算法·leetcode·面试