当前位置: 代码迷 >> 综合 >> 统计学习方法-k邻近(k-nearest neighbor)
  详细解决方案

统计学习方法-k邻近(k-nearest neighbor)

热度:25   发布时间:2023-12-18 07:08:55.0

概述

  • 是基本的回归分类模型,此处只讨论分类
  • 输入:特征向量
  • 输出:分类类别,可以为多类
  • KNN没有显示学习过程
  • KNN的三个基本要素
    • k值选择
    • 距离度量
    • 分类决策规则

模型

模型三要素:k值选择, 距离度量,分类决策规则

模型

当训练集,距离度量,k值,分类决策规则确定后,对于任何一个新的输入,其分类是确定的的。相当于这些要素间将特征空间划分为一些子空间,确定了每个子空间里每个点的类别。

特征空间中,每个训练点xix_ixi?,距离该点比其他点更近的所有点组成的一个区域,叫做单元(cell),每个训练实例有一个单元,所有训练实例点的单元构成对特征空间的一个划分。

距离度量

一般使用欧氏距离,也可使用LpL_pLp?距离,或Minkowski距离。

  1. Lp距离L_p距离Lp?
    xi,xjx_i,x_jxi?,xj?之间的距离是Lp(xi,xj)=(∑l=1n∣xil?xjl∣p)1p,p≥1L_p(x_i,x_j)=(\sum^n_{l=1}|x_i^{l}-x_j^{l}|^{p})^{1\over p} , p \geq 1Lp?(xi?,xj?)=(l=1n?xil??xjl?p)p1?,p1 p=1时,是曼哈顿距离;p=2时,是欧式距离;p=∞p=\inftyp=时,是各个坐标距离的最大值

k值选择

k小的话,近似误差会很小,只有较接近输入的才会起作用,但估计误差会增大,对邻近的实例很敏感,如果邻近是噪声,则会出错。k小的话,模型比较复杂,易过拟合。

k值较大,减少了估计误差,但近似误差会增大。k值较大,意味着模型较简单。

一般取较小值,通过交叉验证选择最优的k值。

分类规则

常见为多数表决。
多数表决规则(majority voting rule),设损失函数为0-1损失函数,误分类的概率为1k∑xi∈Nk(x)I(yi!=cl)=1?1k∑xi∈Nk(x)I(yi=cl){1\over k}\sum_{x_i\in N_k(x)}I(y_i!=c_l)=1-{1\over k}\sum_{x_i\in N_k(x)}I(y_i=c_l)k1?xi?Nk?(x)?I(yi?!=cl?)=1?k1?xi?Nk?(x)?I(yi?=cl?其中l为输入的类别,类别共k类。
要是误分类率最小即经验风险最小,就要使1k∑xi∈Nk(x)I(yi=cl){1\over k}\sum_{x_i\in N_k(x)}I(y_i=c_l)k1?xi?Nk?(x)?I(yi?=cl?最大,所以多数表决规则等价于经验风险最小化

算法

对于新输入的实例,在训练集上找到与该实例最近的k个实例,这k个实例的多数属于某个类,这个行输入的实例就属于哪个类。


k邻近算法
输入:训练数据集T=(x1,y1),...,(xn,yn)T={(x_1,y_1),...,(x_n,y_n)}T=(x1?,y1?),...,(xn?,yn?),x为特征向量,yiy_iyi?为类别∈c1,c2,...,cn\in{c_1,c_2,...,c_n}c1?,c2?,...,cn?;实例特征向量x;
输出 :实例x所属的类别y

  1. 根据给定的距离度量,在训练集T中找出与x最近的k个点,涵盖k个点的x的领域记做N(x),
  2. Nk(x)N_k(x)Nk?(x)中根据分类决策规则决定x的类别y:y=argminc1∑xi∈Nk(x)I(yi=ci),i=1,2...,N;j=1,2,..,Ky=argmin_{c_1} \sum _{x_i\in N_k(x)}I(y_i=c_i),i=1,2...,N;j=1,2,..,Ky=argminc1??xi?Nk?(x)?I(yi?=ci?),i=1,2...,N;j=1,2,..,K III为指示函数,当(yi=ci)(y_i=c_i)(yi?=ci?)I=1I=1I=1,当(yi!=ci)(y_i!=c_i)(yi?!=ci?)I=0I=0I=0

实现 -kd树

实现k邻近,主要考虑对训练实例的k邻近的搜索,尤其在大数据量或特征维数较大时。

kd树

kd树是二叉树,表示对k维空间的一个划分。kd树的每个接单对应k维超矩形区域。

构造kd树:根节点对应整个空间,通过递归,生成子节点,划分区域。


构造平衡kd树
输入:k维空间数据集T={x1,x2,...,xn}T=\{x_1,x_2,...,x_n\}T={ x1?,x2?,...,xn?},其中xi=(xi1,xi2,...,xik)Tx_i=(x_i^1,x_i^2,...,x_i^k)^Txi?=(xi1?,xi2?,...,xik?)T
输出:kd树
1.构造根节点,选择x1x^1x1为坐标轴,以T中所有实例的x1x^1x1坐标的中位数为切分点,将根节点对应的超矩形空间一分为二,切分的超平面通过切分点,且与x1x^1x1轴垂直。生成两个深度为1的节点,左节点对应小于切分点的子区域,右节点对应大于切分点的区域。将落在切分超平面上的实例保存在根节点上。
2. 重复,以深度为j的节点,选择xlx^lxl为切分的坐标轴,l=j%k+1l=j\%k+1l=j%k+1,以该节点区域汇总所有实例的xlx^lxl坐标中位数为切分点,将该区域切分成两个。
3. 直到两个区域没有实例存在,停止。


通过中位数切割,树是平衡的(两边节点相等),但树平衡不代表搜索的效率是最优的。

搜索最邻近过程

  • 从根节点出发,找到包含目标的叶子节点,以此叶子为最近点
  • 递归向上退
    • 如果该节点更近,更新最近邻
    • 当前最近一点一点存在于该节点的一个子节点对于的区域,检查该子节点的父节点的其他子节点对于的区域是否有跟接近的点。
  • 回到根节点,结束 。

kd树适合训练数据远大于空间维数时的k近邻搜索,当两者接近时,效率会下降,几乎接近线性搜索。

  相关解决方案