K-Nearest Neighbors (KNN)
探索 K-近邻 (KNN)。了解该监督学习算法在分类和回归中的工作原理、在视觉搜索中的用途,以及与 Ultralytics YOLO26 的集成。
K-Nearest Neighbors (KNN) 是一种稳健且直观的算法,用于监督学习领域,适用于分类和回归任务。KNN 以其简单性著称,常被称为“惰性学习者”,因为它不在训练阶段构建模型或学习参数。相反,它会记忆整个训练数据集,并仅在请求预测时进行计算。该算法的核心原理依赖于特征相似性:它假设具有相似属性的数据点在多维特征空间中彼此靠近。
Link to this section算法如何运作#
K-Nearest Neighbors 的机制由距离计算驱动。当引入新的查询点时,算法会搜索存储的数据集,找到与新输入最接近的 'K' 个训练样本。
-
距离测量:系统计算查询点与数据库中每个其他点之间的距离。最常见的度量是欧氏距离,它测量点之间的直线距离。根据数据类型的不同,也可以使用诸如曼哈顿距离(出租车几何)或闵可夫斯基距离等其他度量方式。
-
邻居选择:计算距离后,算法会对距离进行排序,并识别出前 'K' 个最近的条目。
-
决策制定:- 用于分类:该算法使用“多数投票”系统。在 K 个邻居中出现频率最高的类标签会被分配给查询点。这广泛用于基础的图像分类任务。- 用于回归:通过平均 K 个最近邻居的值来估计连续变量,从而得出预测结果。
Link to this section选择合适的 'K' 值#
选择最优的 'K' 值是超参数调优中的关键步骤。K 的选择会显著影响模型的性能及其对新数据的泛化能力。
Link to this section实际应用#
尽管与深度神经网络相比非常简单,但 KNN 在现代 AI 中仍然具有很高的相关性,特别是在与先进的特征提取技术结合使用时。
- 推荐系统:KNN 促进了媒体流和电子商务中的协同过滤。通过识别具有相似观看历史或购买行为的用户(邻居),平台可以根据其“最近邻居”的偏好向用户推荐他们可能感兴趣的产品。
- 异常检测:在网络安全和金融领域,KNN 用于异常检测。交易或网络活动被映射到特征空间中;任何远离“正常”活动密集簇的新数据点都会被标记为潜在的欺诈或安全漏洞。
- Visual Search: Modern vector search engines often rely on Approximate Nearest Neighbor (ANN) algorithms—an optimized variation of KNN—to rapidly retrieve similar images based on high-dimensional embeddings generated by models like YOLO26.
Link to this section挑战与注意事项#
虽然有效,但 KNN 面临着维度灾难的问题。随着特征(维度)数量的增加,数据点变得稀疏,距离度量的有效性也会降低。此外,由于它存储了所有训练数据,KNN 可能会占用大量内存,并在大型数据集上出现较高的推理延迟。为了解决这个问题,从业者通常会使用降维技术(如主成分分析 (PCA))对数据进行预处理,或者使用专门的数据结构(如 KD-Trees)来加速搜索。对于企业级数据集缩放和模型训练,利用 Ultralytics Platform 可以帮助管理预处理复杂数据所需的计算资源。
Link to this section区分 KNN 和 K-Means#
区分 K-Nearest Neighbors 和 K-Means 聚类非常重要,因为它们名称相似,常引起混淆。
- KNN 是一种监督学习算法,使用标记数据进行预测。
- K-Means 是一种**无监督学习**算法,用于根据结构相似性将未标记的数据分组为簇。
Link to this section实现示例#
以下代码片段演示了使用流行的 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)")





