假如現在有 \(\ell\) 個同一分布的觀察數據,每條數據都有 \(p\) 個特征。如果現在加入一個或多個觀察數據,那么是否這些數據與原有的數據十分不同,甚至我們可以懷疑其是否屬於同一分布呢?反過來講,是否這些數據與原有的數據十分相似,我們無法將其區分呢?這便是異常檢測工具和方法需要解決的問題。即現在只有正常的數據,那么當異常數據加入時,我們是否可以將其分辨出來呢?
通常情況下,要學習訓練出一個在 \(p\) 維空間上的粗糙封閉的邊界線,來分割出初始觀測分布的輪廓線。然后,如果觀測數據位於邊界限定的子空間內,則認為它們來自與初始觀測相同的總體。否則,如果他們在邊界之外,我們可以在一定程度上說他們是異常的。
OCSVM
一種實現方法是 One-Class SVM (OCSVM),首次是在論文《Support Vector Method for Novelty Detection》中由 Bernhard Schölkopf 等人在 2000 年提出, 其與 SVM 的原理類似,更像是將零點作為負樣本點,其他數據作為正樣本點,來訓練支持向量機。策略是將數據映射到與內核相對應的特征空間,在數據與原點間構建超平面,該超平面與原點呈最大距離。
現在假設該超平面為:
\[w \cdot \Phi ( \mathbf { x } ) - \rho = 0 \]
目標就是在分類正確的基礎上最大化超平面與原點的距離:
\[\begin{array} { c c } \mathop{ \max} \limits_ { w \in F , \rho \in \mathbb { R } } & { |\rho| } / { \| w \| ^ { 2 }} \\ \text { subject to } & \left( w \cdot \Phi \left( \mathbf { x } _ { i } \right) \right) \geq \rho \end{array} \]
同時根據超平面的定義,實際上 \(\rho\) 的正負和 \(w\) 向量中的元素正負同時調整就不會影響超平面,那么假如 \(\rho > 0\) ,那么優化問題可以重寫為:
\[\mathop{ \max} \limits_ { w \in F , \rho \in \mathbb { R } } { \rho} / { \| w \| ^ { 2 }} \]
為了防止參數求解的耦合問題,可以將其拆解為
\[\begin{aligned} \mathop{ \max} \limits_ { w \in F , \rho \in \mathbb { R } } { \rho} + 1/{ \| w \| ^ { 2 }} \\ \mathop{ \min} \limits_ { w \in F , \rho \in \mathbb { R } } - { \rho} + { \| w \| ^ { 2 }} \end{aligned} \]
這樣的話在求解問題時,由於 \(w\) 向量中元素的整體正負不會影響 \({ \| w \| ^ { 2 }}\) 的取值,那么其會保證 \(\rho\) 的最終取值為正值,也就是滿足假設。同時為了方便梯度求解,將 \({ \| w \| ^ { 2 }}\) 添加一個 \(\frac{1}{2}\) 那么最終的優化目標可以寫為:
\[\begin{array} { c c } \mathop{ \min} \limits_ { w \in F , \rho \in \mathbb { R } } & - { \rho} + \frac{1}{2}{ \| w \| ^ { 2 }} \\ \text { subject to } & \left( w \cdot \Phi \left( \mathbf { x } _ { i } \right) \right) \geq \rho \end{array} \]
從另一方面想,實際上對於一個斜率一定的直線,當其偏移量的絕對值越大時,其離零點越來越近,下面以 \(w * x - b = 0\) 為例,當 w 確定時,\(|b|\) 越大,直線離原點越遠:

加入松弛變量 \(\xi\) 后,其優化的目標函數可以寫為:
\[\begin{array} { c c } \mathop{ \min} \limits_ { w \in F , \boldsymbol { \xi } \in \mathbb { R } ^ { \ell } , \rho \in \mathbb { R } } & \frac { 1 } { 2 } \| w \| ^ { 2 } + \frac { 1 } { \nu \ell } \sum _ { i } \xi _ { i } - \rho \\ \text { subject to } & \left( w \cdot \Phi \left( \mathbf { x } _ { i } \right) \right) \geq \rho - \xi _ { i } , \quad \xi _ { i } \geq 0 \end{array} \]
其中 \(v \in (0,1)\) 用於調節松弛程度,根據該目標函數進行優化求解得到 \(w\) 和 \(\rho\) 后,對多部分樣本來說,其決策函數 \(f ( \mathbf { x } ) = \operatorname { sgn } ( ( w \cdot \Phi ( \mathbf { x } ) ) - \rho )\) 輸出為正。
為了求解對偶問題使用核技巧,這里使用 Lagrange 乘數 \(\alpha_i,\beta_i\),可以寫出拉格朗日方程:
\[\begin{aligned} L ( w , \boldsymbol { \xi } , \rho , \boldsymbol { \alpha } , \boldsymbol { \beta } ) = & \frac { 1 } { 2 } \| w \| ^ { 2 } + \frac { 1 } { v \ell } \sum _ { i } \xi _ { i } - \rho \\ & - \sum _ { i } \alpha _ { i } \left( \left( w \cdot \Phi \left( \mathbf { x } _ { i } \right) \right) - \rho + \xi _ { i } \right) - \sum _ { i } \boldsymbol { \beta } _ { i } \xi _ { i } \end{aligned} \]
那么根據對參數 \(w , { \xi } , \rho\) 求偏導,可以寫出部分 KKT條件:
\[\begin{aligned} w & = \sum _ { i } \alpha _ { i } \Phi \left( \mathbf { x } _ { i } \right) \\ \alpha _ { i } & = \frac { 1 } { v \ell } - \boldsymbol { \beta } _ { i } \leq \frac { 1 } { v \ell } , \quad \sum _ { i } \alpha _ { i } = 1 \end{aligned} \]
那么通過導出對偶問題和使用核技巧,便可以實現通過支持向量 \(\left\{ \mathbf { x } _ { i } : i \in [ \ell ] , \alpha _ { i } > 0 \right\}\) 求得決策函數:
\[f ( \mathbf { x } ) = \operatorname { sgn } \left( \sum _ { i } \alpha _ { i } k \left( \mathbf { x } _ { i } , \mathbf { x } \right) - \rho \right) \]
現在也可以寫出對偶問題了:
\[\min _ { \boldsymbol { \alpha } } \frac { 1 } { 2 } \sum _ { i j } \alpha _ { i } \alpha _ { j } k \left( \mathbf { x } _ { i } , \mathbf { x } _ { j } \right) \text { subject to } 0 \leq \alpha _ { i } \leq \frac { 1 } { \nu \ell } , \sum _ { i } \alpha _ { i } = 1 \]
之后使用二次規划求解器求解 \(\alpha\) 即可,然后再根據 KKT 條件求出 \(w,\rho\),那么問題來了,數據跨越了零點怎么辦? 做法很簡單,使用映射函數將數據映射到一個空間,在該空間上數據不橫跨原點,比如使用高斯核(\(\Phi(x)=\exp \left(-x^{2}\right) \cdot\left(1, \sqrt{\frac{2}{1 !}} x, \sqrt{\frac{2^{2}}{2 !}} x^{2}, \ldots\right)\))或二階多項式核(\(\Phi_{2}(\mathbf{x})=\left(1, x_{1}, x_{2}, \ldots, x_{d}, x_{1}^{2}, x_{1} x_{2}, \ldots, x_{1} x_{d}, x_{2} x_{1}, x_{2}^{2}, \ldots, x_{2} x_{d}, \ldots, x_{d}^{2}\right)\)),可以看出其中有很多的恆非負數項,也就是在一個軸的一邊,不會橫跨原點。但是這都是博主的猜測,如果有讀者看到論文的講解部分可以留言糾正(英語水平有限🤷♂️)。
SVDD
另一種方法則是 SVDD,是在其同名論文《Support Vector Data Description》中由 DAVID M.J. TAX 等人提出。相比於 OCSVM,SVDD 定義了一個模型,該模型給出了一個包圍全部數據的封閉邊界:超球體。球體的特征是中心 \(a\) 和半徑 \(R>0\)。我們通過最小化 \(R^2\) 來最小化球體的體積,並要求球體包含所有訓練樣本 \(x_i\)。這與Schólkopf、Burges和Vapnik(1995)中用於估計分類器的VC維數的方法(由包圍數據的最小球體的直徑限定)相同。並且文章中證明了該方法與 OCSVM 求解的超平面相似。其最優化目標如下:
\[\begin{aligned} \mathop{\min} \limits_ { R , a } & R ^ { 2 } + C \sum _ { i } \xi _ { i } \\ s . t . & \left\| \mathbf { x } _ { i } - \mathbf { a } \right\| ^ { 2 } \leq R ^ { 2 } + \xi _ { i } , \quad \xi _ { i } \geq 0 \quad \forall i \end{aligned} \]
其中 \(C\) 用於控制誤差的容忍度。同時為了求解對偶問題使用核技巧,這里使用 Lagrange 乘數 \(\alpha_i > 0,\gamma_i > 0\),可以寫出拉格朗日方程:
\[\begin{aligned} L \left( R , \mathbf { a } , \alpha _ { i } , \gamma _ { i } , \xi _ { i } \right) = & R ^ { 2 } + C \sum _ { i } \xi _ { i } \\ & - \sum_i \alpha _ { i } \left\{ R ^ { 2 } + \xi _ { i } - \left( \left\| \mathbf { x } _ { i } \right\| ^ { 2 } - 2 \mathbf { a } \cdot \mathbf { x } _ { i } + \| \mathbf { a } \| ^ { 2 } \right) \right\} - \sum \gamma _ { i } \xi _ { i } \end{aligned} \]
求偏導為零,可以得出:
\[\begin{aligned} \frac { \partial L } { \partial R } = 0 : & \qquad \sum _ { i } \alpha _ { i } = 1 \\ \frac { \partial L } { \partial \mathbf { a } } = 0 : & \qquad \mathbf { a } = \frac { \sum _ { i } \alpha _ { i } \mathbf { x } _ { i } } { \sum _ { i } \alpha _ { i } } = \sum _ { i } \alpha _ { i } \mathbf { x } _ { i } \\ \frac { \partial L } { \partial \xi _ { i } } = 0 : & \qquad C - \alpha _ { i } - \gamma _ { i } = 0 \end{aligned} \]
通過上述第三個式子可以得出:
\[0 \leq \alpha _ { i } \leq C \]
拉格朗日方程可以重寫為:
\[L = \sum _ { i } \alpha _ { i } \left( \mathbf { x } _ { i } \cdot \mathbf { x } _ { i } \right) - \sum _ { i , j } \alpha _ { i } \alpha _ { j } \left( \mathbf { x } _ { i } \cdot \mathbf { x } _ { j } \right) \]
那么該優化目標可以重寫為:
\[\max _ { \boldsymbol { \alpha } } \sum _ { i } \alpha _ { i } \left( \mathbf { x } _ { i } \cdot \mathbf { x } _ { i } \right) - \sum _ { i , j } \alpha _ { i } \alpha _ { j } \left( \mathbf { x } _ { i } \cdot \mathbf { x } _ { j } \right) \text { subject to } 0 \leq \alpha _ { i } \leq C \]
之后使用二次規划求解器求解 \(\alpha\) 即可,然后再根據 KKT 條件求出 \(R,a,\xi\) 即可。
參考論文有:《Support Vector Data Description》,《Support Vector Method for Novelty Detection》,《Estimating the Support of a High-Dimensional Distribution》