1. 简介
k近邻(KNN) 是一种经典的监督学习算法,属于分类与回归任务的代表性方法。其核心思想是:通过样本特征相似性(距离)来判断新数据的类别或值。简单来说:“物以类聚,人以群分”。
2. 核心思想
“相似性决定类别”:如果一个样本在特征空间中与k个最邻近样本中的大多数属于某一类,则该样本也属于这一类。
“多数表决”(分类任务)或“平均值计算”(回归任务)。
3. 算法步骤
计算距离
新数据点与所有训练数据点计算距离(常用方法:欧氏距离、曼哈顿距离、余弦相似度等)。欧氏距离公式:
寻找最近邻
选取与新数据点距离最近的k个训练样本。投票/平均
分类任务:统计k个邻居中最多出现的类别,作为预测结果。
回归任务:取k个邻居的标签平均值作为预测结果。
输出结果
返回预测的类别或数值。
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以“邻居信息”为核心,是入门机器学习的必学算法,适合小规模数据且对解释性要求高的场景。