当前位置: 首页 > ops >正文

机器学习算法-- K 近邻算法(KNN)

我用一个 「预测电影类型」 的例子来讲解 K 近邻算法(KNN),保证你轻松理解原理和实现步骤!

🎬 例子背景

假设你是电影平台的程序员,现在有一批电影数据,包含两个特征:

  1. 打斗镜头次数(动作片通常更多)

  2. 亲吻镜头次数(爱情片通常更多)

已知这些电影的类别(标签),比如《战狼》是动作片,《泰坦尼克号》是爱情片。现在有一部新电影(打斗 80 次,亲吻 10 次),如何用 KNN 判断它的类型?


📚 KNN 原理解析

1. 核心思想

“近朱者赤,近墨者黑” —— 新电影的类别由它最相似的 K 个邻居的类别投票决定。

2. 关键步骤
  1. 计算距离:新电影和所有已知电影的距离(比如欧氏距离)。

  2. 找邻居:选出距离最近的 K 个电影(比如 K=3)。

  3. 投票决定:这 K 个电影中,哪种类型多,新电影就属于哪类。

3. 距离公式(欧氏距离)

比如新电影 A (80,10) 和已知电影 B (100,5) 的距离:
距离 = √[(80-100)² + (10-5)²] = √(400 + 25) ≈ 20.6


🛠️ 代码实现(Python)

用 scikit-learn 库快速实现:

from sklearn.neighbors import KNeighborsClassifier
import numpy as np# 1. 准备数据(打斗次数,亲吻次数)
X = np.array([[100, 5], [90, 8], [5, 90], [2, 100]])  # 特征
y = np.array(["动作片", "动作片", "爱情片", "爱情片"])    # 标签# 2. 创建KNN模型(K=3)
knn = KNeighborsClassifier(n_neighbors=3)
knn.fit(X, y)  # 训练模型# 3. 预测新电影
new_movie = np.array([[80, 10]])
prediction = knn.predict(new_movie)print(f"预测结果:{prediction[0]}")  # 输出:动作片
 

代码解释

  • X 是特征数据,y 是对应的标签。

  • n_neighbors=3 表示选择最近的 3 个邻居投票。

  • 新电影 [80, 10] 的 3 个邻居大概率是动作片,所以预测为动作片。


🌟 关键细节

  1. 如何选 K 值?

    • K 太小(如 K=1):容易受噪声影响(比如邻居恰好是标错的数据)。

    • K 太大:可能忽略局部特征(比如周围全是爱情片,但新电影其实是动作片)。

    • 经验法则:从 K=5 开始尝试,用交叉验证调整。

  2. 特征缩放很重要!

    • 如果“打斗次数”范围是 0-100,而“亲吻次数”是 0-1,距离计算会被打斗次数主导。

    • 解决方法:用 StandardScaler 标准化特征。

  3. 适合场景

    • 小数据集、简单分类(比如手写数字识别)。

    • 不适合大数据集(计算距离慢)或高维数据(维度灾难)。


🤔 举个反例

如果新电影是 [50, 50](打斗和亲吻镜头一样多),KNN 可能难以判断——这时需要更复杂的模型(比如决策树或神经网络)。


总结:KNN 就是“跟着邻居走”,简单但强大!试着用它预测你身边的数据吧(比如根据身高体重判断性别)🎯

http://www.xdnf.cn/news/9224.html

相关文章:

  • Linux 资源限制(进程级,用户级,系统级)
  • Debian 11 之使用hostapd与dnsmasq进行AP设置
  • 欧拉定理:若 gcd(a,n)=1,则 a^φ(n)≡1(mod n)。
  • 2025 吉林CCPC
  • 【数据结构】 时间复杂度
  • 浙大版《Python 程序设计》题目集6-3,6-4,6-5,6-6列表或元组的数字元素求和及其变式(递归解法)
  • 前端生成UUID
  • 5.27 打卡
  • 哪些技术要素决定了多媒体数字沙盘的呈现效果与用户体验?
  • Cursor 与DeepSeek的完美契合
  • 树莓派超全系列教程文档--(49)远程访问树莓派
  • 5.27 day 30
  • SQL计算列
  • 数据要素配置如何驱动城市经济韧性的多元模式
  • 【leetcode】209. 长度最小的子数组
  • LeetCode 高频 SQL 50 题(基础版)之 【连接】部分 · 上
  • 车载网关策略 --- 车载网关通信故障处理机制深度解析
  • ElasticSearch整合SpringBoot
  • 《深入解析UART协议及其硬件实现》-- 第一篇:UART基础与协议层详解
  • 一张Billing项目的流程图
  • 16. Git从入门到实践
  • Java-Set集合遍历的全面指南
  • 贝壳后端golang面经
  • 【信号与系统】【转载记录】漫谈《信号与系统》
  • 体绘制学习
  • Android开机向导定制(2)开机向导配置
  • 【免费】【无需登录/关注】多点矩阵计算器,计算任何坐标系转换
  • 【无标题】C++单例模式详解
  • 二次封装 Vuex for Uniapp 微信小程序开发
  • linux如何查看网络设备类型