统计学习方法学习笔记-03-k近邻法

首先叙述k近邻算法,然后讨论k近邻模型及三个基本要素,最后讲述k近邻法的一个实现方法,kd树,介绍构造和搜索kd树的算法。

k近邻算法

输入:训练数据集T={(x1,y1),(x2,y2),,(xN,yN)},其中,xiXRn为实例的特征向量,yiY={c1,c2,,cK}i=1,2,,N;实例特征向量x
输出:实例x所属的类y

  • 根据给出的距离度量,在训练集中找到和x最近的k个点,涵盖这k个点的x的邻域记作Nk(x)
  • Nk(x)中根据分类决策规则(如多数表决)决定x的类别y:

y=arg maxcjxiNk(x)I(yi=cj),i=1,2,,N;j=1,2,,K

I为指示函数,当yi=cjI为1,否则为0

k近邻模型的三要素

k近邻法使用的模型实际上对应着对特征空间的划分,模型三要素为距离度量、k值的选择和分类决策规则

距离度量

特征空间中两个实例点的距离是两个实例点相似程度的反映。设特征空间Xn维实数向量空间Rnxi,xjX,xi=(xi(1),xi(2),,xi(n))T,xj=(xj(1),xj(2),,xj(n))T

  • Lp距离:

Lp(xi,xj)=(l=1n|xi(l)xj(l)|p)1p

  • 欧式距离Euclidean distance:p=2

L2(xi,xj)=(l=1n|xi(l)xj(l)|2)12

  • 曼哈顿距离Manhattan distance:p=1

L1(xi,xj)=l=1n|xi(l)xj(l)|

  • 各个坐标距离的最大值:p=

L(xi,xj)=maxl|xi(l)xj(l)|

k值的选择

  • 较小的k值:学习的近似误差会减小,估计误差会增大,预测结果会对邻近的实例点非常敏感,如果该点恰好是噪声,预测就会出错,也就是说k值的减小会使模型变得复杂,容易发生过拟合。
  • 较大的k值:学习的近似误差会增大,估计误差会减小,也就是说k值的增大会使模型变得简单
  • 一般使用交叉验证法来确定该值

分类决策规则

  • 多数表决majority voting rule:如果分类的损失函数为0-1损失函数,分类函数为:

f:Rn{c1,c2,,ck}

那么误分类的概率是

P(Yf(X))=1P(Y=f(X))

对于给定的实例xX,其最邻近的k个训练实例点构成集合Nk(x),如果涵盖Nk(x)的区域的类别是cj,那么误分类率是:

1kxiNk(x)I(yicj)=11kxiNk(x)I(yi=cj)

要使误分类率最小即经验风险最小,就要使xiNk(x)I(yi=cj)最大,所以多数表决规则等价于经验风险最小化

k近邻法的实现:kd树

目的:对训练数据进行快速k近邻搜索

构造kd

输入:k维空间数据集T={x1,x2,,xN},其中xi=(xi(1),xi(2),,xi(k))T,i=1,2,,N
输出:平衡kd

  • 构造根节点,使根节点对应于k维空间中包含所有实例点的超矩形区域;
  • 对于深度为j的树结点,选择x(l)为切分的坐标轴l=j(mod k)+1,以该结点的区域中的所有实例点的x(l)坐标的中位数为切分点,将该结点对应的超矩形区域切分为两个子区域,对应两个子结点,左子结点对应坐标x(l)小于切分点的子区域,右子结点对应坐标x(l)大于切分点的子区域,将落在切分超平面上的实例点保存在该结点
  • 重复第二步,直到两个子区域内没有实例点时终止;

搜索kd

输入:已构造的kd树,目标点x
输出:x的最近邻;
更适用于训练实例数远大于空间维数的情况,平均计算复杂度为O(logN)

  • kd树中找到包含目标点x的叶结点:从根节点出发,递归的向下访问kd树。若目标点x的当前维的坐标小于切分点的坐标,则移动到左子结点,否则移动到右子结点,直到子结点为叶结点为止
  • 以此叶结点为当前最近点
  • 递归的向上回退,在每个结点进行以下操作:如果该结点保存的实例点比当前最近点距离目标更近,则以该实例点为当前最近点;当前的最近点一定存在于该结点一个子结点对应的区域,检查该子结点的父节点的另一个子结点对应的区域是否有更近的点,具体的,检查另一个子结点对应的区域是否与以目标点为球心,以目标点与当前最近点间的距离为半径的超球体相交,如果相交,可能在另一个子结点对应的区域内存在距目标点更近的点,移动到另一个子结点,接着递归的进行最近邻搜索,如果不相交,向上回退,
  • 当回退到根结点时,搜索结束,当前最近点即为x的最近邻点
posted @   eryo  阅读(163)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示