K-Nearest Neighbors(KNN) 是最直观的机器学习算法之一。面对一个新样本时,它会寻找训练数据中最相近的若干样本,并使用这些邻居的结果进行预测。
KNN通常属于监督学习(Supervised Learning)。
基本流程
- 准备训练数据和Label。
- 计算新样本与所有训练样本之间的距离。
- 按距离从小到大排序。
- 选择最近的
K个样本。 - 在分类问题中,返回出现次数最多的类别。
K代表什么?
K表示参与决策的邻居数量。
K = 1时,只参考最近的一个样本;K = 5时,则由五个邻居共同决定。
在二分类中,3、5、7等奇数比较常见,但最佳K值应通过Validation数据来确定。
Euclidean Distance
常见的距离度量是欧氏距离:
d = sqrt((x2 - x1)^2 + (y2 - y1)^2)
距离越小,说明两个样本在所选特征空间中越相似。
为什么需要Feature Scaling?
如果一个特征范围为1到100,另一个范围为1到500000,后者可能完全主导距离计算。
因此在KNN之前经常使用Standardization或Min-Max Scaling。
Classification与Regression
在Classification中,通常选择K个邻居中出现次数最多的类别。
在Regression中,可以使用邻居目标值的平均值或加权平均值。
优点
- 原理简单
- 几乎不需要复杂训练
- 适合中小型数据集
- 可用于分类和回归
局限
- 预测阶段可能需要大量距离计算
- 对特征尺度敏感
- 无关特征会降低效果
- 高维空间中距离的区分能力会下降
如何选择K?
K过小容易受噪声影响,K过大又可能过度平滑局部结构。实践中应比较多个K值在验证集上的表现。
应用场景
- 客户行为分类
- 基于相似度的推荐
- 简单异常检测
- 医疗样本分类
- 模式识别
- 快速建立Baseline模型
实现逻辑
calculate distance to every training sample
sort by distance
take the nearest K
count labels
return the most frequent label
所提供JavaScript项目中的实现正是按照这一流程计算Euclidean Distance、排序、选择K个邻居并统计Label。
总结
KNN建立在一个非常直观的假设上:相似的样本往往具有相似的结果。
实际使用时,需要重点考虑K值、距离度量、Feature Scaling、数据规模和维度。