深圳Yolo 视觉
深圳
立即加入
词汇表

K 近邻 (KNN) 算法

Explore K-Nearest Neighbors (KNN) for classification and regression. Learn how this intuitive algorithm works with distance metrics and [YOLO26](https://docs.ultralytics.com/models/yolo26/) embeddings on the [Ultralytics Platform](https://platform.ultralytics.com).

K最近邻(KNN)是一种稳健且直观的算法,在监督学习领域中同时适用于分类和回归任务。其简洁性使其常被归类为"懒惰学习者"——在训练阶段既不构建模型也不学习参数。 相反,它会完整存储整个训练数据集,仅在需要预测时才进行计算。该算法的核心原理基于特征相似性:它假设在多维特征空间中,具有相似属性的数据点彼此邻近。

算法如何运作

K最近邻算法的运作机制基于距离计算。当引入新查询点时,该算法会在存储的数据集中搜索出与新输入点距离最近的K个训练样本。

  1. 距离测量:系统计算查询点与数据库中其他所有点的距离。最常用的度量标准是欧几里得距离,用于测量点与点之间的直线距离。根据数据类型,也可采用曼哈顿距离(出租车几何)或明可夫斯基距离等其他度量标准。
  2. 邻域选择:在计算距离后,算法对结果进行排序,并识别出前K个最近的条目。
  3. 决策:
    • 分类方法:该算法采用"多数投票"机制。在K个邻近样本中出现频率最高的类别标签将被赋予查询点。此方法广泛应用于基础图像分类任务。
    • 对于回归:预测值通过求K个最近邻的平均值来计算, 以估计连续变量。

选择正确的'K'

选择'K'的最佳值是超参数调优的关键步骤。K值的选择显著影响模型的性能及其对新数据的泛化能力。

  • 低K值:较小的K值(例如K=1)会使模型对数据中的噪声和异常值高度敏感,从而可能导致过拟合
  • 高K值:较大的K值会平滑决策边界,减少噪声影响,但可能模糊清晰的模式,导致模型拟合不足

实际应用

尽管相较于深度神经网络更为简单,KNN在现代人工智能领域仍具有重要意义,尤其当其与先进的特征提取技术相结合时。

  • 推荐系统:KNN算法促进了媒体流媒体和电子商务领域的协同过滤。通过识别具有相似观看历史或购买行为的用户(邻居),平台能够根据用户的"最近邻居"偏好,推荐用户可能喜欢的产品。
  • 异常检测:在网络安全和金融领域,KNN用于异常检测。交易或网络活动被映射到特征空间中;任何远离密集"正常"活动簇的新数据点都会被标记为潜在欺诈或安全漏洞。
  • 视觉搜索:现代 向量搜索引擎通常依赖近似最近邻(ANN)算法——KNN的优化变体——基于YOLO26等模型生成的 高维嵌入,快速检索相似图像。

挑战与考量

尽管有效,KNN仍面临维度诅咒问题。随着特征(维度)数量增加,数据点变得稀疏,距离度量法将失效。此外,由于需要存储全部训练数据,KNN在处理大型数据集时可能消耗大量内存并导致推理延迟。 为解决此问题,实践者常采用主成分分析(PCA) 等降维技术预处理数据,或使用KD树等专用数据结构加速搜索。针对企业级数据集扩展与模型训练需求Ultralytics 可有效管理复杂数据预处理所需的计算资源。

区分KNN与K均值聚类

区分K最近邻算法与K均值聚类法至关重要, 因其名称相似常易引发混淆。

  • KNN是一种监督学习算法,它利用标记数据进行预测。
  • K均值法是一种 一种无监督学习 算法,用于根据结构相似性将无标签数据聚类。

实施实例

以下代码片段演示了使用流行的Scikit-learn库实现的简单KNN分类工作流。在计算机视觉场景中,输入的"特征"通常会先通过YOLO26等深度学习模型进行提取,再传递给KNN分类器。

from sklearn.neighbors import KNeighborsClassifier

# Simulated feature vectors (e.g., extracted from YOLO26) and labels
# Features: [Size, Redness], Labels: 0=Apple, 1=Orange
features = [[0.8, 0.9], [0.9, 0.8], [0.2, 0.3], [0.3, 0.2]]
labels = [0, 0, 1, 1]

# Initialize KNN with 3 neighbors
knn = KNeighborsClassifier(n_neighbors=3)
knn.fit(features, labels)

# Predict the class of a new object [Size=0.85, Redness=0.85]
prediction = knn.predict([[0.85, 0.85]])
print(f"Predicted Class: {prediction[0]} (0=Apple, 1=Orange)")

加入Ultralytics 社区

加入人工智能的未来。与全球创新者联系、协作和共同成长

立即加入