Machine Learning
  • Introduction
  • 机器学习
    • 前言
      • 符号表
    • 监督式学习
      • 感知机
        • 感知机模型
        • 感知机学习算法
        • 算法python实现
      • Logistic回归
        • Logistic分布
        • Logistic回归模型
        • 算法python实现
      • 线性回归
        • 线性回归模型
        • 算法python实现
      • K近邻法
        • k近邻模型
        • kd树方法
        • kd树python实现
        • knn实例
      • 朴素贝叶斯法
        • 模型和原理
        • 参数估计
        • 算法和实现
      • 决策树
        • 模型与学习
        • 特征选择
        • 生成算法和剪枝
        • python实现
      • 支持向量机
    • 神经网络
      • 神经元模型和感知机
      • 神经网络
      • 神经网络的矩阵表达
      • 反向传播算法
        • 算法证明
        • 算法代码
        • 基于矩阵的计算
      • 改进神经网络的学习方法
        • 交叉熵代价函数
        • softmax
        • regularization
        • 权重初始化
      • 卷积神经网络
        • 基本介绍
    • 数学基础
      • 线性代数
        • 特征值和特征向量
      • 概率统计
        • 随机变量的特征
        • 样本统计量
        • 先验后验概率
      • 微积分
        • 向量内积
        • 方向导数和梯度
        • 梯度下降法
      • 信息论
        • 熵
        • 相对熵和交叉熵
        • 条件熵
        • 互信息
Powered by GitBook
On this page
  • 1.距离度量
  • 2. k近邻算法
  1. 机器学习
  2. 监督式学习
  3. K近邻法

k近邻模型

PreviousK近邻法Nextkd树方法

Last updated 7 years ago

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

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

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

1.距离度量

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

设特征空间XXX是nnn维实数向量空间RnR^nRn,x(i),x(j)∈Xx^{(i)},x^{(j)}\in Xx(i),x(j)∈X,x=(x0,x1,x2,...,xn)Tx=(x_0, x_1, x_2, ..., x_n)^Tx=(x0​,x1​,x2​,...,xn​)T,x(i),x(j)x^{(i)},x^{(j)}x(i),x(j)的LpL_pLp​距离定义为:

Lp(x(i),x(j))=(∑k=1n∣xk(i)−xk(j)∣p)1pL_p(x^{(i)},x^{(j)})=\big( \displaystyle\sum_{k=1}^n|x^{(i)}_k-x^{(j)}_k|^p\big)^{\frac{1}{p}}Lp​(x(i),x(j))=(k=1∑n​∣xk(i)​−xk(j)​∣p)p1​

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

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

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

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

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

L∞(x(i),x(j))=max⁡k∣xk(i)−xk(j)∣L_\infty(x^{(i)},x^{(j)})=\max_k|x^{(i)}_k-x^{(j)}_k|L∞​(x(i),x(j))=kmax​∣xk(i)​−xk(j)​∣

下图给出了ppp取不同值时,与原点的LpL_pLp​距离为111(Lp=1L_p=1Lp​=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)})\}T={(x(1),y(1)),(x(2),y(2)),...,(x(m),y(m))}

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

输出:实例xxx的所属类别yyy

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

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

y=argmax⁡cj∑xi∈Nk(x)I(yi=cj)y=arg \max_{c_j} \displaystyle\sum_{x_i\in N_k (x)} I(y_i=c_j)y=argcj​max​xi​∈Nk​(x)∑​I(yi​=cj​)

其中i=1,2,...,mi=1,2,...,mi=1,2,...,m,j=1,2,...,tj=1,2,...,tj=1,2,...,t,III为指示函数,即当yi=cjy_i=c_jyi​=cj​时为111,否则为000。

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

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

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

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

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

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

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

pic source:

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