分类调优——基于SVM的人脸识别(更新)

支持向量机SVM

  支持向量机SVM是20世纪90年代在计算机界发展起来的一种分类算法,在许多问题中都被证明有较好的效果,被认为是适应性最广的算法之一。
在这里插入图片描述

  支持向量机的基本原理非常简单,如图所视,白色和蓝色的点各为一类,我们的目标是找到一个分割平面将两个类别分开。通常来说,如果数据本身是线性可分的,那么事实上存在无数个这样的超平面。这是因为给定一个分割平面稍微上移下移或旋转这个超平面,只要不接触这些观测点,仍然可以将数据分开。一个很自然的想法就是找到最大间隔超平面,即找到一个分割平面距离最近的观测点最远。下面我们来严格推导:
我们根据距离超平米那最近的点,只要同时缩放w和b可以得到: w T x 1 + b = 1 与 w T x 2 + b = − 1 w^Tx1+b=1与w^Tx2+b=−1 wTx1+b=1wTx2+b=1,因此:
w T x 1 + b = 1   w T x 2 + b = − 1   ( w T x 1 + b ) − ( w T x 2 + b ) = 2   w T ( x 1 − x 2 ) = 2   w T ( x 1 − x 2 ) = ∣ w ∣ 2 ∣ x 1 − x 2 ∣ 2 cos ⁡ θ = 2   ∣ x 1 − x 2 ∣ 2 cos ⁡ θ = 2 ∣ w ∣ 2   d 1 = d 2 = ∣ x 1 − x 2 ∣ 2 cos ⁡ θ 2 = 2 ∣ w ∣ 2 2 = 1 ∣ w ∣ 2   d 1 + d 2 = 2 ∣ w ∣ 2 \begin{array}{l} w^{T} x_{1}+b=1 \ w^{T} x_{2}+b=-1 \ \left(w^{T} x_{1}+b\right)-\left(w^{T} x_{2}+b\right)=2 \ w^{T}\left(x_{1}-x_{2}\right)=2 \ \qquad \begin{array}{l} w^{T}\left(x_{1}-x_{2}\right)=|w|{2}\left|x{1}-x_{2}\right|{2} \cos \theta=2 \ \left|x{1}-x_{2}\right|{2} \cos \theta=\frac{2}{|w|{2}} \end{array} \ \qquad \begin{array}{l} d_{1}=d_{2}=\frac{\left|x_{1}-x_{2}\right|{2} \cos \theta}{2}=\frac{\frac{2}{|w|{2}}}{2}=\frac{1}{|w|{2}} \ d{1}+d_{2}=\frac{2}{|w|{2}} \end{array} \end{array} wTx1+b=1 wTx2+b=1 (wTx1+b)(wTx2+b)=2 wT(x1x2)=2 wT(x1x2)=w2x1x22cosθ=2 x1x22cosθ=w22 d1=d2=2x1x22cosθ=2w22=w21 d1+d2=w22
由此可知道SVM模型的具体形式:
min ⁡ w , b 1 2 ∣ w ∣ 2   s.t.  y ( i ) ( w T x ( i ) + b ) ≥ 1 , i = 1 , … , n \begin{aligned} \min {w, b} & \frac{1}{2}|w|^{2} \ \text { s.t. } & y^{(i)}\left(w^{T} x^{(i)}+b\right) \geq 1, \quad i=1, \ldots, n \end{aligned} minw,b21w2  s.t. y(i)(wTx(i)+b)1,i=1,,n
可以将约束条件写为: g i ( w ) = − y ( i ) ( w T x ( i ) + b ) + 1 ≤ 0 g{i}(w)=-y^{(i)}\left(w^{T} x^{(i)}+b\right)+1 \leq 0 gi(w)=y(i)(wTx(i)+b)+10 可以将优化问题拉格朗日化 L ( w , b , α ) = 1 2 ∣ w ∣ 2 − ∑ i = 1 n α i [ y ( i ) ( w T x ( i ) + b ) − 1 ] \mathcal{L}(w, b, \alpha)=\frac{1}{2}|w|^{2}-\sum{i=1}^{n} \alpha_{i}\left[y^{(i)}\left(w^{T} x^{(i)}+b\right)-1\right] L(w,b,α)=21w2i=1nαi[y(i)(wTx(i)+b)1]
因此:
L ( w , b , α ) = 1 2 ∣ w ∣ 2 − ∑ i = 1 n α i [ y ( i ) ( w T x ( i ) + b ) − 1 ] \mathcal{L}(w, b, \alpha)=\frac{1}{2}|w|^{2}-\sum_{i=1}^{n} \alpha_{i}\left[y^{(i)}\left(w^{T} x^{(i)}+b\right)-1\right] L(w,b,α)=21w2i=1nαi[y(i)(wTx(i)+b)1]
欲构造dual问题,首先求拉格朗日化的问题中 w w w b b b的值,对 w w w求梯度,令梯度为0,可求得w:对b求梯度,令梯度为0,可得:
∂ ∂ b L ( w , b , α ) = ∑ i = 1 n α i y ( i ) = 0 \frac{\partial}{\partial b} \mathcal{L}(w, b, \alpha)=\sum_{i=1}^{n} \alpha_{i} y^{(i)}=0 bL(w,b,α)=i=1nαiy(i)=0
将 w 带入拉格朗日化的原问题可得
( w , b , α ) = ∑ n i = 1 α i − 12 ∑ n i , j = 1 y ( i ) y ( j ) α i α j ( x ( i ) ) T x ( j ) − b ∑ n i = 1 α i y ( i ) (w,b,α)=∑ni=1αi−12∑ni,j=1y(i)y(j)αiαj(x(i))Tx(j)−b∑ni=1αiy(i) (w,b,α)=ni=1αi12ni,j=1y(i)y(j)αiαj(x(i))Tx(j)bni=1αiy(i)
( w , b , α ) = ∑ n i = 1 α i − 12 ∑ n i , j = 1 y ( i ) y ( j ) α i α j ( x ( i ) ) T x ( j ) (w,b,α)=∑ni=1αi−12∑ni,j=1y(i)y(j)αiαj(x(i))Tx(j) (w,b,α)=ni=1αi12ni,j=1y(i)y(j)αiαj(x(i))Tx(j)

因此:
 对拉格朗日化的原问题求最小值, 得到了  w  , 现在可以构造 dual 问題   max ⁡ α W ( α ) = ∑ i = 1 n α i − 1 2 ∑ i , j = 1 n y ( i ) y ( j ) α i α j ⟨ x ( i ) , x ( j ) ⟩   s.t.  α i ≥ 0 , i = 1 , … , n   ∑ i = 1 n α i y ( i ) = 0    可以推导出 b的值为:  b = − max ⁡ i : y ( i ) = − 1 w T x ( i ) + min ⁡ i : y ( i ) = 1 w ∗ T x ( i ) 2    SVM的决策子如下,值的符号为类别.   w T x + b = ( ∑ i = 1 n α i y ( i ) x ( i ) ) T x + b = ∑ i = 1 n α i y ( i ) ⟨ x ( i ) , x ⟩ + b \begin{aligned} &\text { 对拉格朗日化的原问题求最小值, 得到了 } \mathrm{w} \text { , 现在可以构造 dual 问題 }\ &\begin{aligned} \max {\alpha} & W(\alpha)=\sum{i=1}^{n} \alpha_{i}-\frac{1}{2} \sum_{i, j=1}^{n} y^{(i)} y^{(j)} \alpha_{i} \alpha_{j}\left\langle x^{(i)}, x^{(j)}\right\rangle \ \text { s.t. } & \alpha_{i} \geq 0, \quad i=1, \ldots, n \ & \sum_{i=1}^{n} \alpha_{i} y^{(i)}=0 \end{aligned}\ &\text { 可以推导出 b的值为: } b^{}=-\frac{\max _{i: y^{(i)}=-1} w^{ T} x^{(i)}+\min {i: y^{(i)}=1} w^{* T} x^{(i)}}{2}\ &\begin{array}{r} \text { SVM的决策子如下,值的符号为类别. } \ \qquad w^{T} x+b=\left(\sum{i=1}^{n} \alpha_{i} y^{(i)} x^{(i)}\right)^{T} x+b=\sum_{i=1}^{n} \alpha_{i} y^{(i)}\left\langle x^{(i)}, x\right\rangle+b \end{array} \end{aligned}  对拉格朗日化的原问题求最小值得到了 w , 现在可以构造 dual 问題  maxαW(α)=i=1nαi21i,j=1ny(i)y(j)αiαjx(i),x(j)  s.t. αi0,i=1,,n i=1nαiy(i)=0  可以推导出 b的值为b=2maxi:y(i)=1wTx(i)+mini:y(i)=1wTx(i)  SVM的决策子如下,值的符号为类别 wTx+b=(i=1nαiy(i)x(i))Tx+b=i=1nαiy(i)x(i),x+b

非线性支持向量机

在刚刚的讨论中,我们都是着重讨论了线性支持向量机是如何工作的,但是在现实生活中,我们很难碰到线性可分的数据集,如:
jupyter

那我们应该如何处理非线性问题呢?答案就是将数据投影至更加高的维度!
在这里插入图片描述
上图中,在一维数据做不到线性可分,我们将数据投影至二维平面就可以成功线性可分。那么,我们来详细探讨下这其中的奥妙:
Φ:↦̂ =Φ(x) Φ([xi1,xi2])=[xi1,xi2,xi1xi2,x2i1,x2i2]

如果我们使用上面公式的形式将低维数据拓展至高维数据,则必须面临一个很大的问题,那就是:维度爆炸导致的计算量太大的问题。假如是一个2维特征的数据,我们可以将其映射到5维来做特征的内积,如果原始空间是三维,可以映射到到19维空间,似乎还可以处理。但是如果我们的低维特征是100个维度,1000个维度呢?那么我们要将其映射到超级高的维度来计算特征的内积。这时候映射成的高维维度是爆炸性增长的,这个计算量实在是太大了,而且如果遇到无穷维的情况,就根本无从计算了。能不能呢个避免这个问题呢?核函数隆重登场:
回顾线性可分SVM的优化目标函数:
m i n ⏟ α 1 2 ∑ i = 1 , j = 1 m α i α j y i y j x i ∙ x j − ∑ i = 1 m α i   s . t . ; ∑ i = 1 m α i y i = 0   0 ≤ α i ≤ C \underbrace{ min }{\alpha} \frac{1}{2}\sum\limits{i=1,j=1}^{m}\alpha_i\alpha_jy_iy_jx_i \bullet x_j - \sum\limits_{i=1}^{m}\alpha_i\ s.t. ; \sum\limits_{i=1}^{m}\alpha_iy_i = 0\ 0 \leq \alpha_i \leq C minα21i=1,j=1mαiαjyiyjxixji=1mαi s.t.;i=1mαiyi=0 0αiC
注意到上式低维特征仅仅以内积 x i ∙ x j xi∙xj xixj的形式出现,如果我们定义一个低维特征空间到高维特征空间的映射 ϕ ϕ ϕ,将所有特征映射到一个更高的维度,让数据线性可分,我们就可以继续按前两篇的方法来优化目标函数,求出分离超平面和分类决策函数了。也就是说现在的SVM的优化目标函数变成:
min ⁡ ⏟ α 1 2 ∑ i = 1 , j = 1 m α i α j y i y j ϕ ( x i ) ∙ ϕ ( x j ) − ∑ i = 1 m α i   s.  t . ∑ i = 1 m α i y i = 0   0 ≤ α i ≤ C \begin{array}{c} \underbrace{\min }{\alpha} \frac{1}{2} \sum{i=1, j=1}^{m} \alpha_{i} \alpha_{j} y_{i} y_{j} \phi\left(x_{i}\right) \bullet \phi\left(x_{j}\right)-\sum_{i=1}^{m} \alpha_{i} \ \text { s. } t . \sum_{i=1}^{m} \alpha_{i} y_{i}=0 \ 0 \leq \alpha_{i} \leq C \end{array} minα21i=1,j=1mαiαjyiyjϕ(xi)ϕ(xj)i=1mαi  s. t.i=1mαiyi=0 0αiC
可以看到,和线性可分SVM的优化目标函数的区别仅仅是将内积 x i ∙ x j xi∙xj xixj替换为 ϕ ( x i ) ∙ ϕ ( x j ) ϕ(xi)∙ϕ(xj) ϕ(xi)ϕ(xj)。我们要将其映射到超级高的维度来计算特征的内积。这时候映射成的高维维度是爆炸性增长的,这个计算量实在是太大了,而且如果遇到无穷维的情况,就根本无从计算了。下面引入核函数:假设 ϕ ϕ ϕ是一个从低维的输入空间 χ χ χ(欧式空间的子集或者离散集合)到高维的希尔伯特空间的KaTeX parse error: Unexpected character: '' at position 1: ̲映射。那么如果存在函数 K ( x , z ) K(x,z) K(x,z),对于任意 x , z ∈ χ x,z∈χ x,zχ,都有:
K ( x , z ) = ϕ ( x ) ∙ ϕ ( z ) K(x, z) = \phi(x) \bullet \phi(z) K(x,z)=ϕ(x)ϕ(z)
那么我们就称 K ( x , z ) K(x,z) K(x,z)为核函数。仔细发现, K ( x , z ) K(x,z) K(x,z)的计算是在低维特征空间来计算的,它避免了在刚才我们提到了在高维维度空间计算内积的恐怖计算量。也就是说,我们可以好好享受在高维特征空间线性可分的利益,却避免了高维特征空间恐怖的内积计算量。下面介绍几种常用的核函数:(1)多项式核函数:多项式核函数(PolynomialKernel)是线性不可分SVM常用的核函数之一,表达式为:
K ( x i , x j ) = ( ⟨ x i , x j ⟩ + c ) d K\left(\mathbf{x}{i}, \mathbf{x}{j}\right)=\left(\left\langle\mathbf{x}{i}, \mathbf{x}{j}\right\rangle+c\right)^{d} K(xi,xj)=(xi,xj+c)d
C用来控制低阶项的强度,C=0,d=1代表无核函数。(2)高斯核函数:高斯核函数(GaussianKernel),在SVM中也称为径向基核函数(RadialBasisFunction,RBF),它是非线性分类SVM最主流的核函数。libsvm默认的核函数就是它。表达式为:
K ( x i , x j ) = exp ⁡ ( − ∣ x i − x j ∣ 2 2 2 σ 2 ) K\left(\mathbf{x}{i}, \mathbf{x}{j}\right)=\exp \left(-\frac{\left|\mathbf{x}{i}-\mathbf{x}{j}\right|{2}^{2}}{2 \sigma^{2}}\right) K(xi,xj)=exp(2σ2xixj22)
使用高斯核函数之前需要将特征标准化,因此这里衡量的是样本之间的相似度。(3)Sigmoid核函数:Sigmoid核函数(SigmoidKernel)也是线性不可分SVM常用的核函数之一,表达式为:
K ( x i , x j ) = tanh ⁡ ( α x i ⊤ x j + c ) K\left(\mathbf{x}{i}, \mathbf{x}{j}\right)=\tanh \left(\alpha \mathbf{x}{i}^{\top} \mathbf{x}{j}+c\right) K(xi,xj)=tanh(αxixj+c)
此时的SVM相当于没有隐藏层的简单神经网络。(4)余弦相似度核:常用于衡量两段文字的余弦相似度,表达式为:
K ( x i , x j ) = x i ⊤ x j ∣ x i ∣ ∣ x j ∣ K\left(\mathbf{x}{i}, \mathbf{x}{j}\right)=\frac{\mathbf{x}{i}^{\top} \mathbf{x}{j}}{\left|\mathbf{x}{i}\right|\left|\mathbf{x}_{j}\right|} K(xi,xj)=xixjxixj

基于SVM的人脸识别

#下载数据
from sklearn.datasets import fetch_lfw_people
faces = fetch_lfw_people(min_faces_per_person=60)
print(faces.target_names)
print(faces.images.shape)
#使用预处理来提取更有意义的特征。这里使用主成份分析来提取150个基本元素,然后将其提供给支持向量机分类器。
#将这个预处理和分类器打包成管道

from sklearn.svm import SVC
from sklearn.decomposition import PCA
from sklearn.pipeline import make_pipeline
pca = PCA(n_components=150, whiten=True, random_state=42)
svc = SVC(kernel='rbf', class_weight='balanced')
model = make_pipeline(pca, svc)

#为了测试分类器的训练效果,将数据集分解成训练集和测试集进行交叉检验
from sklearn.cross_validation import train_test_split
x_train, x_test, y_train, y_test = train_test_split(faces.data, faces.target, random_state=42)

#用网络搜索交叉检验来寻找最优参数组合。通过不断调整C(松弛变量)和参数gamma(控制径向基函数核的大小),确定最优模型
from sklearn.grid_search import GridSearchCV
param_grid = {'svc__C': [1,5,10,50], 'svc__gamma':[0.0001, 0.0005, 0.001, 0.005]}
grid = GridSearchCV(model, param_grid)

grid.fit(x_train, y_train)
print(grid.best_params_)
#有了交叉检验的模型,现在就可以对测试集的数据进行预测了
model = grid.best_estimator_
y_fit = model.predict(x_test)
#比较预测结果和真实结果
fig, ax = plt.subplots(4, 6)
for i, axi in enumerate(ax.flat):
    axi.imshow(x_test[i].reshape(62, 47), cmap='bone')
    axi.set(xticks=[], yticks=[])
    axi.set_ylabel(faces.target_names[y_fit[i]].split()[-1],
                  color='black' if y_fit[i] == y_test[i] else 'red')
fig.suptitle('Predicted Names; Incorect Lables in Red', size=14)
#打印分类效果报告,他会列举每个标签的统计结果,从而对评估器的性能有更全面的认识
from sklearn.metrics import classification_report
print(classification_report(y_test, y_fit, target_names=faces.target_names))

参考

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值