k近邻模型

kk近邻(k-Nearest Neighbor,简称kNN)学习是一种常用的监督式学习方法,其工作机制非常简单:

给定测试样本,基于某种距离度量找出训练集中与其最靠近的kk个训练样本,然后基于这kk个“邻居”的信息来进行预测。通常,在分类任务中可使用“投票法”,即选择这kk个样本中出现最多的类别标记作为预测结果;在回归任务中可以使用“平均法”,即将这kk个样本的实值输出标记的平均值作为预测结果;还可以基于距离远近进行加权平均或加权投票,距离越近的样本权重越大。

kk近邻有个明显的不同之处:它似乎没有显示的训练过程。事实上,它是“懒惰学习”(lazy learning)的著名代表,此类学习技术在训练阶段仅仅是把样本保存起来,训练时间开销为0,待收到测试样本后再进行处理,这种称为“急切学习”。

pic source: https://helloacm.com/a-short-introduction-to-k-nearest-neighbors-algorithm/

1.距离度量

特征空间中两个实例点的距离是两个实例点的相似度的反映。kk近邻模型的特征空间一般是nn维实数向量空间RnR^n。使用的距离是欧式距离,但也可以使其他距离,比如更一般的LpL_p距离(LpL_p distance),或Minkowski距离。

设特征空间XXnn维实数向量空间RnR^nx(i),x(j)Xx^{(i)},x^{(j)}\in Xx=(x0,x1,x2,...,xn)Tx=(x_0, x_1, x_2, ..., x_n)^Tx(i),x(j)x^{(i)},x^{(j)}LpL_p距离定义为:

Lp(x(i),x(j))=(k=1nxk(i)xk(j)p)1p L_p(x^{(i)},x^{(j)})=\big( \displaystyle\sum_{k=1}^n|x^{(i)}_k-x^{(j)}_k|^p\big)^{\frac{1}{p}}

这里p1p \geqslant 1。当p=2p=2时,称为欧式距离(Euclidean distance),即

L2(x(i),x(j))=(k=1nxk(i)xk(j)2)12 L_2(x^{(i)},x^{(j)})=\big( \displaystyle\sum_{k=1}^n|x^{(i)}_k-x^{(j)}_k|^2\big)^{\frac{1}{2}}

p=1p=1时,称为曼哈顿距离(Manhanttan distance),即

L1(x(i),x(j))=k=1nxk(i)xk(j) L_1(x^{(i)},x^{(j)})=\displaystyle\sum_{k=1}^n|x^{(i)}_k-x^{(j)}_k|

p=p=\infty时,它是各个坐标距离的最大值,即:

L(x(i),x(j))=maxkxk(i)xk(j) L_\infty(x^{(i)},x^{(j)})=\max_k|x^{(i)}_k-x^{(j)}_k|

下图给出了pp取不同值时,与原点的LpL_p距离为11Lp=1L_p=1)的图形。

2. k近邻算法

输入:训练集

T={(x(1),y(1)),(x(2),y(2)),...,(x(m),y(m))} T=\{(x^{(1)},y^{(1)}),(x^{(2)},y^{(2)}),...,(x^{(m)},y^{(m)})\}

其中x(i)X=Rnx^{(i)}\in X= R^n为实例的特征向量,y(i)Y={c1,c2,...,ct}y^{(i)}\in Y=\{c_1, c_2, ...,c_t\}为实例的类别,i=1,2,...,mi=1,2,...,m。某个实例特征向量xx

输出:实例xx的所属类别yy

1)根据给定的距离度量,在训练集TT中找出与xx最邻近的kk个点,涵盖这kk个点的邻域记作Nk(x)N_k (x)

2)在Nk(x)N_k (x)中根据分类决策规则(如多数表决)决定xx的类别:

y=argmaxcjxiNk(x)I(yi=cj) y=arg \max_{c_j} \displaystyle\sum_{x_i\in N_k (x)} I(y_i=c_j)

其中i=1,2,...,mi=1,2,...,mj=1,2,...,tj=1,2,...,tII为指示函数,即当yi=cjy_i=c_j时为11,否则为00

kk近邻的特殊情况是k=1k=1的情形,称为最近邻算法。对于输入的实例点xx,最近邻算法将训练数据集中与xx 最近的类作为xx 的类。

kk值的选择会对kk近邻法的结果产生重大影响。

如果选择较小的kk值,“学习”的估计误差(estmation error)会增大,预测的结果会对近邻的节点比较敏感。

如果寻则较大的kk值,“学习”的近似误差(approximation error)会增大,与输入实例较远的训练实例也会对预测起作用,使预测发生错误。

实际中,kk一般取一个比较小的数值,并采用交叉验证法来选取最优的kk值。

k近邻法最简单的办法就是线性扫描(linear scan),这时要计算输入实例和每一个训练实例的距离,当训练集很大时,非常耗时,这种方法不可行。

下面介绍kdkd树(kdkd tree)方法。

results matching ""

    No results matching ""