K近邻法(KNN)

本文详细介绍了非参数模型中的K近邻(KNN)方法,包括KNN在回归和分类问题中的应用。在回归中,KNN通过计算最近邻的平均响应值进行预测;在分类中,采用邻居的类别投票决定预测类别。KNN的关键参数包括邻居数量k、距离度量和权重函数等,其选择直接影响模型性能。同时,KNN在高维数据和大数据集上可能面临计算性能挑战。最后,文章提到了sklearn库中KNN的实现细节。
摘要由CSDN通过智能技术生成

非参数模型

非参数方法不用函数作为生成数据的基本模型,因此非参数模型的鲁棒性更好,但是也存在着很多限制。

  • KNN可用于分类或回归问题;
  • KNN不需要样本的分布假设;
  • KNN多数时候被认为是一个监督学习方法。

1. KNN 用于回归

1.1 K近邻法(K-nearest neighbours,KNN)

给定训练集样本 D = { ( y ( i ) , x ( i ) ) } i = 1 N \displaystyle \mathcal D=\{(y^{(i)},\mathbf x^{(i)})\}^N_{i=1} D={(y(i),x(i))}i=1N,在给定输入点 x \mathbf x x 时预测因变量 y y y

该问题可以被定义为: f ^ ( x ) = 1 k ∑ x ( i ) ∈ N k ( x , D ) y ( i ) \displaystyle \hat f(\mathbf x)=\frac{1}{k}\sum_{\mathbf x^{(i)}\in N_k(\mathbf x, \mathcal D)}y^{(i)} f^(x)=k1x(i)Nk(x,D)y(i),其中 N k ( x , D ) N_k(\mathbf x, \mathcal D) Nk(x,D) 是在 { x ( i ) } i = 1 N \{\mathbf x^{(i)}\}^N_{i=1} {x(i)}i=1N 中最接近 x \mathbf x x k k k 个点。

因此,kNN 预测的结果是最接近查询点 x x x 的 k 个训练响应值的样本平均值(即 KNN对输入 x x x 的预测结果是接近 x x x 的训练样本中标签类别最多的类别)。

1.2 理论基础

  1. KNN的理论基础是 隐式连续假设(implicit continuity assumption),即如果 x ( i ) \mathbf x^{(i)} x(i) 很接近 x ( j ) \mathbf x^{(j)} x(j) ,那么在平方损失下的最优预测的期望 E ( Y ∣ X = x ( i ) ) \mathrm E(Y|X=\mathbf x^{(i)}) E(YX=x(i)) 就会很接近 E ( Y ∣ X = x ( j ) ) \mathrm E(Y|X=\mathbf x^{(j)}) E(YX=x(j))
  2. KNN通过对 x \mathbf x x 的邻居的平均相应取平均值来近似计算 E ( Y ∣ X = x ) \mathrm E(Y|X=\mathbf x) E(YX=x)
  3. KNN的偏差和方差取决于邻居数量 k k k 的选择。

1.3 模型选择

在KNN中,有一些参数需要明确指定:

  • 对距离的度量(the distance metric);
  • 邻居的数量 k k k
  • 相关度(重要性)预测因子;

1.3.1 距离度量

  1. 欧氏距离(The Euclidean distance) d ( x ( i ) , x ( l ) ) = ∑ j = 1 p ( x j ( i ) − x j ( l ) ) 2 \displaystyle d(\mathbf x^{(i)},\mathbf x^{(l)})=\sqrt{\sum^p_{j=1}(x^{(i)}_j-x^{(l)}_j)^2} d(x(i),x(l))=j=1p(xj(i)xj(l))2 ,也被称为 l 2 l2 l2 范数,其是明氏距离 d ( x ( i ) , x ( l ) ) = ( ∑ j = 1 p ∣ x j ( i ) − x j ( l ) ∣ q ) 1 / q 中 的 一 种 , 其 中 q ≥ 1 \displaystyle d(\mathbf x^{(i)},\mathbf x^{(l)})=(\sum^p_{j=1}|x^{(i)}_j-x^{(l)}_j|^q)^{1/q} 中的一种,其中q\ge1 d(x(i),x(l))=(j=1pxj(i)xj(l)q)1/q,q1。欧氏距离只有当预测在相同的范围内时,才有意义。
  2. 马氏距离(Mahalanobis distance) d ( x ( i ) , x ( l ) ) = ∑ j = 1 p ( ( x j ( i ) − x j ( l ) ) s x j ) 2 \displaystyle d(\mathbf x^{(i)},\mathbf x^{(l)})=\sqrt{\sum^p_{j=1}(\frac{(x^{(i)}_j-x^{(l)}_j)}{s_{x_j}})^2} d(x(i),x(l))=j=1p(sxj(xj(i)xj(l)))2 ,其中, s x j s_{x_j} sxj 是训练样本在维度 j j j 上的标准差。
    马氏距离以矩阵形式表达为: d ( x ( i ) , x ( l ) ) = ( x ( i ) − x ( l ) ) T ⋅ S − 1 ⋅ ( x ( i ) − x ( l ) ) \displaystyle d(\mathbf x^{(i)},\mathbf x^{(l)})=\sqrt{(\mathbf x^{(i)}-\mathbf x^{(l)})^T\cdot S^{-1}\cdot (\mathbf x^{(i)}-\mathbf x^{(l)})} d(x(i),x(l))=(x(i)x(l))TS1(x(i)x(l)) ,其中, S − 1 S^{-1} S1为样本是协方差矩阵。

1.3.2 邻居数量 k

  • 邻居数量 k k k 是超参数,需要在学习过程之前指定;
  • 不能使用训练数据来进行 k k k 的选择,因为这样的话总是会趋于选择 k = 1 k=1 k=1 来完美的拟合数据;
  • k k k 越小,偏差就会越小,因为回归函数选择的邻居点是非常接近于预测点的。但是, k k k 越小,意味着对数据整体的观测就越少,这会导致大的方差,会导致 过拟合
  • 随着 k k k 的增大,方差会减小,但是偏差会变大,这会导致 欠拟合

如下图所示,黑色直线为目标的回归曲线,红色为样本点,蓝色为KNN的预测曲线,左图为 k = 1 k=1 k=1 时的结果,右图为 k = 9 k=9 k=9 时的结果。

在这里插入图片描述

1.4 KNN 和 线性回归的比较

  • 对于线性情况,线性回归的效果比KNN要好一点;但对于非线性情况,KNN的效果要比线性回归好。如下图所示,左侧图为实际曲线与拟合曲线,蓝色曲线为 k = 1 k=1 k=1 时的拟合曲线,红色为 k = 9 k=9 k=9 时的拟合曲线,黑色曲线为目标曲线;右侧图中黑色虚线为线性回归在测试集上预测得到的最小均方误差(MSE),绿色点曲线为MSE随着 1 / k 1/k 1/k 的变化曲线:
    在这里插入图片描述

  • 随着数据集中数据维度的增加(即 x \mathbf x x 的维度 p p p ),KNN的效果越来越差。事实上,随着维度的增加,线性回归在测试集上的MSE增加,但是影响不大;但是对KNN的影响很大,MSE急速增大。如下图所示,数据维度与 1 / k 1/k 1/k 之间 MSE的变化关系,黑色虚线代表线性回归的MSE,绿色虚线代表KNN 的MSE。
    在这里插入图片描述
    这是因为,随着维度的增大,在高维空间中,很难找到一个点的附近邻居,即 维度灾难。而维度灾难是非参数方法都会面临的问题。

2. KNN用于分类

2.1 数学描述

KNN估计属于类别 c c c 的条件概率为:

p c ( x ) = 1 k ∑ x ( i ) ∈ N k ( x , D ) I ( y ( i ) = c ) \displaystyle p_c(\mathbf x)=\frac{1}{k}\sum_{\mathbf x^{(i)}\in N_k(\mathbf x, \mathcal D)}I(y^{(i)}=c) pc(x)=k1x(i)Nk(x,D)I(y(i)=c),其中 N k ( x , D ) N_k(\mathbf x, \mathcal D) Nk(x,D) 是在 { x ( i ) } i = 1 N \{\mathbf x^{(i)}\}^N_{i=1} {x(i)}i=1N 中最接近 x \mathbf x x k k k 个点。

  • KNN 方法找到最接近 x \mathbf x x 的 k 个训练点,然后计算条件概率作为属于 c 类的点的概率;
  • KNN 分类器是贝叶斯分类器的非参数近似;
  • KNN 分类器中, k k k 的选择很关键(交叉验证);

2.2 超参数 K 的选择

如 KNN回归一样, k 过小,容易导致过拟合;k 过大,容易导致欠拟合。如下图所示,黑线代表 KNN决策分类边界,紫色曲线代表理想中正确的分类边界。
在这里插入图片描述
同样的,KNN分类器也会受到 维度灾难的影响。

3. KNN的计算性能

  • KNN 是一种内存密集型方法。它要求我们将整个训练样本保存在内存中,以便进行计算预测;
  • 生成预测需要大量计算。对于每个新的输入点,我们需要计算到所有训练点的距离,并对这些值进行排序。而线性回归的计算预测成本是较低的;
  • 排序算法需要大量计算,其算法复杂度正比于 N l o g ( N ) Nlog(N) Nlog(N),因此 KNN不适于大数据集。

4. sklearn库中的KNN算法

4.1 KNN 回归

机器学习算法库中KNN回归,通过对训练集中最近邻域的目标进行局部插值来预测目标。其函数API接口如下:

sklearn.neighbors.KNeighborsRegressor(n_neighbors=5, *, 
										weights='uniform', 
										algorithm='auto', 
										leaf_size=30, 
										p=2, 
										metric='minkowski', 
										metric_params=None, 
										n_jobs=None)

各项参数含义如下:

参数1:n_neighbors,int类型, default=5;KNN算法中默认的邻居数量

参数2:weights,字符串型,default='uniform';在预测中使用的权重函数,可选参数有:
			'uniform',均匀权重,即所有的邻居采用相同的权重;
			'distance',权重是距离的倒数,即距离近的邻居对决策有着更大的影响;
			[callable],用户自定义的函数,它接受一个距离数组,并返回一个包含权重的相同形状的数组;

参数3:algorithm,字符串型, default='auto';用于计算最近邻的算法,可选算法有:
			'ball_tree', 使用 BallTree;
			'kd_tree',使用 KDTree;
			'brute',使用暴力搜索;
			'auto',尝试根据传递给 fit 方法的值来决定最合适的算法。
	注意:稀疏输入将覆盖这个参数的设置,使用蛮力 'brute'。
			
参数4: leaf_size,int类型, default=30;传递给 BallTree 或 KDTree的叶子大小。
		这会影响构造和查询的速度,以及存储树所需的内存;
		最优值取决于问题的性质。

参数5, p,int, default=2;明氏距离的幂参数,可为任意整数。
			当 p = 1时,相当于取曼哈顿距离(L1范数);
			当 p = 2时,相当于欧氏距离(L2范数);

参数6,metric,str类型, default='minkowski';默认为明示距离。

参数7,metric_params,dict类型, default=None;度量函数的其他关键字参数。


参数8:n_jobs,int类型, default=None。
	设定用于计算的cpu核数量。如果 n_tragets > 1,而变量 X 又是稀疏的;或者如果 positive=True 时,会在大问题时提供加速。
	n_jobs = None 表示 核数量为1;
	n_jobs = -1 时,表示cpu中所有的核都参与工作。

参数6的可选类型有:
(1)实数向量空间中的距离度量:
在这里插入图片描述
(2)用于二维向量空间的度量:
在这里插入图片描述

(3)整数向量空间中的距离度量:
在这里插入图片描述

4.2 KNN分类

机器学习算法库中KNN分类,通过对训练集中最近邻域的目标进行局部邻居投票来执行分类。其函数API接口如下:

sklearn.neighbors.KNeighborsClassifier(n_neighbors=5, *, 
										weights='uniform', 
										algorithm='auto', 
										leaf_size=30, 
										p=2, 
										metric='minkowski', 
										metric_params=None, 
										n_jobs=None)

其参数含义与 KNN 回归相同,在此不做重复说明。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值