- 什么是K最近邻算法
-
最近邻算法
-
先输入标注好的训练集,然后啥也不干。测试集的每个样本进来,找到最近的训练集样本,贴上和它一样的标签,就像下图绿色应该为三角形。
-
如何定义最近/距离?
- L1和L2空间的区别
- L1受坐标系影响L2不受
- 通常情况下如果向量参数有具体的实际意义,比如薪资年龄,L1可能比L2更好,但一般推荐两者都试一试,取效果好的。
- L1和L2空间的区别
-
-
K-最近邻算法
-
最近邻算法只找最近的一个样本,容易被噪声干扰,就像下图红色应该被判别为方块而不是黑点。KNN的算法是我找附近的K个训练集样本,然后少数服从多数。
-
K值为1会受噪声干扰,但是K值太大也不行,过大的K值将会导致模型过于简单,如果K值=训练集大小 也就意味着测试集将被贴上同一个标签。
-
什么K值是最好的?要根据样本情况来定,通常先取一个较小的值,通过交叉验证来定。
-
-
- 归一化
- 归一化重要性
- 目的是让每个要素的权重相同。因为计算欧式距离的时候大数会贡献更多。
- 归一化的方法
- 每个维度都降到0~1之间,分母是max-min,分子是x-min
- 归一化重要性
- 评价算法和调整超参的正确方式
- 如果只有训练集和测试集,用测试集来不断优化超参数是十分糟糕的,因为那意味着你在让算法更加适合这个特定的测试集,而不是适用于一个普遍的分类问题。测试集应该只能在最后使用一次,相当于是一个未见的新数据,我们不应当也不能对测试集做出任何的算法优化,这样才能保证我们的算法是普适的,而不是针对某个特定测试集过拟合的。
- 正确的做法是把数据分三个部分(或者说是把测试集分成两个部分):训练集,验证集,测试集。训练集用来训练模型,验证集用来调参。等到一切就绪之后才能用到测试集,充当未见的新数据来评价算法好坏,然后不能做任何的算法更改。
- 缺点
- 训练模型时间短,测试样本时间长,完全违背机器学习的意义
- L2距离并不适合图像识别,因为它不能很好的衡量图像的相似性
- 维度灾难
- KNN算法相当于是把空间分成很多块,每一块是一个标签。这就需要训练样本密集的分布在空间中才可以,但随着维度的增加,“密集”所需要的样本数量是呈指数增长的,我们可能没有那么多的数据。
- KNN算法相当于是把空间分成很多块,每一块是一个标签。这就需要训练样本密集的分布在空间中才可以,但随着维度的增加,“密集”所需要的样本数量是呈指数增长的,我们可能没有那么多的数据。
参考资料
一文搞懂k近邻(k-NN)算法(一)
cs231n 2.2