KNN及其作业
KNN算法原理
KNN得全称是K Nearest Neighbors,也被称作最邻近算法,k是指k个最近的邻居的意思,KNN属于一种分类算法。
KNN算法的思路是:如果一个样本在特征空间中的k个最邻近的样本中的大多数属于某一个类别,则该样本也划分为这个类别。KNN算法中,所选择的邻居都是已经正确分类的对象。该方法在定类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。
那么我们如何更好的进行了解呢,图示无疑是最好理解的, 我们要确定绿点属于哪个颜色(红色或者蓝色),要做的就是选出距离目标点距离最近的k个点,看这k个点的大多数颜色是什么颜色。当k取3的时候,我们可以看出距离最近的三个,分别是红色、红色、蓝色,因此得到目标点为红色。
算法描述
步骤描述
1)计算测试数据与各个训练数据之间的距离;
2)按照距离的递增关系进行排序;
3)选取距离最小的K个点;
4)确定前K个点所在类别的出现频率;
5)返回前K个点中出现频率最高的类别(决策依据方法之一)作为测试数据的预测分类。
简单来说就是:准备数据,计算距离,数据排序,确定K值,寻找邻居,决策分类
距离计算的方法
这里的距离指的是平面上两个点的直线距离。常用的距离计算公式有:
- 闵可夫斯基距离
- 欧几里得距离
- 曼哈顿距离
- 切比雪夫距离
- 马氏距离
- 余弦相似度
- 皮尔逊相关系数
- 汉明距离
- 杰卡德相似系数
- 编辑距离
- DTW 距离
- KL 散度
欧式距离
欧式距离全称欧几里得距离,公式为:
$$
d=\sqrt{(x_1-x_2)^2+(y_1-y_2)^2}
$$
K值的选择
K称为临近数,即在预测目标点时取几个临近的点来预测。
K值得选取非常重要,因为:
- 如果当K的取值过小时,一旦有噪声得成分存在们将会对预测产生比较大影响,例如取K值为1时,一旦最近的一个点是噪声,那么就会出现偏差,K值的减小就意味着整体模型变得复杂,容易发生过拟合;
- 如果K的值取的过大时,就相当于用较大邻域中的训练实例进行预测,学习的近似误差会增大。这时与输入目标点较远实例也会对预测起作用,使预测发生错误。K值的增大就意味着整体的模型变得简单,也就是容易发生欠拟合;
- 如果K=N的时候,那么就是取全部的实例,即为取实例中某分类下最多的点,就对预测没有什么实际的意义了;
为此我们可以这样取K的值:
- 从k=1开始,使用检验集估计分类器的误差率。重复该过程,每次K增值1,允许增加一个近邻。选取产生最小误差率的K;
- 一般k的取值不超过20,上限是n的开方,随着数据集的增大,K的值也要增大;
- K的取值尽量要取奇数,以保证在计算结果最后会产生一个较多的类别,如果取偶数可能会产生相等的情况,不利于预测。
关于决策依据/规则
最常用的决策规则是:
- 多数表决法(更常用):多数表决法类似于投票的过程,也就是在 K 个邻居中选择类别最多的种类作为测试样本的类别;
- 加权表决法:根据距离的远近,对近邻的投票进行加权,距离越近则权重越大,通过权重计算结果最大值的类为测试样本的类别。
优点
1)简单好用,容易理解,精度高,理论成熟,既可以用来做分类也可以用来做回归;
2)可用于数值型数据和离散型数据;
3)训练时间复杂度为O(n);无数据输入假定;
4)对异常值不敏感。
缺点
1)计算复杂性高;空间复杂性高;
2)样本不平衡问题(即有些类别的样本数量很多,而其它样本的数量很少);
3)一般数值很大的时候不用这个,计算量太大。但是单个样本又不能太少,否则容易发生误分;
4)最大的缺点是无法给出数据的内在含义。
代码实现
上面的内容大部分是引用的别人写的,代码部分是我在他的代码的理解基础上重新敲的
1 | #time/2022/1/28 |
本次作业实现
knn1
本次作业是要求填写出所空的代码,并且能够对代码理解,下面有我的运行结果,由于我还不会在博客上上传图片,所以显示不成图片信息,还有就是uniform这个函数我在pycharm上无法运行,所以我把uniform换成了random.uniform,这样填好代码就可以运行了。
1 | import matplotlib.pyplot as plt |
代码运行结果
1 | 距离所有A类数据的距离为: |
分析:其实我们光看数据随机生成的范围就可以看出,因为测试数据是的大小是在A旁边的,所以距离测试数据的K个最近值肯定大部分都在A区了,所以说待测数据划分成了A类,但是为了避免这样,我们可以在A与B之间来初始化测试数据的。
knn2
这个作业也是对代码进行补充的,下面是代码
1 | import math |
运行结果:
1 | 所有样本到唐人街探案的距离: |