KNN猫狗分类
在生活中不同种类的生物,可以通过身高、体重等特征来进行简单的分类。猫和狗的分类就是一个典型的例子。
问题背景
假设我们有:
- 10 只猫的身高体重数据
- 10 只狗的身高体重数据
现有一个新样本(如 4.5kg, 28cm),如何判断它是猫还是狗?这就需要运用到KNN算法。
KNN 算法核心思想
KNN(K-Nearest Neighbors)是一种基于邻近性的分类方法,其步骤包括:
1. 计算距离
测试样本与训练样本的距离(如欧氏距离)
2. 找邻居
选择最近的 k 个训练样本
3. 投票分类
根据邻居的多数类别决定测试样本的类别
欧氏距离计算
邻近性是通过比较得出来的,比较的这个数值的一种典型的求法是欧式距离,用于计算空间中两点之间的直线距离。
二维空间中的公式为:
$$d = \sqrt{(x_2-x_1)^2 + (y_2-y_1)^2}$$
举例说明
假设已知:
- 猫:A(3.5kg, 25cm)
- 狗:B(8.0kg, 40cm)
想要预测一个新样本 C(4.5kg, 28cm) 是狗还是猫:
$$d(C,A) = \sqrt{(4.5-3.5)^2 + (28-25)^2}$$
$$d(C,B) = \sqrt{(4.5-8.0)^2 + (28-40)^2}$$
K值的重要性
在实际中样本数量会更多,这个k值是非常重要的。对所有训练样本计算距离并排序,选择最近k个训练样本,k的值直接关乎到分类的准确性。
K值过小的问题
- 容易受到噪音和异常值的影响
- 容易过拟合
举例:如果k=1,在数据集中不小心将猫的数据标成狗,那模型只取这个错误的邻近值,导致最后的分类出错。
K值过大的问题
- 模型会倾向于选择多数类
- 容易欠拟合
举例:如果数据中猫(60%)比狗(40%)多,K很大时所有新样本都会被预测为猫,即使某些区域狗更密集,也会导致分类出错。
投票机制
投票是KNN算法的最后一个步骤:
- 统计k个训练样本的标签
- 比较哪种标签出现的次数多
- 多数标签即为预测结果
示例:若 k=3 的邻居是 [猫, 猫, 狗],预测结果为 猫。
除了简单投票法,还有加权投票法(根据距离加权)等方法。
Python 实现代码
1 | import math |
📄 版权声明
👤 作者:qingshen
📅 发布时间:2025年8月3日
🔗 原文链接:https://qsblog.top/KNN%E7%8C%AB%E7%8B%97%E5%88%86%E7%B1%BB.html
📜 许可协议:知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议
💡 转载说明:转载请注明原文出处和作者信息