主頁 >  其他 > SVM——支持向量機,人臉識別實驗

SVM——支持向量機,人臉識別實驗

2020-09-13 13:45:10 其他

  最基本的SVM(Support Vector Machine)旨在使用一個超平面,分離線性可分的二類樣本,其中正反兩類分別在超平面的一側,SVM演算法則是要找出一個最優的超平面,

  下面從簡單到復雜介紹三種SVM形式,然后介紹一種快速優化SVM的演算法,最后用SVM實作人臉識別,

線性可分SVM

優化函式定義

  給定一個特征空間線性可分的資料集:

$T = \{(x_1,y_1),(x_2,y_2),...,(x_N,y_N)\}$

  特征分布類似下圖:

  如上圖,當特征空間為二維時,超平面就是比二維空間低一維度的直線,任意維超平面定義如下(其中$x$是$n$維特征向量,$w,b$是超平面系數):

$wx+b = 0$

  對于正例應有$wx_i+b > 0$,反例應有$wx_i+b < 0$,也就是說,如果分類正確,應有:

$y_i(wx_i+b)> 0$

  從直觀上看,最優超平面,應該在將所有樣本都正確分類的基礎上,最大化超平面與離超平面最近的樣本點的距離,點到面的距離公式中學學過

$\displaystyle \frac{|wx+b|}{|| w ||}$

  綜上,優化的問題用數學方式表達:

$\displaystyle\max\limits_{w,b}\min\limits_{i}(\frac{y_i(wx_i+b)}{||w||})$

  或者

$\begin{align*} &\max\limits_{w,b}\;\gamma \\ &\;\text{s.t.}\;\;\;y_i(\frac{w}{||w||}x_i+\frac{b}{||w||})\ge \gamma,\;\;i=1,2,...,N \end{align*}$

  其中$\gamma$為最小距離,令$ \hat{\gamma}=\gamma||w|| $,即所謂“函式距離”,上式可變為:

$\begin{align*} &\max\limits_{w,b}\;\frac{\hat{\gamma}}{||w||} \\ &\;\text{s.t.}\;\;\;y_i(wx_i+{b})\ge \hat{\gamma },\;\;i=1,2,...,N\end{align*}$

  $\hat{\gamma}$沒有被$||w||$規范化,因此大小與$||w||$有關,而$w,b$等比例變化時,超平面并不會變,因此,可以固定$||w||=1$,最大化$\hat{\gamma}$,即:

$\begin{align*} &\max\limits_{w,b}\;\hat{\gamma}\\ &\;\text{s.t.}\;\;\;y_i(wx_i+{b})\ge \hat{\gamma },\;\;i=1,2,...,N;\\ &\;\;\;\;\;\;\;\;\; ||w||=1 \end{align*}$ 

  或者固定$\hat{\gamma}=1$,最小化$||w||$,也就是:

$\begin{align*} &\min\limits_{w,b}\;\frac{1}{2}||w||^2 \\ &\;\text{s.t.}\;\;\;y_i(wx_i+{b})\ge 1,\;\;i=1,2,...,N\end{align*}$

  通常是最小化$||w||$,這是一個凸二次規劃問題,即待優化的函式$\frac{1}{2}||w||^2$是二次函式,不等式約束條件$1-y_i(wx_i+{b})\le 0$為可微凸函式(這是仿射函式,自然是凸函式),

對偶演算法

  上述帶約束優化滿足原始問題最優值與對偶問題最優值取等的條件,因此可以使用拉格朗日對偶性(點擊鏈接)將原始優化問題轉換為其對偶問題求解,原始問題的拉格朗日函式為:

$\displaystyle \begin{gather}L(w,b,\alpha) = \frac{1}{2}||w||^2- \sum\limits_{i=1}^{N}\alpha_iy_i(wx_i+b)+\sum\limits_{i=1}^{N}\alpha_i,\,\,\alpha\ge 0  \label{}\end{gather}$

  因此原始問題為:

$\displaystyle \begin{gather} \min\limits_{w,b}\max\limits_{\alpha\ge 0 }L(w,b,\alpha)  \label{}\end{gather}$

  則對偶問題為:

$\displaystyle \begin{gather}\max\limits_{\alpha\ge 0 } \min\limits_{w,b}L(w,b,\alpha)  \label{}\end{gather}$

  由KKT條件1式令梯度為0,計算對偶問題內部的$\min$函式

$\begin{aligned} &\nabla_wL(w,b,\alpha) = w-\sum\limits_{i=1}^{N}\alpha_iy_ix_i=0 \\ &\nabla_bL(w,b,\alpha) = -\sum\limits_{i=1}^{N}\alpha_iy_i=0 \\ \end{aligned}$

  得

$\begin{gather} &w = \sum\limits_{i=1}^{N}\alpha_iy_ix_i \\ &\sum\limits_{i=1}^{N}\alpha_iy_i=0 \label{}\end{gather}$

  代入$(3)$式,經過計算,對偶問題變為:

$\begin{gather} \begin{array}{lcl} \min\limits_{\alpha}\displaystyle\frac{1}{2}\sum\limits_{i=1}^{N}\sum\limits_{j=1}^{N}\alpha_i\alpha_jy_iy_j(x_ix_j)-\sum\limits_{i=1}^{N}\alpha_i \\ \begin{aligned} \text{s.t.}\;&\sum\limits_{i=1}^{N}\alpha_iy_i=0\\ &\alpha_i\ge 0,i = 1,2,...,N \end{aligned} \end{array} \end{gather}$

  這樣,只需先優化對偶問題,計算出最優的$\alpha^*$,再代入$(4)$式即可算出最優$w^*$,對于$b$,因為至少有一個$\alpha_j^*>0$(如果全都為0,由$(4)$式有$w=0$,不符合約束),對應KKT條件2式

$\alpha_i(y_i(wx_i+b)-1)=0$

  于是有

$y_j(w^*x_j+b^*)-1=0$

  實際上這個$x_j$就是與超平面最近的的樣本,也就是所謂的支持向量,另外也說明了這個優化問題的解一定在不等式約束的邊界上,而不在其內部,于是,提取$b^*$并將$(4)$式代入,得:

$\begin{gather}\displaystyle b^* = y_j-\sum\limits_{i=1}^{N}\alpha_i^*y_i(x_ix_j)\end{gather}$

  綜上,計算最優$w^*,b^*$的操作就是:先$(6)$式算出$\alpha^*$,再代入$(4),(7)$式算出$w^*,b^*$,

  但是$(6)$實際上并不好算,當樣本量一大,$\alpha$需要分類討論的情況數以指數級上升(即每個$\alpha$是否為0),后面介紹開銷小的演算法,

線性SVM

引數計算

  有時樣本會有特異點,不能保證每個樣本都滿足不等式約束,因此修改上面的“硬間隔最大化”為“軟間隔最大化”,則線性可分SVM變為線性SVM,即添加一個松弛變數$\xi$,允許原來的不等式約束不一定嚴格滿足,當然在優化函式中也要把這一損失加上,乘上懲罰引數$C$,得到如下最優化問題:

$\begin{gather} \begin{array}{lcl} \min\limits_{w,b,\xi}\;\displaystyle\frac{1}{2}||w||^2+C\sum\limits_{i=1}^{N}\xi_i \\ \begin{aligned} \text{s.t.}\;\;\;&y_i(wx_i+{b})\ge 1-\xi_i,\;\;i=1,2,...,N\\ &\xi_i\ge 0,\;\;i=1,2,...,N\\ \end{aligned} \end{array}\end{gather}$

  顯然待優化函式與不等式約束都是凸函式(仿射函式也是凸函式),因此同樣符合KKT條件,可以對偶化計算,拉格朗日函式為:

$ \begin{aligned} \displaystyle L(w,b,\xi,\alpha,\mu) =& \frac{1}{2}||w||^2+C\sum\limits_{i=1}^{N}\xi_i-\sum\limits_{i=1}^{N}\alpha_i(y_i(wx_i+b)-1+\xi_i)-\sum\limits_{i=1}^{N}\mu_i\xi_i,\\ &\text{where}\;\;\alpha_i\ge 0,\mu_i\ge 0 \end{aligned} $

  則原始問題變為:

$ \min\limits_{w,b,\xi}\max \limits_{\alpha\ge 0 ,\mu \ge 0}L(w,b,\xi,\alpha,\mu) $

  其對偶問題為:

$\begin{gather} \max \limits_{\alpha\ge 0 ,\mu \ge 0}\min\limits_{w,b,\xi}L(w,b,\xi,\alpha,\mu) \end{gather}$

  由KKT條件1式令梯度為0,計算對偶問題內部$\min$函式,得:

\begin{align} &\nabla_wL(w,b,\xi,\alpha,\mu) = w-\sum\limits_{i=1}^{N}\alpha_iy_ix_i=0 \\ &\nabla_bL(w,b,\xi,\alpha,\mu) = -\sum\limits_{i=1}^{N}\alpha_iy_i=0 \notag\\ &\nabla_{\xi_i}L(w,b,\xi,\alpha,\mu) = C-\alpha_i-\mu_i=0 \notag \end{align}

  代入$(9)$式,對偶問題變為:

\begin{gather} \begin{array}{lcl} \min\limits_{\alpha}\displaystyle\frac{1}{2}\sum\limits_{i=1}^{N}\sum\limits_{j=1}^{N}\alpha_i\alpha_jy_iy_j(x_ix_j)-\sum\limits_{i=1}^{N}\alpha_i \\ \begin{aligned} \text{s.t.}\;&\sum\limits_{i=1}^{N}\alpha_iy_i=0\\ &0\le\alpha_i\le C,\;\;i = 1,2,...,N \end{aligned} \end{array} \end{gather}

  其中$\alpha_i\le C$是由于$C-\alpha_i=\mu_i\ge0 $,類似地,接下來的操作就是:

  1、算出$(11)$式的最優$\alpha^*$,

  2、$\alpha^*$代入$(10)$式計算$w^*$,

  3、找出滿足$\alpha_j^*$滿足$0<\alpha_j^*<C$,

    此時$\mu_j^* = C-\alpha_j^*>0$,由KKT條件2式,有$\mu_j^*\xi_j^*=0$,因此$\xi_j^*=0$,

    同樣地,由KKT2式,有$\alpha_j^*(y_j(w^*x_j+b^*)-1+\xi_j^*)=0$,因$\alpha_j^*>0$,于是有:

$\displaystyle b^* = y_j-\sum\limits_{i=1}^{N}\alpha_i^*y_i(x_ix_j)$

支持向量

  在線性SVM中,因為有松弛變數$\xi$,不等式約束取等時樣本不一定在其類別的邊界上,上面只討論了使用小于$C$的$\alpha_j^*$,下面做個總結:
  1、若$\alpha_i^* = 0$ ,則$\xi_i = 0$ ,分類正確,$x_i$在分離間隔邊界的外側;

  2、若$0<\alpha_i^* < C$ ,則$\xi_i = 0$ ,分類正確,支持向量$x_i$恰好落在間隔邊界上;

  3、若$\alpha_i^* = C,0<\xi_i<1$ ,則分類正確,$x_i$在間隔邊界與分離超平面之間;

  4、若$\alpha_i^* = C,\xi_i=1$,則分類錯誤,$x_i$在分離超平面上;

  5、若$\alpha_i^* = C,\xi_i>1$,則分類錯誤,$x_i$位于分離超平面誤分一側,

  其中2~5都是支持向量,

合頁損失函式

  線性SVM還有另一種等價的優化目標函式:

$\begin{gather}\displaystyle \min\limits_{w,b}\sum\limits_{i=1}^{N}\left[1-y_i(wx_i+b)\right]_++\lambda||w||^2\end{gather}$

  其中

$[z]_+= \left\{ \begin{aligned} &z,\;\;z>0 \\ &0,\;\;z\le0 \end{aligned} \right.$

  感覺可以直接梯度下降,

等價性證明

  令$(12)$中

$\left[1-y_i(wx_i+b)\right]_+=\xi_i$

  則

  1、有$\xi_i\ge 0$(一個不等式約束成立);

  2、當$1-y_i(wx_i+b)>0$時,可得$y_i(wx_i+b)=1-\xi_i$;

  3、當$1-y_i(wx_i+b)\le0$時,$\xi_i=0$,有$y_i(wx_i+b)\ge1-\xi_i$,

    綜合2、3,不論$1-y_i(wx_i+b)$如何取值,總有$y_i(wx_i+b)\ge1-\xi_i$(另一個不等式約束成立),

  于是$(12)$可寫成:

\begin{array}{lcl} \min\limits_{w,b,\xi}\displaystyle\sum\limits_{i=1}^{N}\xi_i+\lambda||w||^2\\ \begin{aligned} \text{s.t.}\;\;\;&y_i(wx_i+{b})\ge 1-\xi_i,\;\;i=1,2,...,N\\ &\xi_i\ge 0,\;\;i=1,2,...,N\\ \end{aligned} \end{array}

  然后優化項常系數權重改一下就和$(8)$一模一樣了,

非線性SVM

  對于特征分布是非線性的樣本,需要將非線性可分特征映射到另一個空間(維度不變或變高都可),變成線性可分特征,然后才能用線性SVM來優化引數,如圖下左圖到右圖:

  理論上需要定義確定的映射函式將輸入映射成線性可分的特征,實際上這一中間環節可以隱去,下面說明這一方法,

核技巧

  定義從輸入空間到特征空間的映射$\phi(x):\mathcal{X}\to \mathcal{H}$,觀察線性可分SVM的對偶問題和最終的判別函式,里面關于樣本特征之間的運算都是內積,因此映射后的線性可分的樣本特征要做的同樣是內積,定義這一內積為:

$K(x,z)=<\phi(x),\phi(z)>$,后面內積直接用$\phi(x)\phi(z)$表示

  樣本的維度比較小還好,比如上圖的二維,可以直接想出一個映射,但是當維度很高時就很難想了,因此想到,可以跳過定義映射,直接定義這個$K(x,z)$,稱之為核函式,那么什么樣的核函式一定可以表示成兩個映射后的向量的內積呢?這樣的核函式叫做正定核,

正定核的充要條件

  設$K:\mathcal{X}\times\mathcal{X}\to R$為對稱函式,則$K(x ,z) $為正定核函式的充要條件是:

  對任意$x_i \in \mathcal{X}, i=1, 2,..., n, K(x, z) $對應的Gram 矩陣

$ \left[ \begin{matrix} K(x_1,x_1)&\cdots&K(x_1,x_n)\\ \vdots&&\vdots\\ K(x_n,x_1)&\cdots&K(x_n,x_n)\\ \end{matrix} \right]\succeq 0$

  $\succeq 0$表示半正定,具體證明請看《統計學習方法》P136~139

常用正定核

  線性核(即直接內積):

$K(x,z)=xz$

  多項式核:

$K(x,z)=(xz+1)^p$

  高斯核:

$\displaystyle K(x,z)=\exp(-\frac{||x-z||^2}{2\sigma^2})$

  使用核函式后,待優化的對偶問題變為:

$ \begin{array}{lcl} \min\limits_{\alpha}\displaystyle\frac{1}{2}\sum\limits_{i=1}^{N}\sum\limits_{j=1}^{N}\alpha_i\alpha_jy_iy_jK(x_i,x_j)-\sum\limits_{i=1}^{N}\alpha_i \\ \begin{aligned} \text{s.t.}\;&\sum\limits_{i=1}^{N}\alpha_iy_i=0\\ &0\le\alpha_i\le C,\;\;i = 1,2,...,N \end{aligned} \end{array} $

  分類決策函式變為:

$\displaystyle f(x) = \text{sign}\left(\sum\limits_{i=1}^{N}\alpha^*_iy_iK(x_i,x)+b^*\right)=\text{sign}\left(\sum\limits_{i\in S}\alpha^*_iy_iK(x_i,x)+b^*\right)$

  即原來的直接內積$x_ix$變成了先映射再內積的$K(x_i,x)$,其中$S$為支持向量集合($\alpha$不為0的樣本集合,即2.2支持向量中的2~5),

  然而,選擇合適的正定核以使輸入映射成線性可分還需要作其它的努力,,,,,,,,,,

SMO演算法

  正如前面所說,在對偶問題中,$\alpha$需要分類討論的情況數隨著樣本量的增大以指數級上升(即每個$\alpha$是否為0),SMO(sequential minimal optimization)演算法可以加快對偶問題的優化,它采用迭代的方式,每次將待優化問題分離出一個小問題求解,最終求解原問題,

具體流程

初始化

  初始化所有的$\alpha_i$為常數(通常為0),此時這些$\alpha_i$滿足對偶問題的兩個不等式約束:

$\begin{gather}&\sum\limits_{i=1}^{N}\alpha_iy_i=0\\ &0\le\alpha_i\le C,\;\;i = 1,2,...,N\\ \label{}\end{gather}$

  實際上就是滿足KKT條件的1和4,因為$(13)$是條件1使梯度為0得出的,$(14)$是條件1和4共同得到的,但是,它們并不一定同時滿足KKT條件的2和3(因為原問題沒有等式約束,所以沒有條件5):

$\begin{gather}\displaystyle\alpha_i(1-\xi_i-y_i(\sum\limits_{j=1}^N\alpha_jy_jK_{ji}+b))=0\label{}\end{gather}$

$\begin{gather}\displaystyle1-\xi_i-y_i(\sum\limits_{j=1}^N\alpha_jy_jK_{ji}+b)\le0\label{}\end{gather}$

  也就是:

$\begin{gather}y_i(\sum\limits_{j=1}^N\alpha_jy_jK_{ji}+b)\left\{\begin{aligned}&\ge1,\;\;\alpha_i=0\\&=1,\;\;0<\alpha_i<C\\&\le1,\;\;\alpha_i=C\\\end{aligned}\right.\label{}\end{gather}$

  如果條件2和3也都滿足的話,就迭代結束,也就達到最終的解了,其中每次迭代都會保持$(13),(14)$兩個約束成立,

迭代優化

  每次迭代,選出最“不好”的兩個$\alpha$來進行優化,固定剩下的$N-2$個$\alpha$(這樣的操作有點像小批量梯度下降),如何才算“不好”的$\alpha$放后面講,因為選擇$\alpha$基于優化的效率,為了說明效率所在,所以先說優化,

  不失一般性,假設選擇的兩個變數是$\alpha_1,\alpha_2$,則這個子問題可以寫為(最小化中將與$\alpha_1,\alpha_2$無關的項去了):

$\begin{array}{lcl} \begin{aligned} \min\limits_{\alpha_i,\alpha_2}W(\alpha_1,\alpha_2) = &\frac{1}{2}K_{11}\alpha_1^2+\frac{1}{2}K_{22}\alpha_2^2+y_1y_2K_{12}\alpha_1\alpha_2-\\ &(\alpha_1+\alpha_2)+y_1\alpha_1\sum\limits_{i=3}^Ny_i\alpha_iK_{i1}+y_2\alpha_2\sum\limits_{i=3}^Ny_i\alpha_iK_{i2} \\ \end{aligned}\\ \begin{aligned} \text{s.t.}\;\;&\alpha_1y_1+\alpha_2y_2 = -\sum\limits_{i=3}^Ny_i\alpha_i = \varsigma\\ &0\le\alpha_i\le C,\;\;\;i=1,2 \end{aligned} \end{array}$

  由$(13)$式,$\alpha_1$又可以被$\alpha_2$表達,于是這個子優化就變為一個帶約束的一元二次函式最值問題,初中生的題目,主要操作就是先用導數求出二次函式的駐點,如果在約束內就為最終解,在約束外就選約束中與之較近的端點為解,盡管這么簡單,但是為了后面的選擇,還是要推導一下,約束可以在二維坐標系中表示出來:

  因為$y_1,y_2$絕對值為1,所以只要關于它們的符號進行分類,分成兩種情況,$y_1\ne y_2$和$y_1=y_2$,于是可取的點分別如上圖a、b中斜線所示,設$\alpha_2$取值為$[L,H]$,則當$y_1\ne y_2$時

$L=\max(0,\alpha_2-\alpha_1),H=\min(C,C+\alpha_2-\alpha_1)$

  你可能會有為什么不用$\varsigma$而用$\alpha_2-\alpha_1$來算的疑問,這是因為每次迭代都保持$(13)$的成立,因此直接用$\alpha_2-\alpha_1$方便,而$\varsigma$需要算$N-2$個求和,又因為計算時利用了$(13),(14)$,所以這樣算出來的$\alpha_1,\alpha_2$依然能維持$(13),(14)$的成立,當$y_1=y_2$時

$L=\max(0,\alpha_2+\alpha_1-C),H=\min(C,\alpha_2+\alpha_1)$

  然后就是簡單的先替換$\alpha_1$,再求導等于0,整理后得到:

$(K_{11}+K_{22}-2K_{12})\alpha_2^*=(K_{11}+K_{22}-2K_{12})\alpha_2+y_2(E_1-E_2)$

  其中

\begin{gather} \displaystyle E_i=\left(\sum\limits_{j=1}^N\alpha_iy_iK(x_j,x_i)+b\right)-y_i \label{} \end{gather}

  $E_i$理解為預測函式對$x_i$的預測值與其真實標簽$y_i$之差,再定義

$ \eta = K_{11}+K_{22}-2K_{12}$

  $\eta$理解為$x_1,x_2$映射到特征空間中的向量之間的距離(距離二范的平方),于是

$\begin{gather}\displaystyle\alpha_2^*=\alpha_2+\frac{y_2(E_1-E_2)}{\eta}\label{}\end{gather}$

   然后更新$\alpha_2,\alpha_1$:

$ \alpha_2^{update}= \left\{ \begin{aligned} &H,&\alpha_2^*>H\\ &\alpha_2^*,&L\le\alpha_2^*\le H\\ &L,&\alpha_2^*<L\\ \end{aligned} \right. $

$\alpha_1^{update} = (\varsigma - \alpha_2^{update}y_2)y_1 = \alpha_1+y_1y_2(\alpha_2-\alpha_2^{update})$

  最后還有$(18)$的$b$的計算,《統計學習方法》對$b$的計算感覺沒有說清楚,

  在我理解,這個$b$的更新就是用更新后的$\alpha_1$或$\alpha_2$,看哪個在$(0,C)$區間,就用KKT條件2式即$(15)$直接計算$b$;如果兩個$\alpha$都是0或$C$,則取依然用$(15)$計算兩個$b$,取這兩個$b$的平均值,

  我的疑問是:首先,更新完$\alpha_1,\alpha_2$后,$\alpha_1,\alpha_2$是否保證滿足$(15),(16)$式呢,也就是沒說明能不能用$(15)$來算$b$?其次,假設它們更新完后滿足$(15),(16)$式,但是如果$\alpha_1,\alpha_2$都不在$(0,C)$區間為什么還能用$(15)$來算$b$呢?最后,書中只說了更新$b$,剛開始的$b$初始化為多少呢?還請懂的大佬不吝賜教,

變數的選擇

  變數的選擇就是先遍歷所有的$\alpha_i$,查看哪個$\alpha_i$違反$(17)$最嚴重,作為待更新的$\alpha_1$;然后再選擇使$(19)$中的$|E_1-E_2|$最大的$\alpha_2$,以使$\alpha_2$變化最大,

人臉識別實驗

  接下來使用PCA(點擊鏈接)與SVM實作人臉識別,大致流程如下:

  0、對人臉資料集預處理,

  1、將所有訓練集人臉存在矩陣中,每行一張人臉照片,

  2、使用PCA對矩陣行降維,提取特征(用于降維、提取特征的矩陣就是所謂“特征臉”),

  3、選擇SVM的核函式為高斯核,再選擇一組超引數(軟間隔權重C、高斯核的方差)來交叉驗證,

  4、用降維后的人臉矩陣交叉驗證得到最優超引數,

  5、用降維人臉矩陣訓練使用最優超引數的SVM,得到訓練完成的SVM,

  6、把以相同方式存在矩陣中的測驗集人臉,先用前面獲得的特征臉降維,再用訓練好的SVM測驗,統計資料,

  用于訓練與測驗的人臉集如下圖:

   資料預處理代碼:

import matplotlib.pyplot as plt 
import numpy as np
import pylab 
import os 

img = plt.imread("face.jpg")#人臉圖片
fig = plt.figure()
ax = fig.add_subplot(111) 
print(img)   
def split_img(img):
    a = np.zeros([400,56,46,3])     ##57*47
    for i in range(20): 
        for j in range(20):  
            a[i*20+j] = img[i*57:(i+1)*57-1,j*47:(j+1)*47-1]
    return a
def output_img(imgs):
    for i in range(len(imgs)): 
        if not os.path.exists("faces/"+str(int(i/10))):
            os.mkdir("faces/"+str(int(i/10)))
        plt.imsave("faces/"+str(int(i/10))+"/"+str(i%10)+".jpg",imgs[i]) 
b = split_img(img)  
b = b/255
output_img(b)
ax.imshow(b[0])
ax.axis("off")
pylab.show()

  資料獲取(與訓練測驗代碼存在同目錄即可,不用執行):

import matplotlib.pylab as plt
import numpy as np

def get_train_data():  
    faces_train = np.zeros([40,6,56,46,3]) #56*46
    train_name = np.zeros([40,6]).astype(int)
    
    faces_test = np.zeros([40,4,56,46,3]) #56*46
    test_name = np.zeros([40,4]).astype(int)
    for i in range(40):
        for j in range(6):
            faces_train[i,j] = plt.imread("faces/"+str(i)+"/"+str(j)+".jpg")
            train_name[i,j] = i
    for i in range(40):
        j = 6
        while j<10: 
            faces_test[i,j-6] = plt.imread("faces/"+str(i)+"/"+str(j)+".jpg")
            test_name[i,j-6]=i
            j+=1 
    faces_train = faces_train[:,:,:,:,0].reshape([240,56,46])/255 
    faces_test = faces_test[:,:,:,:,0].reshape([160,56,46])/255  
    train_name = train_name.reshape([240])
    test_name = test_name.reshape([160])

    train_data = {"data":faces_train,"name":train_name} 
    test_data = {"data":faces_test,"name":test_name} 
    print("資料初始化成功!")
    return train_data,test_data

  模型訓練與測驗:

#%% 訓練模型獲取資料
from get_data import *
import matplotlib.pylab as plt
import numpy as np
import pylab 
from sklearn.decomposition import PCA 
from sklearn.svm import SVC
from sklearn.pipeline import make_pipeline
import seaborn as sns
plt.rcParams['font.sans-serif']=['SimHei'] #用來正常顯示中文標簽 
plt.rcParams['axes.unicode_minus']=False #用來正常顯示負號

train_data,test_data = get_train_data()  #獲取資料影像56*46,訓練集240,測驗集160

#%%訓練模型
#模型選擇,加入管道
pca = PCA(n_components = 50,whiten=True) 
svc = SVC(kernel='rbf',class_weight="balanced")     
model = make_pipeline(pca,svc)       

#以下交叉驗證選擇最優超引數
print("正在交叉驗證尋找最優超引數,,,")
from sklearn.model_selection import GridSearchCV
param_grid = {"svc__C":[50,60,70,80],"svc__gamma":[0.0001,0.0005,0.001,0.005]}#定義軟間隔權重、高斯核方差
grid = GridSearchCV(model,param_grid,cv = 6)#交叉驗證6折,因為每個人的臉有6張,所以也是留一法
grid.fit(train_data["data"].reshape(240,56*46),train_data["name"])#用訓練集交叉驗證,選擇最優超引數
print("最優引數已找到:")
print(grid.best_params_)
print("用最優超引數訓練模型,,,")
model = grid.best_estimator_ #用最優超引數訓練模型
model.fit(train_data["data"].reshape(240,56*46),train_data["name"])
#%%測驗模型
print("訓練完畢,開始測驗,,,")
yfit = model.predict(test_data["data"].reshape([160,56*46]))
print("測驗完畢,資料統計:")
from sklearn.metrics import classification_report
print(classification_report(test_data["name"],yfit))
print("繪制預測結果圖,,,,") 
fig = plt.figure(figsize=(100,100))
for i in range(10):
    for j in range(16):
        ax = fig.add_subplot(10,16,i*16+j+1)
        ax.imshow(test_data["data"][i*16+j],cmap="bone") 
        ax.set(xticks =[],yticks = [])
        ax.set_ylabel(yfit[i*16+j],size = 10)
pylab.show() 

print("繪制混淆矩陣,,,,") 
from sklearn.metrics import confusion_matrix
mat = confusion_matrix(test_data["name"],yfit)
sns.heatmap(mat.T,square= True,annot=True,fmt="d",cbar=False)
plt.xlabel("真實標簽")
plt.ylabel("預測標簽")
pylab.show() 

 

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/24861.html

標籤:其他

上一篇:分析指令STA、LDX、XCH、INP六個節拍各完成什么動作?

下一篇:gps網路時間服務器(網路對時設備)京準來解讀

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more