统计学习方法读书笔记-knn

    看李航老师统计学习方法时的笔记。其实书上写的已经非常易懂了,但是为了自己记忆,姑且写个笔记,个别地方是自己的理解,可能有偏差。

    KNN是由Cover和Hort在1967年提出的分类和回归方法(监督学习的)。它是一个机遇距离的机器学习算法,因此更多地适用于数值型的数据集(用jarccard相似度倒也可以直接衡量标称数据距离)。
    作为一个机器学习算法,knn是直接将训练数据整个作为模型。KNN的整个过程非常简单,可以描述如下:通过计算测试集中数据点与训练集中每个数据的距离,然后按照距离对训练数据进行排序(距离越近排名越高),取排名最高的前K个数据点,让他们投票来确定测试集数据的标签。
    从上述的过程描述可以知道,knn中需要确定3个部分:(1)距离的定义;(2)k值的选择;(3)分类决策规则。其中分类决策规则姑且可以构造出模型的损失函数,k值的不同会影响到损失函数值的变化。

(1) 距离的定义

    个人认为距离可以看做是某个空间中两点之间的直线长度,而在距离公式计算两点距离的时候则是把两点映射到对应的空间中计算的那个直线长度(似乎更加难理解了。。),可以感受一下不同距离定义时得到的测试数据点与每个训练数据点的距离是不同的,这个差异应该就是空间不同造成的。常用的距离有闵可夫斯基距离(包含了曼哈顿距离,欧几里得距离,切比雪夫距离)、相对熵、余弦相似度、皮尔森相似度、jarccard相似度等(后面几个相似度是值越大距离越小)。

  1. 闵可夫斯基距离
        闵可夫斯基距离又被写作L_p距离,数学上可以表示为一个关于p的函数:
    Lpx⃗ i,x⃗ j=(l=1n|x(l)ix(l)j|p)1/p

    其中n是数据点所在空间的维度。根据p值的不同,闵可夫斯基距离又被称为曼哈顿距离(p=1)、欧几里得距离(p=2)、切比雪夫距离(p=
    1)曼哈顿距离
    L1x⃗ i,x⃗ j=(l=1n|x(l)ix(l)j|)

      曼哈顿距离又叫街区距离。之所以叫街区距离,是因为可以形象得把它看做是从一个楼房排列整齐的街区的某一个点到另一个点走过的距离。从公式上看它就是两个点在各个坐标轴上的分量距离之和。
    2)欧几里得距离
    L2x⃗ i,x⃗ j=(l=1n|x(l)ix(l)j|2)1/2

      欧几里得距离可以说是我们最熟悉的距离了。它可以描绘成空间中亮点之间所连直线的长度。
    3)切比雪夫距离
    L(x⃗ i,x⃗ j)=maxnl=1|x(l)ix(l)j|

      切比雪夫距离可以理解成在一个棋盘中,一个棋子每次只走一步,并且可以往旁边8个格子的任一个格子移动,按照这样的移动方式从一个点移动到另一个点的最小步数。
  2. 相对熵
      信息熵是用来衡量一个随机系统(分布)混乱程度的,而相对熵则可以用来表示两个分布的差异,讲道理的话信息熵和相对熵的关系并不大。信息熵的定义为:

    entropy(p⃗ )=i=1npi×log2(pi)

    其中 p⃗  是一个离散分布(因为后面是个sum)。而相对熵则可以表示为:
    KL(p⃗ i,p⃗ j)=l=1npil×log2(pilpjl)

    其中 p⃗ i p⃗ j 分别是两个概率分布。

  3. 余弦相似度
      余弦相似度是比较以原点作为起点,数据点作为终点的两个向量之间夹角来衡量两个数据点的距离:

    cos(x⃗ i,x⃗ j)=x⃗ ix⃗ j|x⃗ i|×|x⃗ j|

  4. 皮尔森相似度

  5. jarccard相似度

(2)K值的选择

  K值的选择对knn算法的影响也很大,K值的物理意义在于在空间上画一个范围,把范围内的点作为近邻点。
  若K值选小了,则knn会对近邻的数据点敏感,很在意附近点的类别(抗噪能力很弱),也可以看做整体模型复杂度过高,容易造成过拟合;若K值选大了,它的包容性会很强,即使最靠近它的那些点是噪音,它也不容易受其影响,但太大的K则会学到那些距离太远的点的类别,从而导致判断不准确,极端地说,当K值取到包含所有训练集上的数据,那么不论测试点是什么,KNN都只会把它归到训练集数据中占比最大的类别(可以看做是算法复杂度太低)。

(3)分类决策规则

  通常来说,在计算出测试点与训练集中所有数据的距离之后,KNN是直接用排名前K个训练数据带权投票的方式来判断测试点所属的类别的,这个思想有点像极大似然估计(频率估计概率)。

(4)KNN的优化–KD树

  确切地说,对KNN而言,在训练集不变的情况下只要确定了三要素,那么它的训练模型就定下来了。KD树所做的优化并不是提高模型的性能,而是提高算法执行的效率(更快找到前K个近邻点)。
  通常而言KNN在使用时,要遍历计算每个训练数据和目标测试数据的距离,当数据量很大时,效率就会很低,因此要通过改变训练集的数据结构来减少计算距离的次数。KD树基本思想是把训练集构成二叉树的形式(具体实现的结果有点类似CART Tree)。
  看了好久都忘记怎么做的了,等哪天有心情了重新看的时候再写具体实现吧。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值