非参数模型
非参数方法不用函数作为生成数据的基本模型,因此非参数模型的鲁棒性更好,但是也存在着很多限制。
- 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 理论基础
- 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(Y∣X=x(i)) 就会很接近 E ( Y ∣ X = x ( j ) ) \mathrm E(Y|X=\mathbf x^{(j)}) E(Y∣X=x(j)) ;
- KNN通过对 x \mathbf x x 的邻居的平均相应取平均值来近似计算 E ( Y ∣ X = x ) \mathrm E(Y|X=\mathbf x) E(Y∣X=x) ;
- KNN的偏差和方差取决于邻居数量 k k k 的选择。
1.3 模型选择
在KNN中,有一些参数需要明确指定:
- 对距离的度量(the distance metric);
- 邻居的数量 k k k;
- 相关度(重要性)预测因子;
1.3.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=1∑p(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=1∑p∣xj(i)−xj(l)∣q)1/q中的一种,其中q≥1。欧氏距离只有当预测在相同的范围内时,才有意义。
- 马氏距离(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=1∑p(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))T⋅S−1⋅(x(i)−x(l)),其中, S − 1 S^{-1} S−1为样本是协方差矩阵。
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 回归相同,在此不做重复说明。