这两天再看K近邻法,K近邻法是基本的分类与回归算法.在这里总结一下,从一下几个方面.
1KNN的原理
2距离度量
3 K值的选取
4 分类规则以及Kd树
一KNN的原理
二 距离度量
在这里p>=1,大家也可以看出,
A [(179,42),男] B [(178,43),男] C [(165,36)女] D [(177,42),男] E [(160,35),女],从上面的数据分布看出,身高是脚码的4~5倍,在进行距离度量的时候,会使得我们对两个维度特征的重要性不一致.现在我们给出一个测试用例,F[(167, 43)]让我们来判断F是男生还是女生.就以欧氏距离作为度量:
假设样本特征为,我们选取每一个维度上的最大值和最小值,然后做差,得到,注意这里是对每一个维度单独操作的,也就是说我们对每一个维度都会计算出来一个,然后归一化原始数据,,其实我们实际操作中还会在分子上减去每一个维度的最小值,这样我们才是能把原始数据全部归一化到0~1之间.然后就可以计算距离了.
三 K值的选择
回到原理那一部分,我们说过,要选取K个距离测试样本最近的样本,它们中类别最多的那一类作为测试样本的类别.但是,这个K怎样选取呢?是一个问题,K选大了或者选小了都不好.那都有什么不好呢?
就以上图为例,训练样本中有黑圈和蓝块两个类别,我们现在有一个测试样本,就是红色五边形,我们要判断他的类别是什么.
假如设置K=1我们就可以判断处红色五边形的类别为黑圈,但是这又好像有些问题.什么问题呢?在一圈蓝色的区域中,出现了一个黑圈,我们能确定这个黑圈是不是真的黑圈呢,它有没有可能是一个噪声点呢?是有可能的,如果k=1我们判断出的测试样本的结果很容易受到周边噪声的影响,这也就是说k=1是模型的泛化性能不好,也就是我们常说的过拟合,模型过于复杂,把噪声点当做样本,忽略了真是数据的分布.
假如设置K=9我们就会把所有蓝色方块和那个黑色圈圈包含进来,就可以判定测试样本属于蓝块,从我们的直觉观察上也可以看出属于蓝块是正常的.
假如我们设置K=17,也就是把所有的样本都包含进来,这样模型就过于简单,为什么这么说呢?咱们试想一下,如果K=N,N为样本总和,也就是说来一个测试样本,我们计算训练集中所有样本与测试样本之间的距离,然后选取N个,然后计算这N个样本中类别最多的那一类作为测试样本的类别.再来一个也是进行一遍这样的操作,这好像有些问题啊.我们把所有样本都囊括进来了,还用计算距离吗?直接计算训练集中样本数最多的类别就完了,所以不管来什么测试样本,我们都直接把它当做哪一个类别就好了,你说这简单不简单,但是这根本就没有训练模型啊,这是不正确di.
所以K值的选取不能太大,也不能太小,我们要做交叉验证,多做几次实验,看不同的K值对最终结果的影响,选取最优的K值.
四 分类规则
就以误分类概率来评判模型的好坏,一个样本被误分类的概率为:
, 对给定的实力,其最近邻的k个实例点构成集合,如果涵盖集合的类别是,那么误分类的概率是:
要使误分类概率最小,就应该是经验风险最小.
KNN的优缺点:
优点:
简单好用,易于理解,只需要找出与测试样本最近的前K个训练样本即可.既可以做分类也可以做回归.
KNN是一种在线技术,新来的样本也可以加入训练数据集而不需要重新训练
缺点:
1当样本不平衡时,比如一个类的样本容量特别大,而其他类的容量很小.输入一个测试数据,它的K近邻中大多数都是容量大的类别,而忽略了它可能距离容量小的样本更近.
针对上面那个问题的改进方法,采用权值的方法,距离近的权值大,距离远的权值小.
2计算量大,每一个测试样本要与训练集中所有样本计算距离,然后排序得出K近邻.
采用Kd树,进行二叉树的搜索,获得最近邻.
再放一张KNN与K-means之间的对比图:
就这样,KNN暂时到这里,不知道csdn咋了,不能像之前markdown那样边写边预览了,只能自己在本地写好又粘贴过了了.
reference:
https://zhuanlan.zhihu.com/p/25994179
https://www.cnblogs.com/190260995xixi/p/5945652.html
https://zhuanlan.zhihu.com/p/28656126