机器学习实战--K近邻法

    这两天再看K近邻法,K近邻法是基本的分类与回归算法.在这里总结一下,从一下几个方面.

    1KNN的原理

    2距离度量

    3 K值的选取

    4 分类规则以及Kd树

一KNN的原理

    以分类为例,我们有训练样本,即训练集,每个一样本都是带有label的,即我们知道每一个样本与类别的对应关系.测试样本没有label,我们需要对其进行预测,得出它的label.通常我们计算训练集中每一个样本和测试数据的相似度,然后选取前K个相似的样本,作为测试数据的最近邻.得到了K个最近邻,统计这K个数据类别的分布,我们选取出现次数最多的类别作为测试数据的分类.这就是KNN的原理.

二 距离度量

    上面提到计算训练样本和测试数据的相似性,如何评判两个样本是否相似呢,我们需要有一个评判指标来确定,那就是距离.两个样本的距离值小,那就是两个样本相似性较大,距离值较大,就说明两个样本的相似性较小.

样本的距离度量公式为:

在这里p>=1,大家也可以看出,

当p=1时,变为曼哈顿距离,当p=2是,距离变为欧式距离,

  在计算距离时,我们一定要注意一个问题,就是要对特征做归一化,即把每一维的数据都归一化到0~1或者-1~1之间,为什么呢?我们先看一个例子,我用一个人身高(cm)与脚码(尺码)大小来作为特征值,类别为男性或者女性。我们现在如果有5个训练样本,分布如下:

  A [(179,42),男] B [(178,43),男] C [(165,36)女] D [(177,42),男] E [(160,35),女],从上面的数据分布看出,身高是脚码的4~5倍,在进行距离度量的时候,会使得我们对两个维度特征的重要性不一致.现在我们给出一个测试用例,F[(167, 43)]让我们来判断F是男生还是女生.就以欧氏距离作为度量:

计算出距离之后,我们选取最近的三个作为最近邻,分别是C-女  D-男  E-女,即我们可以得出结论,F是一位女性.对吧,这很符合我们前面的KNN原理,但是...等等,好像这个姑娘的脚有点大啊,43的脚加上167的身高是不是有点不太符合女生的形象,所以这是为什么呢?我们可以这样分析,男性的身高普遍比较高,脚虽然也大,但是男女之间脚码的差异远远小于身高的差距,是吧.这样我们在计算距离时,数据严重的偏向身高这一块,也就是说距离很大的一部分是由身高决定的,这样就相当于我们没有平衡的对待身高和体重(数据特征),所以会对结果产生影响,因此我们要对每一个维度的数据做归一化.怎样做归一化呢?

​  假设样本特征为,我们选取每一个维度上的最大值和最小值,然后做差,得到,注意这里是对每一个维度单独操作的,也就是说我们对每一个维度都会计算出来一个,然后归一化原始数据,,其实我们实际操作中还会在分子上减去每一个维度的最小值,这样我们才是能把原始数据全部归一化到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






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值