1. KNN算法:最直观的机器学习入门模型
K最近邻(K-Nearest Neighbors)算法是我在机器学习领域最早接触的几个模型之一,也是我推荐给所有初学者的第一个实战算法。它完美诠释了"物以类聚"的朴素思想——要判断一个新样本的类别,只需看看它周围K个邻居中哪种类型最多。这种基于实例的学习方式不需要复杂的训练过程,却能解决分类和回归两大类问题。
我第一次用KNN是在电商用户分群项目中,通过用户浏览时长、点击次数等特征,快速将用户划分为高/中/低价值三类。当时就被它三个突出特性吸引:① 实现简单(核心代码不到20行) ② 天然支持多分类 ③ 对数据分布没有强假设。不过后来也发现,当特征维度飙升到数百维时,原始的KNN会遇到严重的"维度灾难",这是后话。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. KNN核心原理与数学内涵
2.1 距离度量的艺术选择
KNN的核心在于距离计算,常用的五种度量方式各有适用场景:
-
欧氏距离(默认选择):
python复制distance = sqrt(sum((x_i - y_i)^2))适合数值型特征且量纲统一的情况。我在房价预测项目中发现,当特征单位不统一(如面积㎡ vs 价格万元)时,必须先做标准化。
-
曼哈顿距离:
python复制distance = sum(|x_i - y_i|)在具有离散特征的数据集(如用户画像)中表现更好,对异常值比欧氏距离更鲁棒。
-
余弦相似度:
python复制
similarity = dot(A,B)/(||A||*||B||)处理文本TF-IDF向量时,我习惯用1-cos值作为距离。曾用这个方法实现过新闻分类器,准确率比欧氏距离高8%。
经验:对于稀疏特征(如用户行为日志),余弦相似度通常是最优选择;而对于密集的数值特征(如传感器读数),欧氏距离更合适。
2.2 K值选择的博弈论
K的取值直接影响模型表现:
- K太小(如1):模型对噪声敏感,我在手写数字识别中测得K=1时测试误差高达15%
- K太大:决策边界过度平滑,曾用K=100处理乳腺癌数据集,导致恶性样本漏检率上升
我的调参心得:
- 从K=sqrt(样本数)
