1283 字
6 分钟
[模式识别与机器学习] 非线性分类器

距离函数#

欧氏距离#

d(x,y)=i=1n(xiyi)2d(\mathbf{x}, \mathbf{y}) = \sqrt{\sum_{i=1}^n (x_i - y_i)^2}

曼哈顿距离#

d(x,y)=i=1nxiyid(\mathbf{x}, \mathbf{y}) = \sum_{i=1}^n |x_i - y_i|

明氏距离#

d(x,y)=(i=1nxiyip)1/pd(\mathbf{x}, \mathbf{y}) = \left( \sum_{i=1}^n |x_i - y_i|^p \right)^{1/p}

马氏距离#

d(x,y)=(xy)TΣ1(xy)d(\mathbf{x}, \mathbf{y}) = \sqrt{(\mathbf{x} - \mathbf{y})^T \mathbf{\Sigma}^{-1} (\mathbf{x} - \mathbf{y})}
  • Σ\mathbf{\Sigma}:协方差矩阵,反映数据的分布和相关性
  • Σ=I\mathbf{\Sigma}=\mathbf{I} 时,马氏距离退化为欧氏距离
  • Cholesky分解:Σ=LLT\mathbf{\Sigma} = \mathbf{L}\mathbf{L}^TL1x\mathbf{L}^{-1}\mathbf{x} 的欧氏距离等价于 x\mathbf{x} 的马氏距离

海明距离#

d(x,y)=i=1nδ(xi,yi)d(\mathbf{x}, \mathbf{y}) = \sum_{i=1}^n \delta(x_i, y_i)

其中 δ(xi,yi)\delta(x_i, y_i) 是一个指示函数,当 xiyix_i \neq y_i 时为 1,否则为 0。

角度相似函数#

d(x,y)=xTyxyd(\mathbf{x}, \mathbf{y}) = \frac{\mathbf{x}^T\mathbf{y}}{\|\mathbf{x}\| \|\mathbf{y}\|}

最近邻分类器#

k-最近邻算法#

对于一个新的输入样本,找到训练集中距离最近的k个样本,根据这k个样本的类别进行投票,决定新样本的类别。

k=1k=1 时,称为最近邻分类器,边界复杂易受噪声影响。kk较大时,边界更平滑但可能丢失细节。

Voronoi网格#

将输入空间划分为若干个区域,每个区域对应一个训练样本,区域内的所有点都被分类为该样本的类别。Voronoi网格的边界就是最近邻分类器的决策边界。

多层感知机(MLP)#

反向传播算法#

设输入层有 nn 个神经元,隐藏层有 hh 个神经元,输出层有 mm 个神经元。

我们需要得到第ii层的梯度JW(i)\frac{\partial J}{\partial \mathbf{W}^{(i)}},其中 JJ 是损失,W(i)\mathbf{W}^{(i)} 是第ii层的权重。

根据链式法则:

JW(i)=Jz(i)z(i)W(i)\frac{\partial J}{\partial \mathbf{W}^{(i)}} = \frac{\partial J}{\partial \mathbf{z}^{(i)}} \cdot \frac{\partial \mathbf{z}^{(i)}}{\partial \mathbf{W}^{(i)}}

z(i)\mathbf{z}^{(i)} 是第ii层的线性输出,z(i)=W(i)a(i1)+b(i)\mathbf{z}^{(i)} = \mathbf{W}^{(i)} \mathbf{a}^{(i-1)} + \mathbf{b}^{(i)},其中 a(i1)\mathbf{a}^{(i-1)} 是第i1i-1层的激活输出(也是第ii层的输入)。

所以:

z(i)W(i)=a(i1)\frac{\partial \mathbf{z}^{(i)}}{\partial \mathbf{W}^{(i)}} = \mathbf{a}^{(i-1)}

则:

JW(i)=Jz(i)a(i1)\frac{\partial J}{\partial \mathbf{W}^{(i)}} = \frac{\partial J}{\partial \mathbf{z}^{(i)}} \cdot \mathbf{a}^{(i-1)}

Jz(i)\dfrac{\partial J}{\partial \mathbf{z}^{(i)}}被称作第ii层的局部误差

ii是最后一层时,则Jz(i)\frac{\partial J}{\partial \mathbf{z}^{(i)}} 可以直接计算;若ii不是最后一层,则从最后一层开始,逐层向前计算Jz(i)\frac{\partial J}{\partial \mathbf{z}^{(i)}},直到计算到第ii层。

Jz(i1)=Jz(i)z(i)a(i1)a(i1)z(i1)=(W(i))TJz(i)σ(z(i1))\begin{aligned} \frac{\partial J}{\partial \mathbf{z}^{(i-1)}} &= \frac{\partial J}{\partial \mathbf{z}^{(i)}} \cdot \frac{\partial \mathbf{z}^{(i)}}{\partial \mathbf{a}^{(i-1)}} \cdot \frac{\partial \mathbf{a}^{(i-1)}}{\partial \mathbf{z}^{(i-1)}} \\ &= (\mathbf{W}^{(i)})^T \cdot \frac{\partial J}{\partial \mathbf{z}^{(i)}} \cdot \sigma'(\mathbf{z}^{(i-1)}) \end{aligned}
TIP

a(i1)z(i1)\dfrac{\partial \mathbf{a}^{(i-1)}}{\partial \mathbf{z}^{(i-1)}}就是激活函数的导数

z(i)=W(i)a(i1)+b(i)z^{(i)} = W^{(i)} a^{(i-1)} + b^{(i)},所以z(i)a(i1)=W(i)\dfrac{\partial \mathbf{z}^{(i)}}{\partial \mathbf{a}^{(i-1)}} = W^{(i)}

决策树#

一直问”是A还是B”来缩小范围,叶节点就是答案。

信息增益(ID3)#

选让分完后数据最不混乱的那个特征来分类

衡量混乱程度(详见特征提取),数据集 DD 的熵:

H(D)=kpklog2pkH(D) = -\sum_{k} p_k \log_2 p_k

pkp_k 是第 kk 类占的比例。熵越大越乱,全是同一类时熵=0。

按特征 AA 的每个取值 vv 把数据分成若干子集 DvD^v,各子集的熵加权平均就是条件熵

H(DA)=vDvDH(Dv)H(D|A) = \sum_{v} \frac{|D^v|}{|D|} H(D^v)
  • D|D|:总样本数
  • Dv|D^v|:特征 A=vA=v 的样本子集的样本数
  • DvD\dfrac{|D^v|}{|D|}A=vA=v 的样本占全部的比重
  • H(Dv)H(D^v):样本子集自己的熵

信息增益 = 划分前熵 - 划分后熵,越大说明这个特征分得越好:

Gain(D,A)=H(D)H(DA)\text{Gain}(D, A) = H(D) - H(D|A)

增益率(C4.5)#

ID3的缺点:过于偏好取值多的特征(比如”编号/ID”这种每个样本值都不同,增益直接拉满但不泛化)。C4.5引入固有值来惩罚取值多的特征,增益除以它进行校正:

IV(A)=vDvDlog2DvDGainRatio(D,A)=Gain(D,A)IV(A)\text{IV}(A) = -\sum_{v} \frac{|D^v|}{|D|} \log_2 \frac{|D^v|}{|D|} \\[1em] \text{GainRatio}(D, A) = \frac{\text{Gain}(D, A)}{\text{IV}(A)}

基尼指数(CART)#

CART用基尼值代替熵H(D)H(D),计算更简单:

Gini(D)=1kpk2Gini(DA)=vDvDGini(Dv)\text{Gini}(D) = 1 - \sum_k p_k^2 \\[1em] \text{Gini}{(D|A)} = \sum_v \frac{|D^v|}{|D|} \text{Gini}(D^v)

纯的类基尼=0(全是同一类),最乱时接近0.5。

核方法#

根据线性分类器的判别函数(非增广形式):

g(x)=wTx+w0g(\mathbf{x}) = \mathbf{w}^T\mathbf{x} + w_0

又根据感知器算法和SVM算法的权重更新规则:

w0w0+ηyiw_0 \leftarrow w_0 + \eta y_i
ww+ηyixi\mathbf{w} \leftarrow \mathbf{w} + \eta y_i \mathbf{x}_i

可以发现最优解w\mathbf{w}w0w_0可以表示为训练样本的线性组合:

w=i=1Nαixi\mathbf{w} = \sum_{i=1}^N \alpha_i \mathbf{x}_i

SVM时大多数αi=0\alpha_i=0,只有支持向量对应的αi\alpha_i非零

w\mathbf{w}代入判别函数:

g(x)=(i=1Nαixi)Tx+w0=i=1Nαi(xTxi)+w0\begin{aligned} g(\mathbf{x}) &= \left (\sum_{i=1}^N \alpha_i \mathbf{x}_i \right )^T \mathbf{x} + w_0 \\[1em] &= \sum_{i=1}^N \alpha_i(\mathbf{x}^T \mathbf{x}_i) + w_0 \end{aligned}

因此只要得到训练样本之间的内积xTxi\mathbf{x}^T \mathbf{x}_i,就可以计算判别函数的值。

为了处理非线性可分问题,可以将输入空间映射到一个高维特征空间:

ϕ:RnRm\phi: \mathbb{R}^n \rightarrow \mathbb{R}^m

但是这个映射的计算非常昂贵。核方法的核心思想是引入一个核函数K(x,y)K(\mathbf{x}, \mathbf{y}),直接计算输入空间中的内积在特征空间中的值:

K(x,y)=ϕ(x)Tϕ(y)K(\mathbf{x}, \mathbf{y}) = \phi(\mathbf{x})^T \phi(\mathbf{y})

常用的核函数包括:

  • 线性核:K(x,y)=xTyK(\mathbf{x}, \mathbf{y}) = \mathbf{x}^T \mathbf{y}
  • 多项式核(Polynomial Kernel):K(x,y)=(xTy+c)dK(\mathbf{x}, \mathbf{y}) = (\mathbf{x}^T \mathbf{y} + c)^d
  • 径向基函数核(Gaussian RBF):K(x,y)=exp(γxy2)K(\mathbf{x}, \mathbf{y}) = \exp(-\gamma \|\mathbf{x} - \mathbf{y}\|^2)
  • Sigmoid核:K(x,y)=tanh(κxTy+c)K(\mathbf{x}, \mathbf{y}) = \tanh(\kappa \mathbf{x}^T \mathbf{y} + c)
  • Inverse Multiquadratic核:K(x,y)=1xy2+c2K(\mathbf{x}, \mathbf{y}) = \frac{1}{\sqrt{\|\mathbf{x} - \mathbf{y}\|^2 + c^2}}
TIP

tanh(x)=exexex+ex\tanh(x) = \dfrac{e^x - e^{-x}}{e^x + e^{-x}}

当输入较大时,输出接近1;当输入较小时,输出接近-1

使用核函数后,判别函数可以表示为:

g(x)=i=1NαiK(x,xi)+w0g(\mathbf{x}) = \sum_{i=1}^N \alpha_i K(\mathbf{x}, \mathbf{x}_i) + w_0

基于核方法的Logistic回归#

P(G=kx)=exp(βk0+i=1NαkiK(xi,x))1+l=1K1exp(βl0+i=1NαliK(xi,x))P(G=Kx)=11+l=1K1exp(βl0+i=1NαliK(xi,x))\begin{aligned} P(G=k|\mathbf{x}) &= \frac{\exp(\beta_{k0} + \sum_{i=1}^N \alpha_{ki} K(\mathbf{x}_i, \mathbf{x}))}{1 + \sum_{l=1}^{K-1} \exp(\beta_{l0} + \sum_{i=1}^N \alpha_{li} K(\mathbf{x}_i, \mathbf{x}))} \\[1em] P(G=K|\mathbf{x}) &= \frac{1}{1 + \sum_{l=1}^{K-1} \exp(\beta_{l0} + \sum_{i=1}^N \alpha_{li} K(\mathbf{x}_i, \mathbf{x}))} \end{aligned}
[模式识别与机器学习] 非线性分类器
https://alkaid114.github.io/posts/ml/nonlinear_classifier/
作者
Alkaid114
发布于
2026-06-17
许可协议
CC BY-NC-SA 4.0