話接上文(SVM的簡單推導),這篇文章咱們來看單類SVM:SVDD。可能你們會以爲很奇怪,咱們爲何須要單分類呢?有篇博客舉了一個頗有意思的例子。html
花果山上的老猴子,一輩子閱猴無數,可是歷來沒有見過其它的物種。有一天,豬八戒來到花果山找它們的大王,老猴子一聲令下,把這個東西給我綁起來!這裏老猴子很清楚的知道這個外來物種不是同類,可是它到底是什麼,不得而知。老猴子見過不少猴,它知道猴子的特徵,而外來生物明顯不符合這個特徵,因此它就不是猴子。python
這就是一個單分類的簡單例子。dom
而美猴王看到這個場景後,哈哈一笑,把這呆子擡過來!函數
對比二分類,顯著的區別就是,二分類不但能得出來這個東西不是猴子,他還能告訴你這個東西叫「呆子」(固然咱們的美猴王見多識廣,確定不止是二分類那麼簡單了)性能
今天要介紹的SVDD的全稱是Support vector domain description。首先讓咱們簡單瞭解一下domain description,也就是單分類問題。ui
不像常見的分類問題,單分類問題的目的並不時將不一樣類別的數據區分開來,而是對某個類別的數據生成一個描述(description)。這裏的description比較抽象,能夠理解爲是樣本空間中的一個區域,當某個樣本落在這個區域外,咱們就認爲該樣本不屬於這個類別。spa
單分類方法經常使用於異常檢測,或者類別極度不平衡的分類任務中。code
當咱們假設數據服從一個機率分佈,咱們就能夠對這個分佈中的參數進行估計了。對於一個新樣本,若是這個樣本在給定類別的機率分佈中的機率小於閾值,就會被斷定爲異常樣本。htm
可是這樣的方法存在的問題是,blog
另外一種思路就是,在樣本空間中爲此類數據劃定一個大體的邊界。如何劃定這個邊界,就是SVDD要研究的問題啦。
假設咱們有$m$個樣本點,分別爲$x^{(1)},x^{(2)},\cdots,x^{(m)}$。
咱們假設這些樣本點分佈在一個球心爲$a$,半徑爲$R$的球中。那麼樣本$x^{(i)}$知足
$$ (x^{(i)}-a)^T(x^{(i)}-a)\leq R^2. $$
引入鬆弛變量,咱們容許部分樣本再也不這個球中,那麼
$$ (x^{(i)}-a)^T(x^{(i)}-a)\leq R^2+\xi_i,\xi\geq 0. $$
咱們的目標是最小球的半徑$R$和鬆弛變量的值,因而目標函數是
$$ \begin{align} \min_{a,\xi_i}\ \ & R^2+C\sum_{i=1}^m\xi_i\\ {\rm s.t.}\ \ & (x^{(i)}-a)^T(x^{(i)}-a)\leq R^2+\xi_i, \\ &\xi_i\geq 0,i=1,2,\cdots,m. \end{align} $$
其中,$C>0$是懲罰參數,由人工設置。
使用拉格朗日乘子法,獲得拉格朗日函數
$$ \begin{align} L(R,a,\alpha,\xi,\gamma)=& R^2+C\sum_{i=1}^m\xi_i\\ & -\sum_{i=1}^m\alpha_i\left(R^2+\xi_i({x^{(i)}}^Tx^{(i)}-2a^Tx^{(i)}+a^2)\right)-\sum_{i=1}^m \gamma_i\xi_i. \end{align} $$
其中,$\alpha_i\ge 0,\gamma_i\ge 0$是拉格朗日乘子。令拉格朗日函數對$R,a,\xi_i$的偏導爲0,獲得
$$ \begin{align} &\sum_{i=1}^m \alpha_i=1,\\ &a=\sum_{i=1}^m \alpha_ix^{(i)},\\ &C-\alpha_i-\gamma_i=0 \end{align} $$
咱們能夠將$\alpha_i$看做樣本$x^{(i)}$的權重。上式代表全部樣本的權重之和爲1,而球心$a$是全部樣本的加權和。將上式帶入到拉格朗日函數中,獲得原問題的對偶問題
$$ \begin{align} \max_\alpha\ \ &L(\alpha)=\sum_{i=1}^m\alpha_i{x^{(i)}}^Tx^{(i)}-\sum_{i=1}^m\sum_{j=1}^m \alpha_i\alpha_j{x^{(i)}}^Tx^{(j)}\\ {\rm s.t.}\ \ & 0\le\alpha_i\le C,\\ & \sum_{i=1}^m\alpha_i=1,i=1,2,\cdots,m. \end{align} $$
當經過求解對偶問題獲得$\alpha_i$後,能夠經過$a=\sum_{i=1}^m \alpha_ix^{(i)}$計算球心$a$。至於半徑$R$,則能夠經過計算球與支持向量($\alpha_i< C$)之間的距離獲得。當$\alpha_i=C$時,意味着樣本$x^{(i)}$位於球的外面。
對於一個新的樣本點$z$,若是它知足下式,那麼咱們認爲它是一個異常點。
$$ (z-a)^T(z-a)> R^2. $$
展開上式,得
$$ z^Tz-2\sum_{i=1}^m \alpha_iz^Tx^{(i)}+\sum_{i=1}^m\sum_{j=1}^m\alpha_i\alpha_j{x^{(i)}}^Tx^{(j)}>R^2. $$
正常狀況下,數據並不會呈現球狀分佈,所以有必要使用核函數的方法提升模型的表達能力。
只需將$\cal K(x^{(i)},x^{(j)})$替換${x^{(i)}}^Tx^{(j)}$便可。因而對偶問題的目標函數變爲
$$ L(\alpha)=\sum_i \alpha_i\cal K(x^{(i)},x^{(i)})-\sum_i\sum_j \alpha_i\alpha_j\cal K(x^{(i)},x^{(j)}). $$
判別函數變爲
$$ {\cal K}(z,z)-2\sum_i \alpha_i {\cal K}(z,x^{(i)})+\sum_i\sum_j \alpha_i\alpha_j {\cal K}(x^{(i)},x^{(j)})- R^2. $$
下面考慮核函數的影響。
多項式核
多項式核函數的表達式以下
$$ {\cal K}\left({x^{(i)}}^Tx^{(j)}\right)=\left({x^{(i)}}^Tx^{(j)}+1\right)^d. $$
以下圖所示,多項式覈實際上不太適合SVDD。特別是當d取值很是大的時候。
高斯核
高斯核函數的表達式以下
$$ {\cal K}\left({x^{(i)}}^Tx^{(j)}\right)=\exp\left(\frac{-\left(x^{(i)}-x^{(j)}\right)^2}{s^2}\right). $$
以下圖,相比於多項式核函數,高斯核函數的結果就合理多了。能夠看到模型的複雜程度隨着$s$的增大而減少。
可經過下面的代碼在python中使用單類SVM
from sklearn.svm import OneClassSVM