KNN算法
在数据处理之后我们已经知道了数据记录的形式了,再结合赛题,我们要预测目标在坐标集中的位置。此时,第一个想到的自然就是k近邻算法(KNN)了。
在数据集中我们也可以看见针对每个目标给出了x,y,和time值,这三个值都对结果place_id产生了直接且强有力的影响,这也更加符合了使用KNN的基本条件。
近邻(K-Nearest Neighbor,简称KNN)算法,是一种应用很广泛的监督学习算法。它非常有效且易于掌握,其工作机制也很简单:给定测试样本,基于某种距离度量找出训练集中与其最靠近的k个训练样本,然后基于这k个"邻居"的信息来进行预测。KNN既可以用于分类又可以用于回。
所以现在知道了KNN算法是通过某种方式来找出最靠近的k个训练样本,那么如何判断“靠近”呢?
距离度量
KNN算法常见的距离度量方式有四种,分别是欧式距离,切比雪夫距离和曼哈顿距离,闵可夫斯基距离
欧式距离
欧式距离也就是我们在数学中都学过的距离公式
切比雪夫距离
直观感受:X 可以 上下左右斜着走时,到 Y 的最小距离。
曼哈顿距离
以二维坐标为例如果说欧氏距离是坐标轴上两点间的直线距离的话,曼哈顿距离就是当你只能沿平行于x轴或是y轴的方向前进的距离,直观来看,欧式距离是两点间连线的长度,可以是一条斜线,而曼哈顿距离则只能是折线段的长度,其轨迹不可能出现斜线。
闵可夫斯基距离
适用条件:
- 每个空间内的数值是连续的
- 由于闵可夫斯基距离不会考虑不同值之间的量纲是否统一,因此在计算相似度时所有值的含义应该相同
算法原理
KNN算法的核心思想是未标记样本的类别,由距离其最近的k个邻居投票来决定。具体的,假设我们有一个已标记好的数据集。此时有一个未标记的数据样本,我们的任务是预测出这个数据样本所属的类别。KNN的原理是,计算待标记样本和数据集中每个样本的距离,取距离最近的k个样本。待标记的样本所属类别就由这k个距离最近的样本投票产生,也即是这几个样本中数量最多的类别就被认定为该待标记样本的类别。
假设X_test为待标记的样本,X_train为已标记的数据集,算法原理的伪代码如下:
- 遍历X_train中的所有样本,计算每个样本与X_test的距离,并把距离保存在Distance数组中。
- 对Distance数组进行排序,取距离最近的k个点,记为X_knn。
- 在X_knn中统计每个类别的个数,即class0在X_knn中有几个样本,class1在X_knn中有几个样本等。
- 待标记样本的类别,就是在X_knn中样本个数最多的那个类别。
优势
- 算法准确性较高
- 对于噪声和异常值的容忍度较高
劣势
- 算法的空间复杂度较高
- 算法的时间复杂度较高
K值选择
- 算法的k值越大,模型的偏差也就越大,但是同时也会对于噪声不那么敏感,但是k值过大可能导致欠拟合。
- 算法的k值越小,模型的方差也就会越大,当k值过小的时候,就有可能导致过拟合