k近邻(K-Nearest Neighbors, KNN)算法详解

发布于:2025-03-20 ⋅ 阅读:(15) ⋅ 点赞:(0)
1. 简介

k近邻(KNN) 是一种经典的监督学习算法,属于分类回归任务的代表性方法。其核心思想是:通过样本特征相似性(距离)来判断新数据的类别或值。简单来说:“物以类聚,人以群分”


2. 核心思想
  • “相似性决定类别”:如果一个样本在特征空间中与k个最邻近样本中的大多数属于某一类,则该样本也属于这一类。

  • “多数表决”(分类任务)或“平均值计算”(回归任务)。


3. 算法步骤
  1. 计算距离
    新数据点与所有训练数据点计算距离(常用方法:欧氏距离、曼哈顿距离、余弦相似度等)。

    • 欧氏距离公式

  2. 寻找最近邻
    选取与新数据点距离最近的k个训练样本。

  3. 投票/平均

    • 分类任务:统计k个邻居中最多出现的类别,作为预测结果。

    • 回归任务:取k个邻居的标签平均值作为预测结果。

  4. 输出结果
    返回预测的类别或数值。


4. 关键参数
  • k值选择

    • k过小 → 模型对噪声敏感(过拟合)。

    • k过大 → 模型忽略局部特征(欠拟合)。

    • 一般通过交叉验证选择最优k值

  • 距离度量
    根据数据特性选择距离计算方式(如高维数据可能用余弦相似度)。


5. 优缺点
优点 缺点
1. 简单直观,无需训练过程。 1. 计算复杂度高(需遍历所有样本)。
2. 天然支持多分类任务。 2. 对高维数据和噪声敏感。
3. 无参数假设(非参数模型)。 3. 需要数据归一化处理。        
6. 代码示例(Python)

from sklearn.neighbors import KNeighborsClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# 加载数据集
iris = load_iris()
X, y = iris.data, iris.target

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)

# 创建KNN模型(k=3)
knn = KNeighborsClassifier(n_neighbors=3)
knn.fit(X_train, y_train)

# 预测并评估
y_pred = knn.predict(X_test)
print("准确率:", accuracy_score(y_test, y_pred))

7. 应用场景
  • 分类问题:文本分类、图像识别、用户行为分析。

  • 回归问题:房价预测、股票趋势分析。

  • 推荐系统:基于用户/物品相似性推荐。


8. 常见面试题
  • Q1: KNN为什么需要数据归一化?
    A: 不同特征的量纲差异会导致距离计算偏向大范围特征,归一化可消除量纲影响。

  • Q2: KNN的时间复杂度是多少?
    A: 预测时间复杂度为O(n),n为训练样本数,因此不适合大数据场景。


总结:KNN以“邻居信息”为核心,是入门机器学习的必学算法,适合小规模数据且对解释性要求高的场景。