赞
踩
机器学习算法中有一个训练数据的概念。训练数据包括几个部分:
如您所见,训练数据可能具有相当复杂的结构;此外,训练数据可能非常庞大和/或不完全可用,因此需要对这一概念进行抽象。在 OpenCV ml 中,cv::ml::TrainData 类可用于此目的。
这个简单的分类模型假定每个类别的特征向量都是正态分布(但不一定是独立分布)。因此,整个数据分布函数被假定为高斯混合物,每类一个分量。该算法使用训练数据估计每个类别的均值向量和协方差矩阵,然后使用它们进行预测。
该算法会缓存所有训练样本,并通过使用投票、计算加权和等方法分析样本的一定数量(K)近邻来预测新样本的响应。这种方法有时被称为 “举例学习”,因为在预测时,它会寻找与给定向量最接近的已知响应特征向量。
最初,支持向量机(SVM)是一种建立最佳二元(两类)分类器的技术。后来,该技术扩展到回归和聚类问题。SVM 是基于核的方法的一部分。它使用核函数将特征向量映射到一个高维空间,并在此空间中建立一个最佳线性判别函数或一个与训练数据相匹配的最佳超平面。SVM 没有明确定义核。相反,需要定义超空间中任意两点之间的距离。
解决方案是最优的,这意味着分离超平面与来自两类的最近特征向量(如果是两类分类器)之间的余量是最大的。最接近超平面的特征向量被称为支持向量,这意味着其他向量的位置不会影响超平面(决策函数)。
SVM 在 OpenCV 中的实现基于 [47] 方法。
应使用 StatModel::predict(samples,results,flags)。通过 flags=StatModel::RAW_OUTPUT 可以获取 SVM 的原始响应(在回归、1 类或 2 类分类问题中)。
本节讨论的 ML 类实现了 [37] 中描述的分类树和回归树算法。
类 cv::ml::DTrees 表示单个决策树或决策树集合。它也是 RTrees 和 Boost 的基类。
决策树是一种二叉树(每个非叶节点都有两个子节点)。它既可用于分类,也可用于回归。在分类时,每个树叶都标有一个类标签;多个树叶可能具有相同的标签。对于回归,每个树叶也会分配一个常数,因此近似函数是片断常数。
为了到达叶节点并获得输入特征向量的响应,预测过程从根节点开始。从每个非叶节点开始,程序会根据某个变量的值向左(选择左边的子节点作为下一个观察节点)或向右(该变量的索引存储在观察节点中)移动。可以使用以下变量
decision_rule (threshold/subset)
)。这对实体称为拆分(拆分变量变量_index )。一旦到达叶节点,分配给该节点的值就会被用作预测程序的输出。有时,输入向量的某些特征会被遗漏(例如,在黑暗中很难确定物体的颜色),预测程序可能会停留在某个节点上(在上述例子中,如果节点是按颜色分割的)。为了避免出现这种情况,决策树使用了所谓的代理分割。也就是说,除了最佳的 "主要 "拆分外,每个树节点还可以拆分为一个或多个其他变量,结果几乎相同。
决策树从根节点开始递归构建。所有的训练数据(特征向量和响应)都用来分割根节点。在每个节点中,根据某些标准找到最佳决策规则(最佳 "主要 "拆分)。在机器学习中,基尼 "纯度 "标准用于分类,平方误差之和用于回归。然后,在必要的情况下,找到代理分割。它们与训练数据的主分割结果相似。所有数据都将使用主分割和代理分割(就像在预测程序中一样)在左侧和右侧子节点之间进行分割。然后,程序递归地分割左节点和右节点。在以下任一情况下,递归过程可能会在每个节点上停止(即停止进一步分割节点):
树建立后,如有必要,可以使用交叉验证程序对其进行修剪。也就是说,剪掉树中可能导致模型过拟合的一些分支。通常情况下,这一程序只适用于独立的决策树。通常,决策树集合会构建足够小的决策树,并使用自己的保护方案来防止过度拟合。
除了预测是决策树的一个明显用途外,决策树还可用于各种数据分析。所构建的决策树算法的关键特性之一是能够计算每个变量的重要性(相对决定性)。例如,在使用邮件中出现的一组单词作为特征向量的垃圾邮件过滤器中,变量重要性评级可用于确定最 "垃圾 "的单词,从而有助于保持合理的字典大小。
每个变量的重要性都是根据树中该变量的所有拆分(主要拆分和代理拆分)计算得出的。因此,为了正确计算变量的重要性,即使没有缺失数据,也必须在训练参数中启用代理分词。
常见的机器学习任务是监督学习。在监督学习中,目标是学习输入 x 和输出 y 之间的函数关系 F:y=F(x)。预测定性输出称为分类,而预测定量输出称为回归。
助推是一个强大的学习概念,为监督分类学习任务提供了一种解决方案。它将许多 "弱 "分类器的性能结合起来,形成一个强大的机构 [257] 。弱分类器只要求优于偶然性,因此可以非常简单,计算成本也不高。然而,许多弱分类器能巧妙地将结果组合成一个强分类器,其性能往往优于 SVM 和神经网络等大多数 "单体 "强分类器。
决策树是增强方案中最常用的弱分类器。通常,最简单的决策树每棵树只有一个分裂节点(称为树桩)就足够了。
提升模型基于 N 个训练实例
(
x
i
,
y
i
)
1
N
当
x
i
∈
R
K
且
y
i
∈
−
1
,
+
1
\left( x_i,y_i \right) 1N\ \text{当\ }x_i\in R^K\text{且\ }y_i\in -1\text{,}+1
(xi,yi)1N 当 xi∈RK且 yi∈−1,+1
xi是k分量向量。每个分量编码一个与当前学习任务相关的特征。所需的两类输出被编码为-1 和+1。
提升法的不同变体被称为离散 Adaboost、真实 AdaBoost、LogitBoost 和温和 AdaBoost [86] 。它们的整体结构非常相似。因此,本章只关注标准的两类离散 AdaBoost 算法,概述如下。首先,为每个样本分配相同的权重(步骤 2)。然后,在加权训练数据上训练弱分类器
f
m
(
x
)
f_{m\left( x \right)}
fm(x)
(步骤 3a)。计算其加权训练误差和缩放因子
c
m
c_m
cm
(步骤 3b)。对于分类错误的训练样本,会增加权重(步骤 3c)。然后对所有权重进行归一化处理,并继续 M -1 次寻找下一个弱分类器。最终的分类器 F(x) 是各个弱分类器加权和的符号(第 4 步)。
设置
N
个实例
(
x
i
,
y
i
)
1
N
,
x
i
∈
R
K
,
y
i
∈
−
1
,
+
1
。
设置N个实例\left( x_i,y_i \right) 1N,x_i∈R^K,y_i∈-1,+1。
设置N个实例(xi,yi)1N,xi∈RK,yi∈−1,+1。
分配权重
w
i
=
1
/
N
,
i
=
1
,
.
.
.
,
N
。
分配权重w_i=1/N,i=1,...,N。
分配权重wi=1/N,i=1,...,N。
对于
m
=
1
,
2
,
.
.
.
,
M
,重复上述步骤:
对于m=1,2,...,M,重复上述步骤:
对于m=1,2,...,M,重复上述步骤:
在训练数据上使用权重
w
i
拟合分类器
f
m
(
x
)
∈
−
1
,
1
。
在训练数据上使用权重w_i拟合分类器f_m\left( x \right) ∈-1,1。
在训练数据上使用权重wi拟合分类器fm(x)∈−1,1。
计算
e
r
r
m
=
E
w
[
1
(
y
≠
f
m
(
x
)
)
]
,
c
m
=
l
o
g
(
(
1
−
e
r
r
m
)
/
e
r
r
m
)
.
计算err_m=E_w\left[ 1_{\left( y≠f_m\left( x \right) \right)} \right] ,c_m=log\left( \left( 1-err_m \right) /err_m \right) .
计算errm=Ew[1(y=fm(x))],cm=log((1−errm)/errm).
设
w
i
⇐
w
i
e
x
p
[
c
m
1
(
y
i
≠
f
m
(
x
i
)
)
]
,
i
=
1
,
2
,
.
.
.
,
N
,
并重新规范化,使
Σ
i
w
i
=
1
。
设w_i⇐w_iexp\left[ c_m1_{\left( y_i≠f_m\left( x_i \right) \right)} \right] ,i=1,2,...,N,并重新规范化,使\varSigma iw_i=1。
设wi⇐wiexp[cm1(yi=fm(xi))],i=1,2,...,N,并重新规范化,使Σiwi=1。
使用公式:
s
i
g
n
(
Σ
m
=
1
M
c
m
f
m
(
x
)
)
对新样本
x
进行分类。
使用公式:sign\left( \varSigma m=1Mc_mf_m\left( x \right) \right) 对新样本x进行分类。
使用公式:sign(Σm=1Mcmfm(x))对新样本x进行分类。
注释
与经典的提升方法类似,目前的实现只支持两类分类器。对于 M > 2 的分类,AdaBoost.MH 算法(描述于 [86] 中)可将问题简化为两类问题,但训练集要大得多。
为了减少提升模型的计算时间而不大幅降低准确度,可以采用影响修剪技术。随着训练算法的进行和集合树数量的增加,越来越多的训练样本会被正确分类,而且置信度越来越高,因此这些样本在随后的迭代中会获得较小的权重。相对权重很低的样本对弱分类器的训练影响很小。因此,可以在弱分类器训练过程中排除这些样本,而不会对诱导分类器产生太大影响。这一过程由 weight_trim_rate 参数控制。在弱分类器训练中,只使用总权重中 weight_trim_rate 为摘要部分的例子。需要注意的是,所有训练实例的权重都会在每次训练迭代时重新计算。在特定迭代中删除的示例可能会再次用于进一步学习某些弱分类器**[86]**。
应使用 StatModel::predict(samples,results,flags)。通过 flags=StatModel::RAW_OUTPUT 可以获得 Boost 分类器的原始总和。
随机树由 Leo Breiman 和 Adele Cutler 提出:http://www.stat.berkeley.edu/users/breiman/RandomForests/。该算法可以处理分类和回归问题。随机树是树状预测器的集合(集合),在本节中进一步称为森林(该术语也是由 L. Breiman 提出的)。分类工作原理如下:随机树分类器获取输入特征向量,用森林中的每一棵树对其进行分类,然后输出获得多数 "选票 "的类别标签。在回归的情况下,分类器的响应是森林中所有树的响应的平均值。
所有的树都使用相同的参数进行训练,但训练集不同。这些训练集是从原始训练集中使用引导程序生成的:对于每个训练集,随机选择与原始训练集相同数量的向量(=N)。这些向量是替换选择的。也就是说,有些向量会出现不止一次,有些则不会出现。在每棵训练树的每个节点上,不是使用所有变量来找到最佳分割,而是使用其中的一个随机子集。每个节点都会生成一个新的子集。不过,所有节点和所有树的子集大小都是固定的。这是一个训练参数,默认设置为
n
u
m
b
e
r
_
o
f
_
v
a
r
i
a
b
l
e
s
\sqrt{number\_of\_variables}
number_of_variables
所有生成的树都不会被修剪。
在随机树中,不需要任何准确性估算程序,如交叉验证或自举法,也不需要单独的测试集来估算训练误差。误差是在训练过程中内部估算出来的。当当前树的训练集通过替换抽样的方式抽取时,一些向量会被忽略(即所谓的 oob(out-of-bag) 数据)。Oob 数据的大小约为 N/3。利用这些 oob 数据可以估算出分类误差,具体方法如下:
在回归的情况下,oob 误差的计算方法是 oob 向量差异的平方误差除以向量总数。
有关随机树的使用示例,请参见 OpenCV 发行版中的 letter_recog.cpp。
期望最大化(EM)算法以高斯混合物分布的形式估计多元概率密度函数的参数,并指定混合物的数量。
考虑来自 d 维欧几里得空间的 N 个特征向量集合 { x1,x2,…xN },这些特征向量来自高斯混合物:
p
(
x
;
a
k
,
S
k
,
π
k
)
=
∑
k
=
1
m
π
k
p
k
(
x
)
,
π
k
≥
0
,
∑
k
=
1
m
π
k
=
1
p\left( x;a_k,S_k,\pi _k \right) =\sum_{k=1}^m{\pi _kp_k\left( x \right) ,\ \ \pi _k\ge 0\text{,\\ }\sum_{k=1}^m{\pi _k=1}}
p(x;ak,Sk,πk)=k=1∑mπkpk(x), πk≥0, k=1∑mπk=1
p
k
(
x
)
=
φ
(
x
;
a
k
,
S
k
)
=
1
(
2
π
)
d
/
2
∣
S
k
∣
1
/
2
exp
{
−
1
2
(
x
−
a
k
)
T
S
k
−
1
(
x
−
a
k
)
}
p_k\left( x \right) =\varphi \left( x;a_k,S_k \right) =\frac{1}{\left( 2\pi \right) ^{d/2}|S_k|^{1/2}}\exp \left\{ -\frac{1}{2}\left( x-a_k \right) ^TS_k^{-1}\left( x-a_k \right) \right\}
pk(x)=φ(x;ak,Sk)=(2π)d/2∣Sk∣1/21exp{−21(x−ak)TSk−1(x−ak)}
其中,m 是混合物的数量,pk 是均值为 ak、协方差矩阵为 Sk 的正态分布密度,πk 是第 k 个混合物的权重。给定混合物数量 M 和样本 xi, i=1…N 后,算法会找到所有混合物参数,即 ak、Sk 和 πk 的最大似然估计值(MLE):
L
(
x
,
θ
)
=
log
p
(
x
,
θ
)
=
∑
i
=
1
N
log
(
∑
k
=
1
m
π
k
p
k
(
x
)
)
→
max
θ
∈
Θ
L\left( x,\theta \right) =\log p\left( x,\theta \right) =\sum_{i=1}^N{\log \left( \sum_{k=1}^m{\pi _kp_k\left( x \right)} \right) \rightarrow \max_{\theta \in \varTheta}}
L(x,θ)=logp(x,θ)=i=1∑Nlog(k=1∑mπkpk(x))→θ∈Θmax
Θ
=
{
(
a
k
,
S
k
,
π
k
)
;
a
k
∈
R
d
,
S
k
=
S
k
T
>
0
,
S
k
∈
R
d
×
d
,
π
k
>
0
,
∑
i
=
1
m
π
k
=
1
}
\varTheta =\left\{ \left( a_k,S_k,\pi _k \right) ;a_k\in \mathbb{R}^d,S_k=S_k^T>0,S_k\in \mathbb{R}^{d\times d},\pi _k>0,\sum_{i=1}^m{\pi _k=1} \right\}
Θ={(ak,Sk,πk);ak∈Rd,Sk=SkT>0,Sk∈Rd×d,πk>0,i=1∑mπk=1}
EM 算法是一种迭代程序。每次迭代包括两个步骤。第一步(Expectation step 或 E-step),利用当前可用的混合物参数估计值,找到样本 i 属于混合物 k 的概率 pi,k(在下面的公式中表示为 αi,k):
a
k
i
=
π
k
φ
(
x
;
a
k
,
S
k
)
∑
j
=
1
m
π
j
φ
(
x
;
a
j
,
S
j
)
a_{ki}=\frac{\pi _k\varphi \left( x;a_k,S_k \right)}{\sum_{j=1}^m{\pi _j\varphi \left( x;a_j,S_j \right)}}
aki=∑j=1mπjφ(x;aj,Sj)πkφ(x;ak,Sk)
在第二步(最大化步骤或 M 步骤)中,利用计算出的概率对混合参数估计进行改进:
π
k
=
1
N
∑
i
=
1
N
a
k
i
,
a
k
=
∑
i
=
1
N
a
k
i
x
i
∑
i
=
1
N
a
k
i
,
S
k
=
∑
i
=
1
N
a
k
i
(
x
i
−
a
k
)
(
x
i
−
a
k
)
T
∑
i
=
1
N
a
k
i
\pi _k=\frac{1}{N}\sum_{i=1}^N{a_{ki},\ \ a_k=\frac{\sum_{i=1}^N{a_{_{ki}}x_i}}{\sum_{i=1}^N{a_{_{ki}}}}},\ \ S_k=\frac{\sum_{i=1}^N{a_{ki}\left( x_i-a_k \right) \left( x_i-a_k \right) ^T}}{\sum_{i=1}^N{a_{_{ki}}}}
πk=N1i=1∑Naki, ak=∑i=1Naki∑i=1Nakixi, Sk=∑i=1Naki∑i=1Naki(xi−ak)(xi−ak)T
或者,当可以提供 pi,k 的初始值时,算法可以从 M 步开始。当 pi,k 未知时,另一种方法是使用更简单的聚类算法对输入样本进行预聚类,从而获得初始 pi,k。通常(包括机器学习),k-means 算法可用于此目的。
EM 算法的主要问题之一是需要估计大量参数。大部分参数存在于协方差矩阵中,每个协方差矩阵有 d×d 个元素,其中 d 是特征空间的维度。然而,在许多实际问题中,协方差矩阵接近对角线,甚至接近 μk∗I,其中 I 是标识矩阵,μk 是依赖于混合物的 "规模 "参数。因此,稳健计算方案可以先对协方差矩阵施加更严格的约束,然后将估计参数作为输入,用于约束较少的优化问题(通常对角协方差矩阵已经是足够好的近似值)。
ML 实现了前馈式人工神经网络,尤其是多层感知器 (MLP),这是最常用的神经网络类型。MLP 由输入层、输出层和一个或多个隐藏层组成。MLP 的每一层都包括一个或多个与上一层和下一层神经元定向连接的神经元。下面的示例是一个三层感知器,有三个输入层、两个输出层和包括五个神经元的隐藏层:
MLP 中的所有神经元都是相似的。每个神经元都有几个输入链接(它将上一层几个神经元的输出值作为输入)和几个输出链接(它将响应传递给下一层的几个神经元)。从上一层获取的值与每个神经元的特定权重相加,再加上偏置项。总和通过激活函数 f 进行转换,不同神经元的激活函数可能不同。
换句话说,给定第 n 层的输出 xj,第 n+1 层的输出 yi 的计算公式为:
u
i
=
∑
ω
i
,
j
n
+
1
∗
x
j
+
ω
i
,
b
i
a
s
n
+
1
u_i=\sum_{}^{}{\omega _{i,j}^{n+1}}*x_j+\omega _{i,bias}^{n+1}
ui=∑ωi,jn+1∗xj+ωi,biasn+1
y
i
=
f
(
u
i
)
y_i=f\left( u_i \right)
yi=f(ui)
可以使用不同的激活函数。ML 实现了三种标准函数:
在 ML 中,所有神经元都具有相同的激活函数,其自由参数(α,β)由用户指定,训练算法不会改变。
因此,整个训练网络的工作原理如下:
因此,要计算网络,需要知道所有权重
ω
i
,
j
n
+
1
\omega _{i,j}^{n+1}
ωi,jn+1
权重由训练算法计算。该算法需要一个训练集、多个输入向量和相应的输出向量,并反复调整权重,使网络对所提供的输入向量做出所需的响应。
网络规模(隐层数及其大小)越大,网络的潜在灵活性就越大。训练集上的误差可以做得非常小。但与此同时,学习网络也会 "学习 "训练集中的噪声,因此在网络规模达到一定限度后,测试集中的误差通常会开始增加。此外,大型网络的训练时间比小型网络要长得多,因此使用 cv::PCA 或类似技术对数据进行预处理,并只对基本特征训练较小的网络是合理的。
MLP 的另一个特点是无法处理分类数据。不过,有一种解决方法。如果输入层或输出层(在 n 类分类器 n>2 的情况下)的某个特征是分类的,并且可以取 M>2 个不同的值,那么将其表示为由 M 个元素组成的二进制元组是有意义的,其中第 i 个元素为 1,当且仅当该特征等于 M 个可能值中的第 i 个值。这样做虽然增加了输入/输出层的大小,但却加快了训练算法的收敛速度,同时还能对此类变量进行 "模糊 "取值,即用概率元组代替固定值。
ML 实现了两种训练 MLP 的算法。第一种算法是经典的随机顺序反向传播算法。第二种(默认)算法是批量 RPROP 算法。
ML 实现了逻辑回归,这是一种概率分类技术。逻辑回归是一种二元分类算法,与支持向量机(SVM)密切相关。与 SVM 相似,逻辑回归也可扩展用于多类分类问题,如数字识别(即从给定图像中识别 0、1、2、3…等数字)。此版本的逻辑回归支持二元分类和多类分类(对于多类分类,它创建了多个二元分类器)。为了训练逻辑回归分类器,使用了批量梯度下降算法和迷你批量梯度下降算法(见 http://en.wikipedia.org/wiki/Gradient_descent_optimization)。逻辑回归是一种判别分类器(详见 http://www.cs.cmu.edu/~tom/NewChapters.html)。Logistic 回归以 LogisticRegression 这个 C++ 类的形式实现。
在逻辑回归中,我们试图优化训练参数 θ,从而实现假设
0
≤
h
θ
(
x
)
≤
1
0\le h_{\theta}\left( x \right) \le 1
0≤hθ(x)≤1
我们将
h
θ
(
x
)
=
g
(
h
θ
(
x
)
)
和
g
(
z
)
=
1
1
+
e
−
z
h_{\theta}\left( x \right) =g\left( h_{\theta}\left( x \right) \right) 和g\left( z \right) =\frac{1}{1+e^{-z}}
hθ(x)=g(hθ(x))和g(z)=1+e−z1
视为对数函数或西格玛函数。逻辑回归中的 "Logistic "一词指的就是这个函数。对于 0 类和 1 类二元分类问题的给定数据,如果 hθ(x)≥0.5 则可以确定给定数据实例属于 1 类,如果 hθ(x)<0.5 则可以确定给定数据实例属于 0 类。
在逻辑回归中,选择正确的参数对于减少训练误差和确保高训练精度至关重要:
逻辑回归分类器的训练参数样本集初始化如下:
Ptr<LogisticRegression> lr1 = LogisticRegression::create();
lr1->setLearningRate(0.001);
lr1->setIterations(10);
lr1->setRegularization(LogisticRegression::REG_L2);
lr1->setTrainMethod(LogisticRegression::BATCH);
lr1->setMiniBatchSize(1);
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。