Machine Learning 学习笔记(中)
- 9 神经网络的学习-Neural Networks: Learning
- 10 应用机器学习的建议-Advice for Applying Machine Learning
- 11 机器学习系统的设计-Machine Learning System Design
- 12 支持向量机-Support Vector Machines
- 13 聚类-Clustering
- 14 降维-Dimensionality Reduction
- 14.1 动机一:数据压缩- Motivation I\_ Data Compression
- 14.2 动机二:数据可视化-Motivation II\_ Visualization
- 14.3 主成分分析问题-Principal Component Analysis Problem Formulation
- 14.4 主成分分析算法- Principal Component Analysis Algorithm
- 14.5 选择主成分的数量-Choosing The Number Of Principal Components
- 14.6 重建的压缩表示- Reconstruction from Compressed Representation
- 14.7 主成分分析法的应用建议-Advice for Applying PCA
- 15 异常检测-Anomaly Detection
- 15.1 问题的动机-Problem Motivation
- 15.2 高斯分布- Gaussian Distribution
- 15.3 算法-Algorithm
- 15.4 开发和评价一个异常检测系统- Developing and Evaluating an Anomaly Detection System
- 15.5 异常检测与监督学习对比-Anomaly Detection vs. Supervised Learning
- 15.6 选择特征- Choosing What Features to Use
- 15.7 多元高斯分布(选修)-Multivariate Gaussian Distribution (Optional)
- 15.8 使用多元高斯分布进行异常检测(可选)-Anomaly Detection using the Multivariate Gaussian Distribution (Optional)
吴恩达机器学习网易云课堂地址https://study.163.com/course/introduction/1210076550.htm
9 神经网络的学习-Neural Networks: Learning
9.1 代价函数-Cost Function
新的符号表示:
假设神经网络的训练样本有
m
m
m个,每个包含一组输入
x
x
x和一组输出信号
y
y
y,
L
L
L表示神经网络层数,
S
I
S_I
SI表示每层的neuron个数(
S
l
S_l
Sl表示输出层神经元个数),
S
L
S_L
SL代表最后一层中处理单元的个数。
将神经网络的分类定义为两种情况:二类分类和多类分类,
二类分类:
S
L
=
0
,
y
=
0
o
r
1
S_L=0, y=0\, or\, 1
SL=0,y=0or1表示哪一类;
K
K
K类分类:
S
L
=
k
,
y
i
=
1
S_L=k, y_i = 1
SL=k,yi=1表示分到第
i
i
i类;
(
k
>
2
)
(k>2)
(k>2)
逻辑回归的代价函数为:
在逻辑回归中,我们只有一个输出变量,又称标量(scalar),也只有一个因变量
y
y
y,但是在神经网络中,我们可以有很多输出变量,我们的
h
θ
(
x
)
h_\theta(x)
hθ(x)是一个维度为
K
K
K的向量,并且我们训练集中的因变量也是同样维度的一个向量,因此我们的代价函数会比逻辑回归更加复杂一些,为:
\newcommand{\subk}[1]{ #1_k }
h
θ
(
x
)
∈
R
K
h_\theta\left(x\right)\in \mathbb{R}^{K}
hθ(x)∈RK
(
h
θ
(
x
)
)
i
=
i
t
h
output
{\left({h_\theta}\left(x\right)\right)}_{i}={i}^{th} \text{output}
(hθ(x))i=ithoutput
这个看起来复杂很多的代价函数背后的思想还是一样的,我们希望通过代价函数来观察算法预测的结果与真实情况的误差有多大,唯一不同的是,对于每一行特征,我们都会给出
K
K
K个预测,基本上我们可以利用循环,对每一行特征都预测
K
K
K个不同结果,然后在利用循环在
K
K
K个预测中选择可能性最高的一个,将其与
y
y
y中的实际数据进行比较。
正则化的那一项只是排除了每一层 θ 0 \theta_0 θ0后,每一层的 θ \theta θ 矩阵的和。最里层的循环 j j j循环所有的行(由 s l + 1 s_{l+1} sl+1 层的激活单元数决定),循环 i i i则循环所有的列,由该层( s l s_l sl层)的激活单元数所决定。即: h θ ( x ) h_\theta(x) hθ(x)与真实值之间的距离为每个样本-每个类输出的加和,对参数进行regularization的bias项处理所有参数的平方和。
9.2 反向传播算法-Backpropagation Algorithm
之前我们在计算神经网络预测结果的时候我们采用了一种正向传播方法,我们从第一层开始正向一层一层进行计算,直到最后一层的 h θ ( x ) h_{\theta}\left(x\right) hθ(x)。
现在,为了计算代价函数的偏导数
∂
∂
Θ
i
j
(
l
)
J
(
Θ
)
\frac{\partial}{\partial\Theta^{(l)}_{ij}}J\left(\Theta\right)
∂Θij(l)∂J(Θ),我们需要采用一种反向传播算法,也就是首先计算最后一层的误差,然后再一层一层反向求出各层的误差,直到倒数第二层。
示例:
假设我们的训练集只有一个样本
(
x
(
1
)
,
y
(
1
)
)
\left({x}^{(1)},{y}^{(1)}\right)
(x(1),y(1)),我们的神经网络是一个四层的神经网络,其中
K
=
4
,
S
L
=
4
,
L
=
4
K=4,S_{L}=4,L=4
K=4,SL=4,L=4:
前向传播算法:
我们从最后一层的误差开始计算,误差是激活单元的预测(
a
(
4
)
{a^{(4)}}
a(4))与实际值(
y
k
y^k
yk)之间的误差,(
k
=
1
:
k
k=1:k
k=1:k)。
我们用
δ
\delta
δ来表示误差,则:
δ
(
4
)
=
a
(
4
)
−
y
\delta^{(4)}=a^{(4)}-y
δ(4)=a(4)−y
我们利用这个误差值来计算前一层的误差:
δ
(
3
)
=
(
Θ
(
3
)
)
T
δ
(
4
)
∗
g
′
(
z
(
3
)
)
\delta^{(3)}=\left({\Theta^{(3)}}\right)^{T}\delta^{(4)}\ast g'\left(z^{(3)}\right)
δ(3)=(Θ(3))Tδ(4)∗g′(z(3))
其中
g
′
(
z
(
3
)
)
g'(z^{(3)})
g′(z(3))是
S
S
S 形函数的导数,
g
′
(
z
(
3
)
)
=
a
(
3
)
∗
(
1
−
a
(
3
)
)
g'(z^{(3)})=a^{(3)}\ast(1-a^{(3)})
g′(z(3))=a(3)∗(1−a(3))。而
(
θ
(
3
)
)
T
δ
(
4
)
(θ^{(3)})^{T}\delta^{(4)}
(θ(3))Tδ(4)则是权重导致的误差的和。下一步是继续计算第二层的误差:
δ
(
2
)
=
(
Θ
(
2
)
)
T
δ
(
3
)
∗
g
′
(
z
(
2
)
)
\delta^{(2)}=(\Theta^{(2)})^{T}\delta^{(3)}\ast g'(z^{(2)})
δ(2)=(Θ(2))Tδ(3)∗g′(z(2))
因为第一层是输入变量,不存在误差。我们有了所有的误差的表达式后,便可以计算代价函数的偏导数了,假设
λ
=
0
λ=0
λ=0,即我们不做任何正则化处理时有:
∂
∂
Θ
i
j
(
l
)
J
(
Θ
)
=
a
j
(
l
)
δ
i
l
+
1
\frac{\partial}{\partial\Theta_{ij}^{(l)}}J(\Theta)=a_{j}^{(l)} \delta_{i}^{l+1}
∂Θij(l)∂J(Θ)=aj(l)δil+1
重要的是清楚地知道上面式子中上下标的含义:
l
l
l 代表目前所计算的是第几层。
j
j
j 代表目前计算层中的激活单元的下标,也将是下一层的第
j
j
j个输入变量的下标。
i
i
i 代表下一层中误差单元的下标,是受到权重矩阵中第
i
i
i行影响的下一层中的误差单元的下标。
如果我们考虑正则化处理,并且我们的训练集是一个特征矩阵而非向量。在上面的特殊情况中,我们需要计算每一层的误差单元来计算代价函数的偏导数。在更为一般的情况中,我们同样需要计算每一层的误差单元,但是我们需要为整个训练集计算误差单元,此时的误差单元也是一个矩阵,我们用
Δ
i
j
(
l
)
\Delta^{(l)}_{ij}
Δij(l)来表示这个误差矩阵。第
l
l
l 层的第
i
i
i 个激活单元受到第
j
j
j 个参数影响而导致的误差。
我们的算法表示为:
即首先用正向传播方法计算出每一层的激活单元,利用训练集的结果与神经网络预测的结果求出最后一层的误差,然后利用该误差运用反向传播法计算出直至第二层的所有误差。
在求出了
Δ
i
j
(
l
)
\Delta_{ij}^{(l)}
Δij(l)之后,我们便可以计算代价函数的偏导数了,计算方法如下:
D
i
j
(
l
)
:
=
1
m
Δ
i
j
(
l
)
+
λ
Θ
i
j
(
l
)
D_{ij}^{(l)} :=\frac{1}{m}\Delta_{ij}^{(l)}+\lambda\Theta_{ij}^{(l)}
Dij(l):=m1Δij(l)+λΘij(l)
i
f
j
≠
0
{if}\; j \neq 0
ifj=0
D
i
j
(
l
)
:
=
1
m
Δ
i
j
(
l
)
D_{ij}^{(l)} :=\frac{1}{m}\Delta_{ij}^{(l)}
Dij(l):=m1Δij(l)
i
f
j
=
0
{if}\; j = 0
ifj=0
在Octave 中,如果我们要使用 fminuc
这样的优化算法来求解求出权重矩阵,我们需要将矩阵首先展开成为向量,在利用算法求出最优解后再重新转换回矩阵。
假设我们有三个权重矩阵,Theta1,Theta2 和 Theta3,尺寸分别为 10*11,10*11 和1*11,
下面的代码可以实现这样的转换:
thetaVec = [Theta1(:) ; Theta2(:) ; Theta3(:)]
...optimization using functions like fminuc...
Theta1 = reshape(thetaVec(1:110, 10, 11);
Theta2 = reshape(thetaVec(111:220, 10, 11);
Theta1 = reshape(thetaVec(221:231, 1, 11);
9.3 反向传播算法的理解-Backpropagation Intuition
前向传播算法:
反向传播算法:
9.4 实现注意:展开参数-Implementation Note_ Unrolling Parameters
参数从矩阵展开成向量
示例:
9.5 梯度检验-Gradient Checking
当我们对一个较为复杂的模型(例如神经网络)使用梯度下降算法时,可能会存在一些不容易察觉的错误,意味着,虽然代价看上去在不断减小,但最终的结果可能并不是最优解。
为了避免这样的问题,我们采取一种叫做梯度的数值检验(Numerical Gradient Checking)方法。这种方法的思想是通过估计梯度值来检验我们计算的导数值是否真的是我们要求的。
方法是在代价函数上沿着切线的方向选择离两个非常近的点然后计算两个点的平均值用以估计梯度。即对于某个特定的
θ
\theta
θ,我们计算出在
θ
\theta
θ-
ε
\varepsilon
ε 处和
θ
\theta
θ+
ε
\varepsilon
ε 的代价值(
ε
\varepsilon
ε是一个非常小的值,通常选取 0.001),然后求两个代价的平均,用以估计在
θ
\theta
θ 处的代价值。
Octave 中代码如下:
gradApprox = (J(theta + eps) – J(theta - eps)) / (2*eps)
当
θ
\theta
θ是一个向量时,我们则需要对偏导数进行检验。因为代价函数的偏导数检验只针对一个参数的改变进行检验,下面是一个只针对
θ
1
\theta_1
θ1进行检验的示例:
∂
∂
θ
1
=
J
(
θ
1
+
ε
1
,
θ
2
,
θ
3
.
.
.
θ
n
)
−
J
(
θ
1
−
ε
1
,
θ
2
,
θ
3
.
.
.
θ
n
)
2
ε
\frac{\partial}{\partial\theta_1}=\frac{J\left(\theta_1+\varepsilon_1,\theta_2,\theta_3...\theta_n \right)-J \left( \theta_1-\varepsilon_1,\theta_2,\theta_3...\theta_n \right)}{2\varepsilon}
∂θ1∂=2εJ(θ1+ε1,θ2,θ3...θn)−J(θ1−ε1,θ2,θ3...θn)
最后我们还需要对通过反向传播方法计算出的偏导数进行检验。
根据上面的算法,计算出的偏导数存储在矩阵
D
i
j
(
l
)
D_{ij}^{(l)}
Dij(l) 中。检验时,我们要将该矩阵展开成为向量,同时我们也将
θ
\theta
θ 矩阵展开为向量,我们针对每一个
θ
\theta
θ 都计算一个近似的梯度值,将这些值存储于一个近似梯度矩阵中,最终将得出的这个矩阵同
D
i
j
(
l
)
D_{ij}^{(l)}
Dij(l) 进行比较。
9.6 随机初始化-Random Initialization
任何优化算法都需要一些初始的参数。到目前为止我们都是初始所有参数为0,这样的初始方法对于逻辑回归来说是可行的,但是对于神经网络来说是不可行的。如果我们令所有的初始参数都为0,这将意味着我们第二层的所有激活单元都会有相同的值。同理,如果我们初始所有的参数都为一个非0的数,结果也是一样的。
我们通常初始参数为正负ε之间的随机值,假设我们要随机初始一个尺寸为10×11的参数矩阵,代码如下:
Theta1 = rand(10, 11) * (2*eps) – eps
9.7 综合-Putting It Together
网络结构:第一件要做的事是选择网络结构,即决定选择多少层以及决定每层分别有多少个单元。
第一层的单元数即我们训练集的特征数量。
最后一层的单元数是我们训练集的结果的类的数量。
如果隐藏层数大于1,确保每个隐藏层的单元个数相同,通常情况下隐藏层单元的个数越多越好。
我们真正要决定的是隐藏层的层数和每个中间层的单元数。
训练神经网络:
- 参数的随机初始化
- 利用正向传播方法计算所有的 h θ ( x ) h_{\theta}(x) hθ(x)
- 编写计算代价函数 J J J 的代码
- 利用反向传播方法计算所有偏导数
- 利用数值检验方法检验这些偏导数
- 使用优化算法来最小化代价函数
10 应用机器学习的建议-Advice for Applying Machine Learning
10.1 决定下一步做什么-Deciding What to Try Next
假设我们需要用一个线性回归模型来预测房价,当我们运用训练好了的模型来预测未知数据的时候发现有较大的误差,我们下一步可以做什么?
-
获得更多的训练样本——通常是有效的,但代价较大,下面的方法也可能有效,可考虑先采用下面的几种方法。
-
尝试减少特征的数量
-
尝试获得更多的特征
-
尝试增加多项式特征
-
尝试减少正则化程度 λ \lambda λ
-
尝试增加正则化程度 λ \lambda λ
我们不应该随机选择上面的某种方法来改进我们的算法,而是运用一些机器学习诊断法来帮助我们知道上面哪些方法对我们的算法是有效的。
10.2 评估一个假设-Evaluating a Hypothesis
如何避免过拟合和欠拟合问题
1、可以对假设函数画图,但是当问题的特征数量过多时,画图很难实现
2、为了检验算法是否过拟合,我们将数据分成训练集和测试集,通常用70%的数据作为训练集,用剩下30%的数据作为测试集。很重要的一点是训练集和测试集均要含有各种类型的数据,通常我们要对数据进行“洗牌”,然后再分成训练集和测试集。
测试集评估在通过训练集让我们的模型学习得出其参数后,对测试集运用该模型,我们有两种方式计算误差:
- 对于线性回归模型,我们利用测试集数据计算代价函数 J J J
- 对于逻辑回归模型,我们除了可以利用测试数据集来计算代价函数外:
误分类的比率,对于每一个测试集样本,计算:
然后对计算结果求平均。
10.3 模型选择和交叉验证集-Model Selection and Train_Validation_Test Sets
示例:
假设我们要在10个不同次数的二项式模型之间进行选择:
显然越高次数的多项式模型越能够适应我们的训练数据集,但是适应训练数据集并不代表着能推广至一般情况,我们应该选择一个更能适应一般情况的模型。我们需要使用交叉验证集来帮助选择模型。
即:使用60%的数据作为训练集,使用 20%的数据作为交叉验证集,使用20%的数据作为测试集
模型选择的方法为:
- 使用训练集训练出10个模型
- 用10个模型分别对交叉验证集计算得出交叉验证误差(代价函数的值)
- 选取代价函数值最小的模型
- 用步骤3中选出的模型对测试集计算得出推广误差(代价函数的值)
模型选择:
d为多项式次数,最终选择d=4的假设函数
10.4 诊断偏差和方差-Diagnosing Bias vs. Variance
学习算法效果不好:
高偏差:欠拟合
高方差:过拟合
如图:
我们通常会通过将训练集和交叉验证集的代价函数误差与多项式的次数绘制在同一张图表上来帮助分析:
对于训练集,当
d
d
d 较小时,模型拟合程度更低,误差较大;随着
d
d
d 的增长,拟合程度提高,误差减小。
对于交叉验证集,当
d
d
d 较小时,模型拟合程度低,误差较大;但是随着
d
d
d 的增长,误差呈现先减小后增大的趋势,转折点是我们的模型开始过拟合训练数据集的时候。
如果交叉验证集误差较大,如何判断是方差还是偏差:
训练集误差和交叉验证集误差近似时:偏差/欠拟合
交叉验证集误差远大于训练集误差时:方差/过拟合
10.5 正则化和偏差/方差-Regularization and Bias_Variance
正则化λ选择:
示例:
选择
λ
\lambda
λ的方法为:
- 使用训练集训练出12个不同程度正则化的模型
- 用12个模型分别对交叉验证集计算的出交叉验证误差
- 选择得出交叉验证误差最小的模型
- 运用步骤3中选出模型对测试集计算得出推广误差,我们也可以同时将训练集和交叉验证集模型的代价函数误差与λ的值绘制在一张图表上:
• 当 λ \lambda λ 较小时,训练集误差较小(过拟合)而交叉验证集误差较大
• 随着 λ \lambda λ 的增加,训练集误差不断增加(欠拟合),而交叉验证集误差则是先减小后增加
10.6 学习曲线-Learning Curves
我们可以使用学习曲线来判断某一个学习算法是否处于偏差、方差问题。学习曲线是学习算法的一个很好的合理检验(sanity check)。学习曲线是将训练集误差和交叉验证集误差作为训练集样本数量(
m
m
m)的函数绘制的图表。
思想:当训练较少行数据的时候,训练的模型将能够非常完美地适应较少的训练数据,但是训练出来的模型却不能很好地适应交叉验证集数据或测试集数据。
高方差/欠拟合时学习曲线:
可以看到,增加数据到训练集不一定能有帮助。
高方差/过拟合时学习曲线:
在高方差/过拟合的情况下,增加更多数据到训练集可能可以提高算法效果。
10.7 决定下一步做什么-Deciding What to Do Next Revisited
不能的做法时,解决的问题不同
- 获得更多的训练样本——解决高方差
- 尝试减少特征的数量——解决高方差
- 尝试获得更多的特征——解决高偏差
- 尝试增加多项式特征——解决高偏差
- 尝试减少正则化程度λ——解决高偏差
- 尝试增加正则化程度λ——解决高方差
神经网络的方差和偏差:
神经网络的选择:
较小的神经网络,类似于参数较少的情况,容易导致高偏差和欠拟合,但计算代价较小。
较大的神经网络,类似于参数较多的情况,容易导致高方差和过拟合,虽然计算代价比较大,但是可以通过正则化手段来调整而更加适应数据。
通常选择较大的神经网络并采用正则化处理会比采用较小的神经网络效果要好。
隐藏层数的选择:
通常从一层开始逐渐增加层数,为了更好地作选择,可以把数据分为训练集、交叉验证集和测试集,针对不同隐藏层层数的神经网络训练神经网络,然后选择交叉验证集代价最小的神经网络。
11 机器学习系统的设计-Machine Learning System Design
11.2 误差分析-Error Analysis
构建一个学习算法的推荐方法为:
- 从一个简单的能快速实现的算法开始,实现该算法并用交叉验证集数据测试这个算法
2.绘制学习曲线,决定是增加更多数据,或者添加更多特征,还是其他选择
3.进行误差分析:人工检查交叉验证集中我们算法中产生预测误差的样本,看看这些样本是否有某种系统化的趋势
以我们的垃圾邮件过滤器为例,误差分析要做的既是检验交叉验证集中我们的算法产生错误预测的所有邮件,看:是否能将这些邮件按照类分组。例如医药品垃圾邮件,仿冒品垃圾邮件或者密码窃取邮件等。然后看分类器对哪一组邮件的预测误差最大,并着手优化。
推荐在交叉验证集上来实施误差分析,而不是在测试集上
11.3 类偏斜的误差度量- Error Metrics for Skewed Classes
类偏斜情况表现为我们的训练集中有非常多的同一种类的样本,只有很少或没有其他类的样本。
示例:
我们希望用算法来预测癌症是否是恶性的,在我们的训练集中,只有0.5%的实例是恶性肿瘤。假设我们编写一个非学习而来的算法,在所有情况下都预测肿瘤是良性的,那么误差只有0.5%。然而我们通过训练而得到的神经网络算法却有1%的误差。这时,误差的大小是不能视为评判算法效果的依据的。
我们将算法预测的结果分成四种情况:
1.正确肯定(True Positive,TP):预测为真,实际为真
2.正确否定(True Negative,TN):预测为假,实际为假
3.错误肯定(False Positive,FP):预测为真,实际为假
4.错误否定(False Negative,FN):预测为假,实际为真
预测值 | |||
---|---|---|---|
Positive | Negtive | ||
实际值 | Positive | TP | FN |
Negtive | FP | TN |
查准率=TP/(TP+FP)。例,在所有我们预测有恶性肿瘤的病人中,实际上有恶性肿瘤的病人的百分比,越高越好。
查全率(召回率)=TP/(TP+FN)。例,在所有实际上有恶性肿瘤的病人中,成功预测有恶性肿瘤的病人的百分比,越高越好。
这样,对于我们刚才那个总是预测病人肿瘤为良性的算法,其查全率是0。
11.4 查准率和查全率之间的权衡-Trading Off Precision and Recall
继续沿用刚才预测肿瘤性质的例子。假使,我们的算法输出的结果在0-1 之间,我们使用阀值0.5 来预测真和假。
查准率(Precision)=TP/(TP+FP)
例,在所有我们预测有恶性肿瘤的病人中,实际上有恶性肿瘤的病人的百分比,越高越好。
查全率(Recall)=TP/(TP+FN)
例,在所有实际上有恶性肿瘤的病人中,成功预测有恶性肿瘤的病人的百分比,越高越好。
如果我们希望只在非常确信的情况下预测为真(肿瘤为恶性),即我们希望更高的查准率,我们可以使用比0.5更大的阀值,如0.7,0.9。这样做我们会减少错误预测病人为恶性肿瘤的情况,同时却会增加未能成功预测肿瘤为恶性的情况。
如果我们希望提高查全率,尽可能地让所有有可能是恶性肿瘤的病人都得到进一步地检查、诊断,我们可以使用比0.5更小的阀值,如0.3。
我们可以将不同阀值情况下,查全率与查准率的关系绘制成图表,曲线的形状根据数据的不同而不同:
一种帮助我们选择这个阀值的方法是计算F1 值(F1 Score),其计算公式为:
F
1
S
c
o
r
e
:
2
P
R
P
+
R
{{F}_{1}}Score:2\frac{PR}{P+R}
F1Score:2P+RPR
我们选择使得F1值最高的阀值。
11.5 机器学习的数据-Data For Machine Learning
示例:
这些趋势非常明显,首先大部分算法,都具有相似的性能,其次,随着训练数据集的增大,在横轴上代表以百万为单位的训练集大小,从0.1个百万到1000百万,也就是到了10亿规模的训练集的样本,这些算法的性能也都对应地增强了。
现在假设我们使用了非常非常大的训练集,在这种情况下,尽管我们希望有很多参数,但是如果训练集比参数的数量还大,甚至是更多,那么这些算法就不太可能会过度拟合。也就是说训练误差有希望接近测试误差。
另一种考虑这个问题的角度是为了有一个高性能的学习算法,我们希望它不要有高的偏差和方差。
因此偏差问题,我么将通过确保有一个具有很多参数的学习算法来解决,以便我们能够得到一个较低偏差的算法,并且通过用非常大的训练集来保证。
我们在此没有方差问题,我们的算法将没有方差,并且通过将这两个值放在一起,我们最终可以得到一个低误差和低方差的学习算法。这使得我们能够很好地测试测试数据集。从根本上来说,这是一个关键的假设:特征值有足够的信息量,且我们有一类很好的函数,这是为什么能保证低误差的关键所在。它有大量的训练数据集,这能保证得到更多的方差值,因此这给我们提出了一些可能的条件,如果你有大量的数据,而且你训练了一种带有很多参数的学习算法,那么这将会是一个很好的方式,来提供一个高性能的学习算法。
我觉得关键的测试:首先,一个人类专家看到了特征值 x x x,能很有信心的预测出 y y y值吗?因为这可以证明 y y y 可以根据特征值 x x x被准确地预测出来。其次,我们实际上能得到一组庞大的训练集,并且在这个训练集中训练一个有很多参数的学习算法吗?如果你不能做到这两者,那么更多时候,你会得到一个性能很好的学习算法。
12 支持向量机-Support Vector Machines
12.1 优化目标- Optimization Objective
与逻辑回归和神经网络相比,支持向量机,或者简称SVM,在学习复杂的非线性方程时提供了一种更为清晰,更加强大的方式
逻辑回归的假设函数
那么,在逻辑回归中我们已经熟悉了这里的假设函数形式,和右边的S型激励函数。然而,为了解释一些数学知识.我将用
z
z
z 表示
θ
T
x
\theta^Tx
θTx。
修改一下逻辑回归
那么,现在让我给这两个方程命名,左边的函数,我称之为
cos
t
1
(
z
)
{\cos}t_1{(z)}
cost1(z),同时,右边函数我称它为
cos
t
0
(
z
)
{\cos}t_0{(z)}
cost0(z)。这里的下标是指在代价函数中,对应的
y
=
1
y=1
y=1 和
y
=
0
y=0
y=0 的情况,拥有了这些定义后,现在,我们就开始构建支持向量机。
这是我们在逻辑回归中使用代价函数
J
(
θ
)
J(\theta)
J(θ)。将负号移到了表达式的里面,这样做使得方程看起来有些不同。对于支持向量机而言,实质上我们要将这替换为
cos
t
1
(
z
)
{\cos}t_1{(z)}
cost1(z),也就是
cos
t
1
(
θ
T
x
)
{\cos}t_1{(\theta^Tx)}
cost1(θTx),同样地,我也将这一项替换为
cos
t
0
(
z
)
{\cos}t_0{(z)}
cost0(z),也就是代价
cos
t
0
(
θ
T
x
)
{\cos}t_0{(\theta^Tx)}
cost0(θTx)。这里的代价函数
cos
t
1
{\cos}t_1
cost1,就是之前所提到的那条线。此外,代价函数
cos
t
0
{\cos}t_0
cost0,也是上面所介绍过的那条线。因此,对于支持向量机,我们得到了这里的最小化问题,即:
C为SVM学习到的参数
最后有别于逻辑回归输出的概率。在这里,我们的代价函数,当最小化代价函数,获得参数
θ
{{\theta }}
θ时,支持向量机所做的是它来直接预测
y
y
y的值等于1,还是等于0。因此,这个假设函数会预测1。当
θ
T
x
\theta^Tx
θTx大于或者等于0时,或者等于0时,所以学习参数
θ
{{\theta }}
θ就是支持向量机假设函数的形式。那么,这就是支持向量机数学上的定义。
12.2 大边界的直观理解-Large Margin Intuition
人们有时将支持向量机看作是大间距分类器。
SVM代价函数:
相比于逻辑回归,支持向量机的要求更高,不仅仅要能正确分开输入的样本,即不仅仅要求
θ
T
x
\theta^Tx
θTx>0,我们需要的是比0值大很多,比如大于等于1,我也想这个比0小很多,比如我希望它小于等于-1,这就相当于在支持向量机中嵌入了一个额外的安全因子,或者说安全的间距因子。
当然,逻辑回归做了类似的事情。但是让我们看一下,在支持向量机中,这个因子会导致什么结果。
示例:
我们将这个常数
C
C
C设置成一个非常大的值。比如我们假设
C
C
C的值为100000或者其它非常大的数,然后来观察支持向量机会给出什么结果?
SVM决策边界:
支持向量机将会选择这个黑色的决策边界,相较于之前我用粉色或者绿色画的决策界。这条黑色的看起来好得多,黑线看起来是更稳健的决策界。在分离正样本和负样本上它显得的更好。数学上来讲,这是什么意思呢?这条黑线有更大的距离,这个距离叫做间距(margin)。
这是支持向量机具有鲁棒性的原因,因为它努力用一个最大间距来分离样本。因此支持向量机有时被称为大间距分类器
事实上,支持向量机现在要比这个大间距分类器所体现得更成熟,尤其是当你使用大间距分类器的时候,你的学习算法会受异常点(outlier) 的影响。比如我们加入一个额外的正样本。
C设置的太大,加入一个异常点,会使决策边界由黑色变为粉色,但是这显然是不合理的。但是当C不是太大时,你最终会得到黑色的曲线。
实际上应用支持向量机的时候,当 C C C不是非常非常大的时候,它可以忽略掉一些异常点的影响,得到更好的决策界。甚至当你的数据不是线性可分的时候,支持向量机也可以给出好的结果。
回顾 C = 1 / λ C=1/\lambda C=1/λ,因此:
C C C 较大时,相当于 λ \lambda λ 较小,可能会导致过拟合,高方差。
C C C 较小时,相当于 λ \lambda λ较大,可能会导致低拟合,高偏差。
12.3 大边界分类背后的数学(选修)-Mathematics Behind Large Margin Classification (Optional)
下图介绍了向量内积的另一种计算方式
这就是我们先前给出的支持向量机模型中的目标函数。为了讲解方便,我做一点简化,仅仅是为了让目标函数更容易被分析。
我接下来忽略掉截距,令
θ
0
=
0
{{\theta }_{0}}=0
θ0=0,这样更容易画示意图。我将特征数
n
n
n置为2,因此我们仅有两个特征
x
1
,
x
2
{{x}_{1}},{{x}_{2}}
x1,x2,现在我们来看一下目标函数,支持向量机的优化目标函数。当我们仅有两个特征,即
n
=
2
n=2
n=2时,这个式子可以写作:
1
2
(
θ
1
2
+
θ
2
2
)
=
1
2
(
θ
1
2
+
θ
2
2
)
2
\frac{1}{2}\left({\theta_1^2+\theta_2^2}\right)=\frac{1}{2}\left(\sqrt{\theta_1^2+\theta_2^2}\right)^2
21(θ12+θ22)=21(θ12+θ22)2,我们只有两个参数
θ
1
,
θ
2
{{\theta }_{1}},{{\theta }_{2}}
θ1,θ2。
因此支持向量机做的全部事情,就是极小化参数向量
θ
{{\theta }}
θ范数的平方,或者说长度的平方。
现在我将要看看这些项:
θ
T
x
\theta^{T}x
θTx更深入地理解它们的含义。给定参数向量
θ
\theta
θ给定一个样本
x
x
x,这等于什么呢?在前一页幻灯片上,我们画出了在不同情形下,
u
T
v
u^Tv
uTv的示意图,我们将会使用这些概念,
θ
\theta
θ和
x
(
i
)
x^{(i)}
x(i)就类似于
u
u
u和
v
v
v 。
使用我们之前的方法,我们计算的方式就是我将训练样本投影到参数向量
θ
{{\theta }}
θ,然后我来看一看这个线段的长度,我将它画成红色。我将它称为
p
(
i
)
p^{(i)}
p(i)用来表示这是第
i
i
i个训练样本在参数向量
θ
{{\theta }}
θ上的投影。根据我们之前幻灯片的内容,我们知道的是
θ
T
x
(
i
)
θ^Tx^{(i)}
θTx(i)将会等于
p
p
p 乘以向量
θ
θ
θ 的长度或范数。这就等于
θ
1
⋅
x
1
(
i
)
+
θ
2
⋅
x
2
(
i
)
\theta_1\cdot{x_1^{(i)}}+\theta_2\cdot{x_2^{(i)}}
θ1⋅x1(i)+θ2⋅x2(i)。这两种方式是等价的,都可以用来计算
θ
θ
θ和
x
(
i
)
x^{(i)}
x(i)之间的内积。
这告诉了我们什么呢?这里表达的意思是:这个
θ
T
x
(
i
)
>
=
1
θ^Tx^{(i)}>=1
θTx(i)>=1 或者
θ
T
x
(
i
)
<
−
1
θ^Tx^{(i)}<-1
θTx(i)<−1的,约束是可以被
p
(
i
)
⋅
x
>
=
1
p^{(i)}\cdot{x}>=1
p(i)⋅x>=1这个约束所代替的。因为
θ
T
x
(
i
)
=
p
(
i
)
⋅
∥
θ
∥
θ^Tx^{(i)}=p^{(i)}\cdot{\left\| \theta \right\|}
θTx(i)=p(i)⋅∥θ∥ ,将其写入我们的优化目标。我们将会得到没有了约束,
θ
T
x
(
i
)
θ^Tx^{(i)}
θTx(i)而变成了
p
(
i
)
⋅
∥
θ
∥
p^{(i)}\cdot{\left\| \theta \right\|}
p(i)⋅∥θ∥。
示例:
假设SVM选择如下图绿色所示的决策边界,对于这样选择的参数
θ
{{\theta }}
θ,可以看到参数向量
θ
{{\theta }}
θ事实上是和决策界是90度正交的,因此这个绿色的决策界对应着一个参数向量
θ
{{\theta }}
θ这个方向,顺便提一句
θ
0
=
0
{{\theta }_{0}}=0
θ0=0的简化仅仅意味着决策界必须通过原点
(
0
,
0
)
(0,0)
(0,0)。现在让我们看一下这对于优化目标函数意味着什么。
比如这个样本,我们假设它是我的第一个样本 x ( 1 ) x^{(1)} x(1),如果我考察这个样本到参数 θ {{\theta }} θ的投影,投影是这个短的红线段,就等于 p ( 1 ) p^{(1)} p(1),它非常短。类似地,这个样本如果它恰好是 x ( 2 ) x^{(2)} x(2),我的第二个训练样本,则它到 θ {{\theta }} θ的投影在这里。我将它画成粉色,这个短的粉色线段是 p ( 2 ) p^{(2)} p(2),即第二个样本到我的参数向量 θ {{\theta }} θ的投影。因此,这个投影非常短。 p ( 2 ) p^{(2)} p(2)事实上是一个负值, p ( 2 ) p^{(2)} p(2)是在相反的方向,这个向量和参数向量 θ {{\theta }} θ的夹角大于90度, p ( 2 ) p^{(2)} p(2)的值小于0。
我们会发现这些
p
(
i
)
p^{(i)}
p(i)将会是非常小的数,因此当我们考察优化目标函数的时候,对于正样本而言,我们需要
p
(
i
)
⋅
∥
θ
∥
>
=
1
p^{(i)}\cdot{\left\| \theta \right\|}>=1
p(i)⋅∥θ∥>=1,但是如果
p
(
i
)
p^{(i)}
p(i)在这里非常小,那就意味着我们需要
θ
{{\theta }}
θ的范数非常大.因为如果
p
(
1
)
p^{(1)}
p(1) 很小,而我们希望
p
(
1
)
⋅
∥
θ
∥
>
=
1
p^{(1)}\cdot{\left\| \theta \right\|}>=1
p(1)⋅∥θ∥>=1,令其实现的唯一的办法就是这两个数较大。如果
p
(
1
)
p^{(1)}
p(1) 小,我们就希望
θ
{{\theta }}
θ的范数大。类似地,对于负样本而言我们需要
p
(
2
)
⋅
∥
θ
∥
<
=
−
1
p^{(2)}\cdot{\left\|\theta \right\|}<=-1
p(2)⋅∥θ∥<=−1。我们已经在这个样本中看到
p
(
2
)
p^{(2)}
p(2)会是一个非常小的数,因此唯一的办法就是
θ
{{\theta }}
θ的范数变大。但是我们的目标函数是希望找到一个参数
θ
{{\theta }}
θ,它的范数是小的。因此,这看起来不像是一个好的参数向量
θ
{{\theta }}
θ的选择。
如果,支持向量机选择了右侧这个决策界,现在状况会有很大不同。如果这是决策界,这就是相对应的参数
θ
{{\theta }}
θ的方向,因此,在这个决策界之下,垂直线是决策界。使用线性代数的知识,可以说明,这个绿色的决策界有一个垂直于它的向量
θ
{{\theta }}
θ。现在如果你考察你的数据在横轴
x
x
x上的投影,比如这个我之前提到的样本,我的样本
x
(
1
)
x^{(1)}
x(1),当我将它投影到横轴
x
x
x上,或说投影到
θ
{{\theta }}
θ上,就会得到这样
p
(
1
)
p^{(1)}
p(1)。它的长度是
p
(
1
)
p^{(1)}
p(1),另一个样本,那个样本是
x
(
2
)
x^{(2)}
x(2)。我做同样的投影,我会发现,
p
(
2
)
p^{(2)}
p(2)的长度是负值。你会注意到现在
p
(
1
)
p^{(1)}
p(1) 和
p
(
2
)
p^{(2)}
p(2)这些投影长度是长多了。如果我们仍然要满足这些约束,
P
(
i
)
⋅
∥
θ
∥
P^{(i)}\cdot{\left\| \theta \right\|}
P(i)⋅∥θ∥>1,则因为
p
(
1
)
p^{(1)}
p(1)变大了,
θ
{{\theta }}
θ的范数就可以变小了。因此这意味着通过选择右边的决策界,而不是左边的那个,支持向量机可以使参数
θ
{{\theta }}
θ的范数变小很多。因此,如果我们想令
θ
{{\theta }}
θ的范数变小,从而令
θ
{{\theta }}
θ范数的平方变小,就能让支持向量机选择右边的决策界。这就是支持向量机如何能有效地产生大间距分类的原因。
看这条绿线,这个绿色的决策界。我们希望正样本和负样本投影到 θ \theta θ的值大。要做到这一点的唯一方式就是选择这条绿线做决策界。这是大间距决策界来区分开正样本和负样本这个间距的值。这个间距的值就是 p ( 1 ) , p ( 2 ) , p ( 3 ) p^{(1)},p^{(2)},p^{(3)} p(1),p(2),p(3)等等的值。通过让间距变大,即通过这些 p ( 1 ) , p ( 2 ) , p ( 3 ) p^{(1)},p^{(2)},p^{(3)} p(1),p(2),p(3)等等的值,支持向量机最终可以找到一个较小的 θ {{\theta }} θ范数。这正是支持向量机中最小化目标函数的目的。
以上就是为什么支持向量机最终会找到大间距分类器的原因。因为它试图极大化这些 p ( i ) p^{(i)} p(i)的范数,它们是训练样本到决策边界的距离。最后一点,我们的推导自始至终使用了这个简化假设,就是参数 θ 0 = 0 θ_0=0 θ0=0。
即便 θ 0 θ_0 θ0不等于0,支持向量机要做的事情都是优化这个目标函数对应着 C C C值非常大的情况,但是可以说明的是,即便 θ 0 θ_0 θ0不等于0,支持向量机仍然会找到正样本和负样本之间的大间距分隔。
12.4 核函数1- Kernels I
之前我们可以使用高级数的多项式模型来解决无法用直线进行分隔的分类问题:
为了获得上图所示的判定边界,我们的模型可能是
θ
0
+
θ
1
x
1
+
θ
2
x
2
+
θ
3
x
1
x
2
+
θ
4
x
1
2
+
θ
5
x
2
2
+
⋯
{{\theta }_{0}}+{{\theta }_{1}}{{x}_{1}}+{{\theta }_{2}}{{x}_{2}}+{{\theta }_{3}}{{x}_{1}}{{x}_{2}}+{{\theta }_{4}}x_{1}^{2}+{{\theta }_{5}}x_{2}^{2}+\cdots
θ0+θ1x1+θ2x2+θ3x1x2+θ4x12+θ5x22+⋯的形式。
我们可以用一系列的新的特征
f
f
f来替换模型中的每一项。例如令:
f
1
=
x
1
,
f
2
=
x
2
,
f
3
=
x
1
x
2
,
f
4
=
x
1
2
,
f
5
=
x
2
2
{{f}_{1}}={{x}_{1}},{{f}_{2}}={{x}_{2}},{{f}_{3}}={{x}_{1}}{{x}_{2}},{{f}_{4}}=x_{1}^{2},{{f}_{5}}=x_{2}^{2}
f1=x1,f2=x2,f3=x1x2,f4=x12,f5=x22…得到
h
θ
(
x
)
=
θ
1
f
1
+
θ
2
f
2
+
.
.
.
+
θ
n
f
n
h_θ(x)={{\theta }_{1}}f_1+{{\theta }_{2}}f_2+...+{{\theta }_{n}}f_n
hθ(x)=θ1f1+θ2f2+...+θnfn。然而,除了对原有的特征进行组合以外,有没有更好的方法来构造
f
1
,
f
2
,
f
3
f_1,f_2,f_3
f1,f2,f3?我们可以利用核函数来计算出新的特征。
给定一个训练样本
x
x
x,我们利用
x
x
x的各个特征与我们预先选定的地标(landmarks)
l
(
1
)
,
l
(
2
)
,
l
(
3
)
l^{(1)},l^{(2)},l^{(3)}
l(1),l(2),l(3)的近似程度来选取新的特征
f
1
,
f
2
,
f
3
f_1,f_2,f_3
f1,f2,f3。
例如:
f
1
=
s
i
m
i
l
a
r
i
t
y
(
x
,
l
(
1
)
)
=
e
(
−
∥
x
−
l
(
1
)
∥
2
2
σ
2
)
{{f}_{1}}=similarity(x,{{l}^{(1)}})=e(-\frac{{{\left\| x-{{l}^{(1)}} \right\|}^{2}}}{2{{\sigma }^{2}}})
f1=similarity(x,l(1))=e(−2σ2∥x−l(1)∥2)
其中: ∥ x − l ( 1 ) ∥ 2 = ∑ j = 1 n ( x j − l j ( 1 ) ) 2 {{\left\| x-{{l}^{(1)}} \right\|}^{2}}=\sum{_{j=1}^{n}}{{({{x}_{j}}-l_{j}^{(1)})}^{2}} ∥∥x−l(1)∥∥2=∑j=1n(xj−lj(1))2,为实例 x x x中所有特征与地标 l ( 1 ) l^{(1)} l(1)之间的距离的和。上例中的 s i m i l a r i t y ( x , l ( 1 ) ) similarity(x,{{l}^{(1)}}) similarity(x,l(1))就是核函数,具体而言,这里是一个高斯核函数(Gaussian Kernel)。 注:这个函数与正态分布没什么实际上的关系,只是看上去像而已。
这些地标的作用是什么?如果一个训练样本 x x x与地标 l l l之间的距离近似于0,则新特征 f f f近似于 e − 0 = 1 e^{-0}=1 e−0=1,如果训练样本 x x x与地标 l l l之间距离较远,则 f f f近似于 e − ( 一 个 较 大 的 数 ) = 0 e^{-(一个较大的数)}=0 e−(一个较大的数)=0。
假设我们的训练样本含有两个特征[
x
1
x_{1}
x1
x
2
x{_2}
x2],给定地标
l
(
1
)
l^{(1)}
l(1)与不同的
σ
\sigma
σ值,见下图:
图中水平面的坐标为
x
1
x_{1}
x1,
x
2
x_{2}
x2而垂直坐标轴代表
f
f
f。可以看出,只有当
x
x
x与
l
(
1
)
l^{(1)}
l(1)重合时
f
f
f才具有最大值。随着
x
x
x的改变
f
f
f值改变的速率受到
σ
2
\sigma^2
σ2的控制。
在下图中,当样本处于洋红色的点位置处,因为其离
l
(
1
)
l^{(1)}
l(1)更近,但是离
l
(
2
)
l^{(2)}
l(2)和
l
(
3
)
l^{(3)}
l(3)较远,因此
f
1
f_1
f1接近1,而
f
2
f_2
f2,
f
3
f_3
f3接近0。因此
h
θ
(
x
)
=
θ
0
+
θ
1
f
1
+
θ
2
f
2
+
θ
1
f
3
>
0
h_θ(x)=θ_0+θ_1f_1+θ_2f_2+θ_1f_3>0
hθ(x)=θ0+θ1f1+θ2f2+θ1f3>0,因此预测
y
=
1
y=1
y=1。同理可以求出,对于离
l
(
2
)
l^{(2)}
l(2)较近的绿色点,也预测
y
=
1
y=1
y=1,但是对于蓝绿色的点,因为其离三个地标都较远,预测
y
=
0
y=0
y=0。
这样,图中红色的封闭曲线所表示的范围,便是我们依据一个单一的训练样本和我们选取的地标所得出的判定边界,在预测时,我们采用的特征不是训练样本本身的特征,而是通过核函数计算出的新特征
f
1
,
f
2
,
f
3
f_1,f_2,f_3
f1,f2,f3。
12.5 核函数2-Kernels II
补充上节的一些细节
如何选择地标?
我们通常是根据训练集的数量选择地标的数量,即如果训练集中有
m
m
m个样本,则我们选取
m
m
m个地标,并且令:
l
(
1
)
=
x
(
1
)
,
l
(
2
)
=
x
(
2
)
,
.
.
.
.
.
,
l
(
m
)
=
x
(
m
)
l^{(1)}=x^{(1)},l^{(2)}=x^{(2)},.....,l^{(m)}=x^{(m)}
l(1)=x(1),l(2)=x(2),.....,l(m)=x(m)。这样做的好处在于:现在我们得到的新特征是建立在原有特征与训练集中所有其他特征之间距离的基础之上的,即:
下面我们将核函数运用到支持向量机中,修改我们的支持向量机假设为:
• 给定 x x x,计算新特征 f f f,当 θ T f > = 0 θ^Tf>=0 θTf>=0 时,预测 y = 1 y=1 y=1,否则反之。
相应地修改代价函数为: ∑ j = 1 n = m θ j 2 = θ T θ \sum{_{j=1}^{n=m}}\theta _{j}^{2}={{\theta}^{T}}\theta ∑j=1n=mθj2=θTθ,
m
i
n
C
∑
i
=
1
m
[
y
(
i
)
c
o
s
t
1
(
θ
T
f
(
i
)
)
+
(
1
−
y
(
i
)
)
c
o
s
t
0
(
θ
T
f
(
i
)
)
]
+
1
2
∑
j
=
1
n
=
m
θ
j
2
min C\sum\limits_{i=1}^{m}{[{{y}^{(i)}}cos {{t}_{1}}}( {{\theta }^{T}}{{f}^{(i)}})+(1-{{y}^{(i)}})cos {{t}_{0}}( {{\theta }^{T}}{{f}^{(i)}})]+\frac{1}{2}\sum\limits_{j=1}^{n=m}{\theta _{j}^{2}}
minCi=1∑m[y(i)cost1(θTf(i))+(1−y(i))cost0(θTf(i))]+21j=1∑n=mθj2
在具体实施过程中,我们还需要对最后的正则化项进行些微调整,在计算
∑
j
=
1
n
=
m
θ
j
2
=
θ
T
θ
\sum{_{j=1}^{n=m}}\theta _{j}^{2}={{\theta}^{T}}\theta
∑j=1n=mθj2=θTθ时,我们用
θ
T
M
θ
θ^TMθ
θTMθ代替
θ
T
θ
θ^Tθ
θTθ,其中
M
M
M是根据我们选择的核函数而不同的一个矩阵。这样做的原因是为了简化计算。
理论上讲,我们也可以在逻辑回归中使用核函数,但是上面使用
M
M
M来简化计算的方法不适用与逻辑回归,因此计算将非常耗费时间。
另外,支持向量机也可以不使用核函数,不使用核函数又称为线性核函数(linear kernel),当我们不采用非常复杂的函数,或者我们的训练集特征非常多而样本非常少的时候,可以采用这种不带核函数的支持向量机。
下面是支持向量机的两个参数
C
C
C和
σ
\sigma
σ的影响:
C
=
1
/
λ
C=1/\lambda
C=1/λ
C
C
C 较大时,相当于
λ
\lambda
λ较小,可能会导致过拟合,高方差;
C
C
C 较小时,相当于
λ
\lambda
λ较大,可能会导致低拟合,高偏差;
σ
\sigma
σ较大时,可能会导致低方差,高偏差;
σ
\sigma
σ较小时,可能会导致低偏差,高方差。
12.6 使用支持向量机-Using An SVM
在高斯核函数之外我们还有其他一些选择,如:
多项式核函数(Polynomial Kernel)
字符串核函数(String kernel)
卡方核函数( chi-square kernel)
直方图交集核函数(histogram intersection kernel)
等等…
这些核函数的目标也都是根据训练集和地标之间的距离来构建新特征,这些核函数需要满足Mercer’s定理,才能被支持向量机的优化软件正确处理。
多类分类问题
假设我们利用之前介绍的一对多方法来解决一个多类分类问题。如果一共有
k
k
k个类,则我们需要
k
k
k个模型,以及
k
k
k个参数向量
θ
{{\theta }}
θ。我们同样也可以训练
k
k
k个支持向量机来解决多类分类问题。但是大多数支持向量机软件包都有内置的多类分类功能,我们只要直接使用即可。
从逻辑回归模型,我们得到了支持向量机模型,在两者之间,我们应该如何选择呢?
下面是一些普遍使用的准则:
n
n
n为特征数,
m
m
m为训练样本数。
(1)如果相较于
m
m
m而言,
n
n
n要大许多,即训练集数据量不够支持我们训练一个复杂的非线性模型,我们选用逻辑回归模型或者不带核函数的支持向量机。
(2)如果
n
n
n较小,而且
m
m
m大小中等,例如
n
n
n在 1-1000 之间,而
m
m
m在10-10000之间,使用高斯核函数的支持向量机。
(3)如果
n
n
n较小,而
m
m
m较大,例如
n
n
n在1-1000之间,而
m
m
m大于50000,则使用支持向量机会非常慢,解决方案是创造、增加更多的特征,然后使用逻辑回归或不带核函数的支持向量机。
13 聚类-Clustering
13.1 无监督学习:简介-Unsupervised Learning_ Introduction
监督学习:
在一个典型的监督学习中,我们有一个有标签的训练集,我们的目标是找到能够区分正样本和负样本的决策边界,在这里的监督学习中,我们有一系列标签,我们需要据此拟合一个假设函数。
无监督学习:
在非监督学习中,我们的数据没有附带任何标签,我们拿到的数据就是这样的:
在非监督学习中,我们需要将一系列无标签的训练数据,输入到一个算法中,然后我们告诉这个算法,快去为我们找找这个数据的内在结构给定数据
图上的数据看起来可以分成两个分开的点集(称为簇),一个能够找到我圈出的这些点集的算法,就被称为聚类算法。
聚类算法的用途:
13.2 K-均值算法-K-Means Algorithm
K-均值是最普及的聚类算法,算法接受一个未标记的数据集,然后将数据聚类成不同的组。
K-均值是一个迭代算法,假设我们想要将数据聚类成n个组,其方法为:
选择
K
K
K个随机的点,称为聚类中心(cluster centroids);
对于数据集中的每一个数据,按照距离
K
K
K个中心点的距离,将其与距离最近的中心点关联起来,与同一个中心点关联的所有点聚成一类。
计算每一个组的平均值,将该组所关联的中心点移动到平均值的位置。
重复步骤2-4直至中心点不再变化。
用
μ
1
μ^1
μ1,
μ
2
μ^2
μ2,…,
μ
k
μ^k
μk 来表示聚类中心,用
c
(
1
)
c^{(1)}
c(1),
c
(
2
)
c^{(2)}
c(2),…,
c
(
m
)
c^{(m)}
c(m)来存储与第
i
i
i个实例数据最近的聚类中心的索引,K-均值算法的伪代码如下:
Repeat {
for i = 1 to m
c(i) := index (form 1 to K) of cluster centroid closest to x(i)
for k = 1 to K
μk := average (mean) of points assigned to cluster k
}
算法分为两个步骤,第一个for循环是赋值步骤,即:对于每一个样例 i i i,计算其应该属于的类。第二个for循环是聚类中心的移动,即:对于每一个类 K K K,重新计算该类的质心。
K-均值算法也可以很便利地用于将数据分为许多不同组,即使在没有非常明显区分的组群的情况下也可以。下图所示的数据集包含身高和体重两项特征构成的,利用K-均值算法将数据分为三类,用于帮助确定将要生产的T-恤衫的三种尺寸。
13.3 优化目标-Optimization Objective
K-均值最小化问题,是要最小化所有的数据点与其所关联的聚类中心点之间的距离之和,因此
K-均值的代价函数(又称畸变函数 Distortion function)为:
J ( c ( 1 ) , . . . , c ( m ) , μ 1 , . . . , μ K ) = 1 m ∑ i = 1 m ∥ X ( i ) − μ c ( i ) ∥ 2 J(c^{(1)},...,c^{(m)},μ_1,...,μ_K)=\dfrac {1}{m}\sum^{m}_{i=1}\left\| X^{\left( i\right) }-\mu_{c^{(i)}}\right\| ^{2} J(c(1),...,c(m),μ1,...,μK)=m1i=1∑m∥∥∥X(i)−μc(i)∥∥∥2
其中
μ
c
(
i
)
{{\mu }_{{{c}^{(i)}}}}
μc(i)代表与
x
(
i
)
{{x}^{(i)}}
x(i)最近的聚类中心点。
我们的的优化目标便是找出使得代价函数最小的
c
(
1
)
c^{(1)}
c(1),
c
(
2
)
c^{(2)}
c(2),…,
c
(
m
)
c^{(m)}
c(m)和
μ
1
μ^1
μ1,
μ
2
μ^2
μ2,…,
μ
k
μ^k
μk:
回顾刚才给出的:
K-均值迭代算法,我们知道,第一个循环是用于减小
c
(
i
)
c^{(i)}
c(i)引起的代价,而第二个循环则是用于减小
μ
i
{{\mu }_{i}}
μi引起的代价。迭代的过程一定会是每一次迭代都在减小代价函数,不然便是出现了错误。
13.4 随机初始化-Random Initialization
在运行K-均值算法的之前,我们首先要随机初始化所有的聚类中心点,下面介绍怎样做:
- 我们应该选择 K < m K<m K<m,即聚类中心点的个数要小于所有训练集实例的数量
- 随机选择 K K K个训练实例,然后令 K K K个聚类中心分别与这 K K K个训练实例相等
K-均值的一个问题在于,它有可能会停留在一个局部最小值处,而这取决于初始化的情况。
为了解决这个问题,我们通常需要多次运行K-均值算法,每一次都重新进行随机初始化,最后再比较多次运行K-均值的结果,选择代价函数最小的结果。这种方法在
K
K
K较小的时候(2–10)还是可行的,但是如果
K
K
K较大,这么做也可能不会有明显地改善。
13.5 选择聚类数-Choosing the Number of Clusters
没有所谓最好的选择聚类数的方法,通常是需要根据不同的问题,人工进行选择的。选择的时候思考我们运用K-均值算法聚类的动机是什么,然后选择能最好服务于该目的标聚类数。
“肘部法则”:我们所需要做的是改变
K
K
K值,也就是聚类类别数目的总数。我们用一个聚类来运行K均值聚类方法。这就意味着,所有的数据都会分到一个聚类里,然后计算成本函数或者计算畸变函数
J
J
J。
K
K
K代表聚类数字。如下图左边所示。
但是如果得到右边这张图,则法则则会失效
聚类参考资料:
1.相似度/距离计算方法总结
(1). 闵可夫斯基距离Minkowski/(其中欧式距离: p = 2 p=2 p=2)
d i s t ( X , Y ) = ( ∑ i = 1 n ∣ x i − y i ∣ p ) 1 p dist(X,Y)={{\left( {{\sum\limits_{i=1}^{n}{\left| {{x}_{i}}-{{y}_{i}} \right|}}^{p}} \right)}^{\frac{1}{p}}} dist(X,Y)=(i=1∑n∣xi−yi∣p)p1
(2). 杰卡德相似系数(Jaccard):
J ( A , B ) = ∣ A ∩ B ∣ ∣ A ∪ B ∣ J(A,B)=\frac{\left| A\cap B \right|}{\left|A\cup B \right|} J(A,B)=∣A∪B∣∣A∩B∣
(3). 余弦相似度(cosine similarity):
n n n维向量 x x x和 y y y的夹角记做 θ \theta θ,根据余弦定理,其余弦值为:
c
o
s
(
θ
)
=
x
T
y
∣
x
∣
⋅
∣
y
∣
=
∑
i
=
1
n
x
i
y
i
∑
i
=
1
n
x
i
2
∑
i
=
1
n
y
i
2
cos (\theta )=\frac{{{x}^{T}}y}{\left|x \right|\cdot \left| y \right|}=\frac{\sum\limits_{i=1}^{n}{{{x}_{i}}{{y}_{i}}}}{\sqrt{\sum\limits_{i=1}^{n}{{{x}_{i}}^{2}}}\sqrt{\sum\limits_{i=1}^{n}{{{y}_{i}}^{2}}}}
cos(θ)=∣x∣⋅∣y∣xTy=i=1∑nxi2i=1∑nyi2i=1∑nxiyi
(4). Pearson皮尔逊相关系数:
ρ
X
Y
=
cov
(
X
,
Y
)
σ
X
σ
Y
=
E
[
(
X
−
μ
X
)
(
Y
−
μ
Y
)
]
σ
X
σ
Y
=
∑
i
=
1
n
(
x
−
μ
X
)
(
y
−
μ
Y
)
∑
i
=
1
n
(
x
−
μ
X
)
2
∑
i
=
1
n
(
y
−
μ
Y
)
2
{{\rho }_{XY}}=\frac{\operatorname{cov}(X,Y)}{{{\sigma }_{X}}{{\sigma }_{Y}}}=\frac{E[(X-{{\mu }_{X}})(Y-{{\mu }_{Y}})]}{{{\sigma }_{X}}{{\sigma }_{Y}}}=\frac{\sum\limits_{i=1}^{n}{(x-{{\mu }_{X}})(y-{{\mu }_{Y}})}}{\sqrt{\sum\limits_{i=1}^{n}{{{(x-{{\mu }_{X}})}^{2}}}}\sqrt{\sum\limits_{i=1}^{n}{{{(y-{{\mu }_{Y}})}^{2}}}}}
ρXY=σXσYcov(X,Y)=σXσYE[(X−μX)(Y−μY)]=i=1∑n(x−μX)2i=1∑n(y−μY)2i=1∑n(x−μX)(y−μY)
Pearson相关系数即将 x x x、 y y y坐标向量各自平移到原点后的夹角余弦。
2.聚类的衡量指标
(1). 均一性: p p p
类似于精确率,一个簇中只包含一个类别的样本,则满足均一性。其实也可以认为就是正确率(每个 聚簇中正确分类的样本数占该聚簇总样本数的比例和)
(2). 完整性: r r r
类似于召回率,同类别样本被归类到相同簇中,则满足完整性;每个聚簇中正确分类的样本数占该
类型的总样本数比例的和
(3). V-measure:
均一性和完整性的加权平均
V = ( 1 + β 2 ) ∗ p r β 2 ∗ p + r V = \frac{(1+\beta^2)*pr}{\beta^2*p+r} V=β2∗p+r(1+β2)∗pr
(4). 轮廓系数
样本 i i i的轮廓系数: s ( i ) s(i) s(i)
簇内不相似度:计算样本 i i i到同簇其它样本的平均距离为 a ( i ) a(i) a(i),应尽可能小。
簇间不相似度:计算样本 i i i到其它簇 C j C_j Cj的所有样本的平均距离 b i j b_{ij} bij,应尽可能大。
轮廓系数: s ( i ) s(i) s(i)值越接近1表示样本 i i i聚类越合理,越接近-1,表示样本 i i i应该分类到 另外的簇中,近似为0,表示样本 i i i应该在边界上;所有样本的 s ( i ) s(i) s(i)的均值被成为聚类结果的轮廓系数。
s ( i ) = b ( i ) − a ( i ) m a x { a ( i ) , b ( i ) } s(i) = \frac{b(i)-a(i)}{max\{a(i),b(i)\}} s(i)=max{a(i),b(i)}b(i)−a(i)
(5). ARI
数据集 S S S共有 N N N个元素, 两个聚类结果分别是:
X = { X 1 , X 2 , . . . , X r } , Y = { Y 1 , Y 2 , . . . , Y s } X=\{{{X}_{1}},{{X}_{2}},...,{{X}_{r}}\},Y=\{{{Y}_{1}},{{Y}_{2}},...,{{Y}_{s}}\} X={X1,X2,...,Xr},Y={Y1,Y2,...,Ys}
X X X和 Y Y Y的元素个数为:
a = { a 1 , a 2 , . . . , a r } , b = { b 1 , b 2 , . . . , b s } a=\{{{a}_{1}},{{a}_{2}},...,{{a}_{r}}\},b=\{{{b}_{1}},{{b}_{2}},...,{{b}_{s}}\} a={a1,a2,...,ar},b={b1,b2,...,bs}
记:
n
i
j
=
∣
X
i
∩
Y
i
∣
{{n}_{ij}}=\left| {{X}_{i}}\cap {{Y}_{i}} \right|
nij=∣Xi∩Yi∣
A R I = ∑ i , j C n i j 2 − [ ( ∑ i C a i 2 ) ⋅ ( ∑ i C b i 2 ) ] / C n 2 1 2 [ ( ∑ i C a i 2 ) + ( ∑ i C b i 2 ) ] − [ ( ∑ i C a i 2 ) ⋅ ( ∑ i C b i 2 ) ] / C n 2 ARI=\frac{\sum\limits_{i,j}{C_{{{n}_{ij}}}^{2}}-\left[ \left( \sum\limits_{i}{C_{{{a}_{i}}}^{2}} \right)\cdot \left( \sum\limits_{i}{C_{{{b}_{i}}}^{2}} \right) \right]/C_{n}^{2}}{\frac{1}{2}\left[ \left( \sum\limits_{i}{C_{{{a}_{i}}}^{2}} \right)+\left( \sum\limits_{i}{C_{{{b}_{i}}}^{2}} \right) \right]-\left[ \left( \sum\limits_{i}{C_{{{a}_{i}}}^{2}} \right)\cdot \left( \sum\limits_{i}{C_{{{b}_{i}}}^{2}} \right) \right]/C_{n}^{2}} ARI=21[(i∑Cai2)+(i∑Cbi2)]−[(i∑Cai2)⋅(i∑Cbi2)]/Cn2i,j∑Cnij2−[(i∑Cai2)⋅(i∑Cbi2)]/Cn2
14 降维-Dimensionality Reduction
14.1 动机一:数据压缩- Motivation I_ Data Compression
第二种类型的无监督学习问题,称为降维。
应用1:数据压缩
数据压缩不仅允许我们压缩数据,因而使用较少的计算机内存或磁盘空间,但它也让我们加快我们的学习算法。
示例:2D到1D
把特征投影到绿色直线上
示例:3D到2D
把3D上的点投影到一个平面上。
这样的处理过程可以被用于把任何维度的数据降到任何想要的维度,例如将1000维的特征降至100维。
14.2 动机二:数据可视化-Motivation II_ Visualization
降维的应用2:数据可视化
超过三维的数据可视化变的十分困难,我们可以通过降维,将一些高维度的数据降到二维,从而进行可视化表示
示例:
假使我们有有关于许多不同国家的数据,每一个特征向量都有50个特征(如GDP,人均GDP,平均寿命等)。如果要将这个50维的数据可视化是不可能的。使用降维的方法将其降至2维,我们便可以将其可视化了。
这样做的问题在于,降维的算法只负责减少维数,新产生的特征的意义就必须由我们自己去发现了。
14.3 主成分分析问题-Principal Component Analysis Problem Formulation
主成分分析(PCA)是最常见的降维算法。
在PCA中,我们要做的是找到一个方向向量(Vector direction),当我们把所有的数据都投射到该向量上时,我们希望投射平均均方误差能尽可能地小。方向向量是一个经过原点的向量,而投射误差是从特征向量向该方向向量作垂线的长度。
PCA问题描述:
问题是要将
n
n
n维数据降至
k
k
k维,目标是找到向量
u
(
1
)
u^{(1)}
u(1),
u
(
2
)
u^{(2)}
u(2),…,
u
(
k
)
u^{(k)}
u(k)使得总的投射误差最小.
主成分分析与线性回归的比较:
主成分分析与线性回归是两种不同的算法。主成分分析最小化的是投射误差(Projected Error),而线性回归尝试的是最小化预测误差。线性回归的目的是预测结果,而主成分分析不作任何预测。
上图中,左边的是线性回归的误差(垂直于横轴投影),右边则是主要成分分析的误差(垂直于红线投影)。
PCA优点:
数据进行降维的处理
完全无参数限制,最后的结果只与数据相关,与用户是独立的。
缺点:
如果用户对观测对象有一定的先验知识,掌握了数据的一些特征,却无法通过参数化等方法对处理过程进行干预,可能会得不到预期的效果,效率也不高。
14.4 主成分分析算法- Principal Component Analysis Algorithm
PCA步骤:
第一步是均值归一化。我们需要计算出所有特征的均值,然后令
x
j
=
x
j
−
μ
j
x_j= x_j-μ_j
xj=xj−μj。如果特征是在不同的数量级上,我们还需要将其除以标准差
σ
2
σ^2
σ2。
第二步是计算协方差矩阵(covariance matrix)
Σ
Σ
Σ:
∑
=
1
m
∑
i
=
1
n
(
x
(
i
)
)
(
x
(
i
)
)
T
\sum=\dfrac {1}{m}\sum^{n}_{i=1}\left( x^{(i)}\right) \left( x^{(i)}\right) ^{T}
∑=m1∑i=1n(x(i))(x(i))T
第三步是计算协方差矩阵 Σ Σ Σ的特征向量(eigenvectors):
在 Octave 里我们可以利用奇异值分解(singular value decomposition)来求解,[U, S, V]= svd(sigma)
。
S
i
g
m
a
=
1
m
∑
i
=
1
n
(
x
(
i
)
)
(
x
(
i
)
)
T
Sigma=\dfrac {1}{m}\sum^{n}_{i=1}\left( x^{(i)}\right) \left( x^{(i)}\right) ^{T}
Sigma=m1i=1∑n(x(i))(x(i))T
对于一个
n
×
n
n×n
n×n维度的矩阵,上式中的
U
U
U是一个具有与数据之间最小投射误差的方向向量构成的矩阵。如果我们希望将数据从
n
n
n维降至
k
k
k维,我们只需要从
U
U
U中选取前
k
k
k个向量,获得一个
n
×
k
n×k
n×k维度的矩阵,我们用
U
r
e
d
u
c
e
U_{reduce}
Ureduce表示,然后通过如下计算获得要求的新特征向量
z
(
i
)
z^{(i)}
z(i):
z
(
i
)
=
U
r
e
d
u
c
e
T
∗
x
(
i
)
z^{(i)}=U^{T}_{reduce}*x^{(i)}
z(i)=UreduceT∗x(i)
其中
x
x
x是
n
×
1
n×1
n×1维的,因此结果为
k
×
1
k×1
k×1维度。注,我们不对方差特征进行处理。
14.5 选择主成分的数量-Choosing The Number Of Principal Components
主要成分分析是减少投射的平均均方误差:
训练集的方差为: 1 m ∑ i = 1 m ∥ x ( i ) ∥ 2 \dfrac {1}{m}\sum^{m}_{i=1}\left\| x^{\left( i\right) }\right\| ^{2} m1∑i=1m∥∥x(i)∥∥2
我们希望在平均均方误差与训练集方差的比例尽可能小的情况下选择尽可能小的
k
k
k值。
如果我们希望这个比例小于1%,就意味着原本数据的偏差有99%都保留下来了,如果我们选择保留95%的偏差,便能非常显著地降低模型中特征的维度了。
我们可以先令 k = 1 k=1 k=1,然后进行主要成分分析,获得 U r e d u c e U_{reduce} Ureduce和 z z z,然后计算比例是否小于1%。如果不是的话再令 k = 2 k=2 k=2,如此类推,直到找到可以使得比例小于1%的最小 k k k 值(原因是各个特征之间通常情况存在某种相关性)。
还有一些更好的方式来选择
k
k
k,当我们在Octave中调用“svd”函数的时候,我们获得三个参数:[U, S, V] = svd(sigma)
。
其中的
S
S
S是一个
n
×
n
n×n
n×n的矩阵,只有对角线上有值,而其它单元都是0,我们可以使用这个矩阵来计算平均均方误差与训练集方差的比例:
1
m
∑
i
=
1
m
∥
x
(
i
)
−
x
a
p
p
r
o
x
(
i
)
∥
2
1
m
∑
i
=
1
m
∥
x
(
i
)
∥
2
=
1
−
Σ
i
=
1
k
S
i
i
Σ
i
=
1
m
S
i
i
≤
1
%
\dfrac {\dfrac {1}{m}\sum^{m}_{i=1}\left\| x^{\left( i\right) }-x^{\left( i\right) }_{approx}\right\| ^{2}}{\dfrac {1}{m}\sum^{m}_{i=1}\left\| x^{(i)}\right\| ^{2}}=1-\dfrac {\Sigma^{k}_{i=1}S_{ii}}{\Sigma^{m}_{i=1}S_{ii}}\leq 1\%
m1∑i=1m∥∥x(i)∥∥2m1∑i=1m∥∥∥x(i)−xapprox(i)∥∥∥2=1−Σi=1mSiiΣi=1kSii≤1%
也就是:
Σ
i
=
1
k
s
i
i
Σ
i
=
1
n
s
i
i
≥
0.99
\frac {\Sigma^{k}_{i=1}s_{ii}}{\Sigma^{n}_{i=1}s_{ii}}\geq0.99
Σi=1nsiiΣi=1ksii≥0.99
14.6 重建的压缩表示- Reconstruction from Compressed Representation
所以,给定的
z
(
i
)
z^{(i)}
z(i),这可能100维,怎么回到你原来的表示
x
(
i
)
x^{(i)}
x(i),这可能是1000维的数组?
在压缩过数据后,我们可以采用如下方法来近似地获得原有的特征:
x
a
p
p
r
o
x
(
i
)
=
U
r
e
d
u
c
e
z
(
i
)
x^{\left( i\right) }_{approx}=U_{reduce}z^{(i)}
xapprox(i)=Ureducez(i)
14.7 主成分分析法的应用建议-Advice for Applying PCA
假使我们正在针对一张 100×100像素的图片进行某个计算机视觉的机器学习,即总共有10000 个特征。
1. 第一步是运用主要成分分析将数据压缩至1000个特征
2. 然后对训练集运行学习算法
3. 在预测时,采用之前学习而来的
U
r
e
d
u
c
e
U_{reduce}
Ureduce将输入的特征
x
x
x转换成特征向量
z
z
z,然后再进行预测
注:如果我们有交叉验证集合测试集,也采用对训练集学习而来的 U r e d u c e U_{reduce} Ureduce。
错误的主要成分分析情况:一个常见错误使用主要成分分析的情况是,将其用于减少过拟合(减少了特征的数量)。这样做非常不好,不如尝试正则化处理。原因在于主要成分分析只是近似地丢弃掉一些特征,它并不考虑任何与结果变量有关的信息,因此可能会丢失非常重要的特征。然而当我们进行正则化处理时,会考虑到结果变量,不会丢掉重要的数据。
另一个常见的错误是,默认地将主要成分分析作为学习过程中的一部分,这虽然很多时候有效果,最好还是从所有原始特征开始,只在有必要的时候(算法运行太慢或者占用太多内存)才考虑采用主要成分分析。
15 异常检测-Anomaly Detection
15.1 问题的动机-Problem Motivation
异常检测示例:
假想你是一个飞机引擎制造商,当你生产的飞机引擎从生产线上流出时,你需要进行QA(质量控制测试),而作为这个测试的一部分,你测量了飞机引擎的一些特征变量,比如引擎运转时产生的热量,或者引擎的振动等等。
这样一来,你就有了一个数据集,从
x
(
1
)
x^{(1)}
x(1)到
x
(
m
)
x^{(m)}
x(m),如果你生产了
m
m
m个引擎的话,你将这些数据绘制成图表
异常检测问题可以定义如下:我们假设后来有一天,你有一个新的飞机引擎从生产线上流出,而你的新飞机引擎有特征变量
x
t
e
s
t
x_{test}
xtest。所谓的异常检测问题就是:我们希望知道这个新的飞机引擎是否有某种异常,或者说,我们希望判断这个引擎是否需要进一步测试。
给定数据集
x
(
1
)
,
x
(
2
)
,
.
.
,
x
(
m
)
x^{(1)},x^{(2)},..,x^{(m)}
x(1),x(2),..,x(m),我们假使数据集是正常的,我们希望知道新的数据
x
t
e
s
t
x_{test}
xtest 是不是异常的,即这个测试数据不属于该组数据的几率如何。我们所构建的模型应该能根据该测试数据的位置告诉我们其属于一组数据的可能性
p
(
x
)
p(x)
p(x)。
上图中,在蓝色圈内的数据属于该组数据的可能性较高,而越是偏远的数据,其属于该组数据的可能性就越低。
这种方法称为密度估计,表达如下:
欺诈检测:
x
(
i
)
=
用
户
的
第
i
个
活
动
特
征
x^{(i)} = {用户的第i个活动特征}
x(i)=用户的第i个活动特征
模型
p
(
x
)
p(x)
p(x) 为我们其属于一组数据的可能性,通过
p
(
x
)
<
ε
p(x) < \varepsilon
p(x)<ε检测非正常用户。
15.2 高斯分布- Gaussian Distribution
通常如果我们认为变量
x
x
x 符合高斯分布
x
∼
N
(
μ
,
σ
2
)
x \sim N(\mu, \sigma^2)
x∼N(μ,σ2)则其概率密度函数为:
p
(
x
,
μ
,
σ
2
)
=
1
2
π
σ
exp
(
−
(
x
−
μ
)
2
2
σ
2
)
p(x,\mu,\sigma^2)=\frac{1}{\sqrt{2\pi}\sigma}\exp\left(-\frac{(x-\mu)^2}{2\sigma^2}\right)
p(x,μ,σ2)=2πσ1exp(−2σ2(x−μ)2)
我们可以利用已有的数据来预测总体中的
μ
μ
μ和
σ
2
σ^2
σ2的计算方法如下:
μ
=
1
m
∑
i
=
1
m
x
(
i
)
\mu=\frac{1}{m}\sum\limits_{i=1}^{m}x^{(i)}
μ=m1i=1∑mx(i)
σ
2
=
1
m
∑
i
=
1
m
(
x
(
i
)
−
μ
)
2
\sigma^2=\frac{1}{m}\sum\limits_{i=1}^{m}(x^{(i)}-\mu)^2
σ2=m1i=1∑m(x(i)−μ)2
注:机器学习中对于方差我们通常只除以
m
m
m而非统计学中的
(
m
−
1
)
(m-1)
(m−1)。这里顺便提一下,在实际使用中,到底是选择使用
1
/
m
1/m
1/m还是
1
/
(
m
−
1
)
1/(m-1)
1/(m−1)其实区别很小,只要你有一个还算大的训练集,在机器学习领域大部分人更习惯使用
1
/
m
1/m
1/m这个版本的公式
15.3 算法-Algorithm
异常检测算法:
对于给定的数据集 x ( 1 ) , x ( 2 ) , . . . , x ( m ) x^{(1)},x^{(2)},...,x^{(m)} x(1),x(2),...,x(m),我们要针对每一个特征计算 μ \mu μ 和 σ 2 \sigma^2 σ2 的估计值。
μ j = 1 m ∑ i = 1 m x j ( i ) \mu_j=\frac{1}{m}\sum\limits_{i=1}^{m}x_j^{(i)} μj=m1i=1∑mxj(i)
σ j 2 = 1 m ∑ i = 1 m ( x j ( i ) − μ j ) 2 \sigma_j^2=\frac{1}{m}\sum\limits_{i=1}^m(x_j^{(i)}-\mu_j)^2 σj2=m1i=1∑m(xj(i)−μj)2
一旦我们获得了平均值和方差的估计值,给定新的一个训练实例,根据模型计算 p ( x ) p(x) p(x):
p ( x ) = ∏ j = 1 n p ( x j ; μ j , σ j 2 ) = ∏ j = 1 1 1 2 π σ j e x p ( − ( x j − μ j ) 2 2 σ j 2 ) p(x)=\prod\limits_{j=1}^np(x_j;\mu_j,\sigma_j^2)=\prod\limits_{j=1}^1\frac{1}{\sqrt{2\pi}\sigma_j}exp(-\frac{(x_j-\mu_j)^2}{2\sigma_j^2}) p(x)=j=1∏np(xj;μj,σj2)=j=1∏12πσj1exp(−2σj2(xj−μj)2)
当 p ( x ) < ε p(x) < \varepsilon p(x)<ε时,为异常。
15.4 开发和评价一个异常检测系统- Developing and Evaluating an Anomaly Detection System
异常检测算法是一个非监督学习算法,意味着我们无法根据结果变量
y
y
y 的值来告诉我们数据是否真的是异常的。
当我们开发一个异常检测系统时,我们从带标记(异常或正常)的数据着手,我们从其中选择一部分正常数据用于构建训练集,然后用剩下的正常数据和异常数据混合的数据构成交叉检验集和测试集。
例如:我们有10000台正常引擎的数据,有20台异常引擎的数据。 我们这样分配数据:
6000台正常引擎的数据作为训练集
2000台正常引擎和10台异常引擎的数据作为交叉检验集
2000台正常引擎和10台异常引擎的数据作为测试集
评价方法:
-
根据测试集数据,我们估计特征的平均值和方差并构建 p ( x ) p(x) p(x)函数
-
对交叉检验集,我们尝试使用不同的 ε \varepsilon ε值作为阀值,并预测数据是否异常,根据 F 1 F1 F1值或者查准率与查全率的比例来选择 ε \varepsilon ε
-
选出 ε \varepsilon ε 后,针对测试集进行预测,计算异常检验系统的 F 1 F1 F1值,或者查准率与查全率之比
15.5 异常检测与监督学习对比-Anomaly Detection vs. Supervised Learning
两者比较:
异常检测 | 监督学习 |
---|---|
非常少量的正向类(异常数据 y = 1 y=1 y=1), 大量的负向类( y = 0 y=0 y=0) | 同时有大量的正向类和负向类 |
许多不同种类的异常,非常难。根据非常 少量的正向类数据来训练算法。 | 有足够多的正向类实例,足够用于训练 算法,未来遇到的正向类实例可能与训练集中的非常近似。 |
未来遇到的异常可能与已掌握的异常、非常的不同。 | |
例如: 欺诈行为检测 生产(例如飞机引擎)检测数据中心的计算机运行状况 | 例如:邮件过滤器 天气预报 肿瘤分类 |
15.6 选择特征- Choosing What Features to Use
对于异常检测算法,我们使用的特征是至关重要的,下面谈谈如何选择特征:
异常检测假设特征符合高斯分布,如果数据的分布不是高斯分布,异常检测算法也能够工作,但是最好还是将数据转换成高斯分布,例如使用对数函数:
x
=
l
o
g
(
x
+
c
)
x= log(x+c)
x=log(x+c),其中
c
c
c 为非负常数; 或者
x
=
x
c
x=x^c
x=xc,
c
c
c为 0-1 之间的一个分数,等方法。
误差分析:
一个常见的问题是一些异常的数据可能也会有较高的 p ( x ) p(x) p(x)值,因而被算法认为是正常的。这种情况下误差分析能够帮助我们,我们可以分析那些被算法错误预测为正常的数据,观察能否找出一些问题。我们可能能从问题中发现我们需要增加一些新的特征,增加这些新特征后获得的新算法能够帮助我们更好地进行异常检测。
异常检测误差分析:
我们通常可以通过将一些相关的特征进行组合,来获得一些新的更好的特征(异常数据的该特征值异常地大或小),例如,在检测数据中心的计算机状况的例子中,我们可以用CPU负载与网络通信量的比例作为一个新的特征,如果该值异常地大,便有可能意味着该服务器是陷入了一些问题中。
15.7 多元高斯分布(选修)-Multivariate Gaussian Distribution (Optional)
假使我们有两个相关的特征,而且这两个特征的值域范围比较宽,这种情况下,一般的高斯分布模型可能不能很好地识别异常数据。其原因在于,一般的高斯分布模型尝试的是去同时抓住两个特征的偏差,因此创造出一个比较大的判定边界。
下图中是两个相关特征,洋红色的线(根据ε的不同其范围可大可小)是一般的高斯分布模型获得的判定边界,很明显绿色的X所代表的数据点很可能是异常值,但是其
p
(
x
)
p(x)
p(x)值却仍然在正常范围内。多元高斯分布将创建像图中蓝色曲线所示的判定边界。
在一般的高斯分布模型中,我们计算
p
(
x
)
p(x)
p(x) 的方法是:
通过分别计算每个特征对应的几率然后将其累乘起来,在多元高斯分布模型中,我们将构建特征的协方差矩阵,用所有的特征一起来计算
p
(
x
)
p(x)
p(x)。
我们首先计算所有特征的平均值,然后再计算协方差矩阵:
p
(
x
)
=
∏
j
=
1
n
p
(
x
j
;
μ
,
σ
j
2
)
=
∏
j
=
1
n
1
2
π
σ
j
e
x
p
(
−
(
x
j
−
μ
j
)
2
2
σ
j
2
)
p(x)=\prod_{j=1}^np(x_j;\mu,\sigma_j^2)=\prod_{j=1}^n\frac{1}{\sqrt{2\pi}\sigma_j}exp(-\frac{(x_j-\mu_j)^2}{2\sigma_j^2})
p(x)=∏j=1np(xj;μ,σj2)=∏j=1n2πσj1exp(−2σj2(xj−μj)2)
μ = 1 m ∑ i = 1 m x ( i ) \mu=\frac{1}{m}\sum_{i=1}^mx^{(i)} μ=m1∑i=1mx(i)
Σ = 1 m ∑ i = 1 m ( x ( i ) − μ ) ( x ( i ) − μ ) T = 1 m ( X − μ ) T ( X − μ ) \Sigma = \frac{1}{m}\sum_{i=1}^m(x^{(i)}-\mu)(x^{(i)}-\mu)^T=\frac{1}{m}(X-\mu)^T(X-\mu) Σ=m1∑i=1m(x(i)−μ)(x(i)−μ)T=m1(X−μ)T(X−μ)
注:其中$\mu $ 是一个向量,其每一个单元都是原特征矩阵中一行数据的均值。最后我们计算多元高斯分布的
p
(
x
)
p\left( x \right)
p(x):
p
(
x
)
=
1
(
2
π
)
n
2
∣
Σ
∣
1
2
e
x
p
(
−
1
2
(
x
−
μ
)
T
Σ
−
1
(
x
−
μ
)
)
p(x)=\frac{1}{(2\pi)^{\frac{n}{2}}|\Sigma|^{\frac{1}{2}}}exp\left(-\frac{1}{2}(x-\mu)^T\Sigma^{-1}(x-\mu)\right)
p(x)=(2π)2n∣Σ∣211exp(−21(x−μ)TΣ−1(x−μ))
其中:
∣
Σ
∣
|\Sigma|
∣Σ∣是定矩阵,在 Octave 中用 det(sigma)
计算
Σ
−
1
\Sigma^{-1}
Σ−1 是逆矩阵,下面我们来看看协方差矩阵是如何影响模型的:
上图是5个不同的模型,从左往右依次分析:
-
是一个一般的高斯分布模型
-
通过协方差矩阵,令特征1拥有较小的偏差,同时保持特征2的偏差
-
通过协方差矩阵,令特征2拥有较大的偏差,同时保持特征1的偏差
-
通过协方差矩阵,在不改变两个特征的原有偏差的基础上,增加两者之间的正相关性
-
通过协方差矩阵,在不改变两个特征的原有偏差的基础上,增加两者之间的负相关性
多元高斯分布模型与原高斯分布模型的关系:
可以证明的是,原本的高斯分布模型是多元高斯分布模型的一个子集,即像上图中的第1、2、3,3个例子所示,如果协方差矩阵只在对角线的单位上有非零的值时,即为原本的高斯分布模型了。
原高斯分布模型和多元高斯分布模型的比较:
原高斯分布模型 | 多元高斯分布模型 |
---|---|
不能捕捉特征之间的相关性 但可以通过将特征进行组合的方法来解决 | 自动捕捉特征之间的相关性 |
计算代价低,能适应大规模的特征 | 计算代价较高 训练集较小时也同样适用 |
必须要有 m > n m>n m>n,不然的话协方差矩阵 Σ \Sigma Σ不可逆的,通常需要 m > 10 n m>10n m>10n 另外特征冗余也会导致协方差矩阵不可逆 |
原高斯分布模型被广泛使用着,如果特征之间在某种程度上存在相互关联的情况,我们可以通过构造新新特征的方法来捕捉这些相关性。
如果训练集不是太大,并且没有太多的特征,我们可以使用多元高斯分布模型。
15.8 使用多元高斯分布进行异常检测(可选)-Anomaly Detection using the Multivariate Gaussian Distribution (Optional)
在我们谈到的最后一个视频,关于多元高斯分布,看到的一些建立的各种分布模型,当你改变参数,
μ
\mu
μ 和
Σ
\Sigma
Σ。在这段视频中,让我们用这些想法,并应用它们制定一个不同的异常检测算法。
要回顾一下多元高斯分布和多元正态分布:
分布有两个参数,
μ
\mu
μ 和
Σ
\Sigma
Σ。其中
μ
\mu
μ这一个
n
n
n维向量和
Σ
\Sigma
Σ 的协方差矩阵,是一种
n
×
n
n\times n
n×n的矩阵。而这里的公式
x
x
x的概率,如按
μ
\mu
μ 和参数化
Σ
\Sigma
Σ,和你的变量
μ
\mu
μ 和
Σ
\Sigma
Σ,你可以得到一个范围的不同分布一样,你知道的,这些都是三个样本,那些我们在以前的视频看过了。
因此,让我们谈谈参数拟合或参数估计问题:
我有一组样本 x ( 1 ) , x ( 2 ) , . . . , x ( m ) {{{ x^{(1)},x^{(2)},...,x^{(m)}} }} x(1),x(2),...,x(m)是一个 n n n维向量,我想我的样本来自一个多元高斯分布。我如何尝试估计我的参数 μ \mu μ 和 Σ \Sigma Σ 以及标准公式?
估计他们是你设置 μ \mu μ 是你的训练样本的平均值。
μ
=
1
m
∑
i
=
1
m
x
(
i
)
\mu=\frac{1}{m}\sum_{i=1}^{m}x^{(i)}
μ=m1∑i=1mx(i)
并设置
Σ
\Sigma
Σ:
Σ
=
1
m
∑
i
=
1
m
(
x
(
i
)
−
μ
)
(
x
(
i
)
−
μ
)
T
\Sigma=\frac{1}{m}\sum_{i=1}^{m}(x^{(i)}-\mu)(x^{(i)}-\mu)^T
Σ=m1∑i=1m(x(i)−μ)(x(i)−μ)T
这其实只是当我们使用PCA算法时候,有
Σ
\Sigma
Σ 时写出来。所以你只需插入上述两个公式,这会给你你估计的参数
μ
\mu
μ 和你估计的参数
Σ
\Sigma
Σ。所以,这里给出的数据集是你如何估计
μ
\mu
μ 和
Σ
\Sigma
Σ。让我们以这种方法而只需将其插入到异常检测算法。那么,我们如何把所有这一切共同开发一个异常检测算法?
首先,我们把我们的训练集,和我们的拟合模型,我们计算
p
(
x
)
p(x)
p(x),要知道,设定
μ
\mu
μ和描述的一样
Σ
\Sigma
Σ。
如图,该分布在中央最多,越到外面的圈的范围越小。
并在该点是出路这里的概率非常低。
原始模型与多元高斯模型的关系如图:
其中:协方差矩阵
Σ
\Sigma
Σ为:
原始模型和多元高斯分布比较如图: