本文是基于《集成学习 基础与算法》的学习笔记。
文章大部分内容来自于网络的各种博客总结,本博文仅仅作为本人学习笔记,不做商业用途。
1.2 常用学习算法
1.2.3 神经网络
神经网络 (Neural Network), 上图所示的是多层前馈网络 (multi-layer feed-forward network)。输入层接收输入特征向量,输出层输出标记,输入层和输出层之间的层被称为隐层。
最常用的训练思路是梯度下降 (gradient descent) 方法。
误差逆传播算法 (BP) 是最为成功的神经网络训练算法。输入经过输出层、隐层前馈计算到达输出层,在输出层种对网络输出和样本标记进行比较并计算误差;然后,这些误差再经过隐层反向传播回输入层,在传播的过程中算法会调整连接权重和激发阈值以降低误差。整个过程按梯度方向调节各个参数的值,并执行多轮,直到训练误差减小到预定目标范围。
1.2.4 朴素贝叶斯
为了对测试样例
x
\mathbf{x}
x 进行分类,学习算法可以通过构建概率模型来估计后验概率
P
(
y
∣
x
)
P(y|\mathbf{x})
P(y∣x),并选取具有最大后验概率值的
y
y
y 作为输出;这就是最大后验概率 (maximum a posteriori, MAP) 准则。基于贝叶斯定理,
P
(
y
∣
x
)
=
P
(
x
∣
y
)
P
(
y
)
P
(
x
)
\begin{aligned} &P(y|\mathbf{x}) ={P(\mathbf{x}|y)P(y)}\over{P(\mathbf{x})}\\ \end{aligned}
P(x)P(y∣x)=P(x∣y)P(y)
P
(
y
)
P(y)
P(y) 可以通过计算训练数据集中每个类的比例获得。
P
(
x
)
P(\mathbf{x})
P(x) 由于是在同一个
x
x
x 上比较不同
y
y
y,可被忽略。
仅需考虑
P
(
x
∣
y
)
P(\mathbf{x}|y)
P(x∣y) ,为此,需要引入一些假设。
朴素贝叶斯分类器 (naive Bayes classifier) 假设给定类别标记,
n
n
n 个特征之间是独立的。因此,
P
(
(
x
)
∣
y
)
=
∏
i
=
1
n
P
(
x
i
∣
y
)
\begin{aligned} &P((\mathbf{x})|y) =\prod_{i=1}^nP(x_i|y) \\ \end{aligned}
P((x)∣y)=i=1∏nP(xi∣y)这意味着,仅需在每个类内部计算每个特征取值的比例,从而避免了对联合概率的估计。
在训练阶段,朴素贝叶斯分类器对所有类比
y
∈
Y
y \in Y
y∈Y 估计
P
(
y
)
P(y)
P(y),并对所有特征
x
i
x_i
xi 估计
P
(
x
i
∣
y
)
P (x_i|y)
P(xi∣y)。在测试极端,在所有类别标记中,朴素贝叶斯分类器通过最大化
P
(
y
∣
x
)
∝
P
(
y
)
∏
i
=
1
n
P
(
x
i
∣
y
)
\begin{aligned} &P(y|\mathbf{x}) \propto P(y)\prod_{i=1}^nP(x_i|y) \\ \end{aligned}
P(y∣x)∝P(y)i=1∏nP(xi∣y)选择测试样例
x
\mathbf{x}
x 的类别标记。
1.2.5 k-近邻
k-近邻 (k-NN) 算法的基本假设是输入空间中相似的样本在输出空间中也应该相似。是一个懒惰学习 (lazy learning) 方法。测试时,对测试样例
x
x
x ,k-近邻算法在训练样本中寻找与测试样本最近的 k 个近邻。对分类任务,测试样例被分类为 k 个近邻样本中的投票最高的类别;对回归任务,测试样例被预测为 k 个近邻样本的标记的均值。
k = 3时,绿圆被分类为红色三角形;k = 5时,绿圆被分类为蓝色正方形。
1.2.6 支持向量机和核方法
参考 https://zhuanlan.zhihu.com/p/91349895
假设数据如上图所示,我们希望找到一条位于红聚类和绿聚类之间的直线来分割数据。
显然右侧的分割线比左侧的好,第二条线在正确分割训练数据的前提下,尽可能地同时远离两个聚类。因而能在测试集上取得更好的概括性。
SVM 试图找到第二条线:
- 找到正确分类训练数据的一组直线。
- 在找到的所有直线中,选择那条离最接近的数据点距离最远的直线。
距离最接近的数据点称为支持向量 (support vector)。支持向量定义的沿着分隔线的区域称为间隔(margin)。
尽管上图显示的是直线和二维数据,SVM 实际上适用于任何维度。在更高维度下,SVM 寻找一个超平面(hyperplane)——二维直线和三维平面在任意维度上的推广。
可以被一条直线(更一般的,一个超平面)分割的数据称为线性可分 (linearly separable) 数据。超平面起到线性分类器 (linear classifier) 的作用。
SVM 允许我们通过参数 C 指定愿意接受多少误差。C 让我们可以指定以下两者的折衷:
- 较宽的间隔
- 正确分类训练数据。C 值较高,意味着训练数据上容许的误差较少。
上图中,C=0.01 的图像看起来更好的捕捉了一般的趋势,尽管和高C值情形相比,他在训练数据上的精确度较低。
接下来来看一个非线性可分的例子:
其中的斜线是 SVM 找到的线性分类器。显然线性分类不是一个合适的结果,那么我们应该将数据投影到一个线性可分的空间,然后在那个空间寻找超平面。
我们将上图中的数据投影到一个三维空间:
让我们在其上运行SVM:
现在让我们将这个平面投影到原本的二维空间:
映射回原始空间后,分割边界不再是线性的了。不过,我们关于线性分割、间隔、支持向量的直觉在投影空间仍然成立。
下面来介绍 核 (kernals) 和 核函数:
假设训练数据集包含
n
n
n 个数据点,其中每个数据点用一个元组表示
(
x
i
,
y
i
)
(x_i, y_i)
(xi,yi) ,其中
x
i
x_i
xi 为表示数据点的向量,
y
i
y_i
yi 为数据点的分类/标签(不妨令
y
i
y_i
yi 的取值为-1或1)。那么,分割超平面就可以表示为:
w
x
−
b
=
0
\begin{aligned} &wx-b=0 \\ \end{aligned}
wx−b=0其中,
w
w
w 为超平面的法向量。
将某一数据点
x
i
x_i
xi 代入
w
x
−
b
wx-b
wx−b 后,根据所得结果的正负,就可以判断数据点的分类。
相应地,确定间隔的两个超平面则可以表示为
w
x
−
b
=
1
\begin{aligned} &wx-b=1 \\ \end{aligned}
wx−b=1
w
x
−
b
=
−
1
\begin{aligned} &wx-b=-1 \\ \end{aligned}
wx−b=−1
这两个超平面之间的距离,也就是间隔的宽度为
2
/
∥
w
∥
2/\| w \|
2/∥w∥
SVM 的目标是在正确分类的前提下,最大化间隔宽度,也就是说,在满足
y
i
(
w
x
i
−
b
)
>
=
1
y_i(wx_i-b)>=1
yi(wxi−b)>=1 的前提下,最大化
2
/
∥
w
∥
2/\| w \|
2/∥w∥ ,也就是最小化
∥
w
∥
\| w \|
∥w∥ 。
上式中,所有数据点都要满足。但实际上,并不需要为所有数据点进行计算,只需要为所有支持向量计算即可。另外,上式中,我们乘上了 y i y_i yi ,这就同时保证了间隔两侧的数据点都符合要求。
下面我们需要使用一些更深入的数学。显然,最小化
∥
w
∥
\| w \|
∥w∥ 等价于最小化
m
i
n
1
2
∥
w
∥
2
\begin{aligned} &min\frac{1}{2}\| w \|^2 \\ \end{aligned}
min21∥w∥2
不过,通过拉格朗日对偶(Lagrange Duality)变换,可以进一步将其转换为对偶变量(dual variable)优化问题:
然后可以找出更高效的求解方法:(这里略去具体推导过程)
另外,在推导过程中,我们得到了一个中间结果,
w
w
w 可以通过下式计算:
你可以不用在意以上公式的细节,只需注意一点,以上计算都是基于向量的内积。也就是说,无论是超平面的选取,还是确定超平面后分类测试数据点,都只需要计算向量的内积。
而核函数 (kernel function) 正是算内积的。核函数接受原始空间中两个数据点作为输入,可以直接给出投影空间中的点积。
在大型数据集上,核函数节省的算力将飞速累积。这是核函数的巨大优势。
大多数SVM库内置了流行的核函数,比如多项式(Polynomial)、径向基函数(Radial Basis Function,RBF)、Sigmoid。当我们不进行投影时(比如本文的第一个例子),我们直接在原始空间计算点积——我们把这叫做使用线性核(linear kernel)。