背景 支持向量数据描述(Support Vector Data Description,SVDD)是一种单值分类算法,能够实现目标样本和非目标样本的区分,通常应用于异常检测、入侵检测等领域。
SVDD 算法的具体描述可以参考文献:
1 2 3 4 5 6 7 8 9 10 @article{tax2004support, title={Support vector data description}, author={Tax, David MJ and Duin, Robert PW}, journal={Machine learning}, volume={54}, number={1}, pages={45--66}, year={2004}, publisher={Springer} }
Python 实现参考: https://github.com/iqiukp/SVDD .
SVDD 原理 假设有一组正类训练数据x ∈ R n × d x\in R^{n\times d} x ∈ R n × d ,其中n n n 是样本个数,d d d 是特征维度。首先通过非线性变换函数Φ : x → F \Phi: x\rightarrow F Φ : x → F 将数据从原始空间映射到特征空间,然后在特征空间中寻找一个体积最小的超球体。为了构造这样一个最小体积超球体,SVDD要解决以下优化问题:
min a , R , ξ R 2 + C ∑ i = 1 n ξ i s.t. ∥ Φ ( x i ) − a ∥ 2 ≤ R 2 + ξ i , ξ i ≥ 0 , ∀ i = 1 , 2 , ⋯ , n \min _{\mathbf{a}, R, \xi} R^{2}+C \sum_{i=1}^{n} \xi_{i} \\ \text { s.t. } \quad\left\|\Phi\left(\mathbf{x}_{i}\right)-\mathbf{a}\right\|^{2} \leq R^{2}+\xi_{i}, \xi_{i} \geq 0, \forall i=1,2, \cdots, n a , R , ξ min R 2 + C i = 1 ∑ n ξ i s.t. ∥ Φ ( x i ) − a ∥ 2 ≤ R 2 + ξ i , ξ i ≥ 0 , ∀ i = 1 , 2 , ⋯ , n
式中,R R R 是超球体半径,a \mathbf{a} a 是超球体的球心,ξ i \xi_{i} ξ i 是松弛因子,C C C 是一个权衡超球体体积和误分率的惩罚参数。
结合拉格朗日乘子法,原问题的对偶问题为:
min α i ∑ i = 1 n ∑ j = 1 n α i α j K ( x i , x j ) − ∑ i = 1 n α i K ( x i , x i ) s.t. 0 ≤ α i ≤ C , ∑ i = 1 n α i = 1 \min _{\alpha_{i}} \sum_{i=1}^{n} \sum_{j=1}^{n} \alpha_{i} \alpha_{j} K\left(\mathbf{x}_{i}, \mathbf{x}_{j}\right)-\sum_{i=1}^{n} \alpha_{i} K\left(\mathbf{x}_{i}, \mathbf{x}_{i}\right) \\ \text { s.t. } \quad 0 \leq \alpha_{i} \leq C, \quad \sum_{i=1}^{n} \alpha_{i}=1 α i min i = 1 ∑ n j = 1 ∑ n α i α j K ( x i , x j ) − i = 1 ∑ n α i K ( x i , x i ) s.t. 0 ≤ α i ≤ C , i = 1 ∑ n α i = 1
其中α i \alpha_{i} α i 是样本x i \mathbf{x}_i x i 对应的拉格朗日系数。求解该对偶问题后,可以获取所有样本对应的拉格朗日系数。
在所有训练样本中,把拉格朗日系数满足0 < α i < C 0 <\alpha_i <C 0 < α i < C 的样本称为支持向量,假设训练数据集中属于支持向量的样本集合为S V \mathbf{SV} S V ,那么超球体的球心和半径的计算公式分别为:
a = ∑ i = 1 n α i Φ ( x i ) R = K ( x v , x v ) − 2 ∑ i = 1 n α i K ( x v , x i ) + ∑ i = 1 n ∑ j = 1 n α i α j K ( x i , x j ) \mathbf{a}=\sum_{i=1}^{n} \alpha_{i} \Phi\left(\mathbf{x}_{i}\right) \\ R=\sqrt{K\left(\mathbf{x}_{v}, \mathbf{x}_{v}\right)-2 \sum_{i=1}^{n} \alpha_{i} K\left(\mathbf{x}_{v}, \mathbf{x}_{i}\right)+\sum_{i=1}^{n} \sum_{j=1}^{n} \alpha_{i} \alpha_{j} K\left(\mathbf{x}_{i}, \mathbf{x}_{j}\right)} a = i = 1 ∑ n α i Φ ( x i ) R = K ( x v , x v ) − 2 i = 1 ∑ n α i K ( x v , x i ) + i = 1 ∑ n j = 1 ∑ n α i α j K ( x i , x j )
其中v ∈ S V \mathbf{v}\in \mathbf{SV} v ∈ S V ,K ( x i , x j ) K(\mathbf{x}_i, \mathbf{x}_j) K ( x i , x j ) 是核函数,等于特征空间样本的内积K ( x i , x j ) = ⟨ Φ ( x i ) , Φ ( x j ) ⟩ K\left(\mathbf{x}_{i}, \mathbf{x}_{j}\right)=\left\langle\Phi\left(\mathbf{x}_{i}\right), \Phi\left(\mathbf{x}_{j}\right)\right\rangle K ( x i , x j ) = ⟨ Φ ( x i ) , Φ ( x j ) ⟩ 。
对于测试样本x t e s t \mathbf{x}_{test} x t e s t ,其到超球体球心的距离为
d = K ( x test , x test ) − 2 ∑ i = 1 n α i K ( x test , x i ) + ∑ i = 1 n ∑ j = 1 n α i α j K ( x i , x j ) d=\sqrt{K\left(\mathbf{x}_{\text {test }}, \mathbf{x}_{\text {test }}\right)-2 \sum_{i=1}^{n} \alpha_{i} K\left(\mathbf{x}_{\text {test }}, \mathbf{x}_{i}\right)+\sum_{i=1}^{n} \sum_{j=1}^{n} \alpha_{i} \alpha_{j} K\left(\mathbf{x}_{i}, \mathbf{x}_{j}\right)} d = K ( x test , x test ) − 2 i = 1 ∑ n α i K ( x test , x i ) + i = 1 ∑ n j = 1 ∑ n α i α j K ( x i , x j )
若d ≤ R d\leq R d ≤ R ,说明测试样本在超球体上或者内部,属于正常样本;反之则属于异常样本。
此外,可以在正类训练集中加入少数的负类样本来防止过拟合情况。假设训练集中正样本和负样本的标签分别为y i = + 1 y_i=+1 y i = + 1 和y i = − 1 y_i=-1 y i = − 1 ,则原优化问题的对偶问题变为
min α i ∑ i = 1 n ∑ j = 1 n y i y j α i α j K ( x i , x j ) − ∑ i = 1 n y i α i K ( x i , x i ) s.t. ∑ i = 1 n y i α i = 1 0 ≤ α i ≤ C 1 , y i = + 1 0 ≤ α i ≤ C 2 , y i = − 1 \min _{\alpha_{i}} \sum_{i=1}^{n} \sum_{j=1}^{n} y_{i} y_{j} \alpha_{i} \alpha_{j} K\left(\mathbf{x}_{i}, \mathbf{x}_{j}\right)-\sum_{i=1}^{n} y_{i} \alpha_{i} K\left(\mathbf{x}_{i}, \mathbf{x}_{i}\right) \\ \text { s.t. } \quad \sum_{i=1}^{n} y_{i} \alpha_{i}=1 \\ 0 \leq \alpha_{i} \leq C_{1}, y_{i}=+1 \\ 0 \leq \alpha_{i} \leq C_{2}, y_{i}=-1 α i min i = 1 ∑ n j = 1 ∑ n y i y j α i α j K ( x i , x j ) − i = 1 ∑ n y i α i K ( x i , x i ) s.t. i = 1 ∑ n y i α i = 1 0 ≤ α i ≤ C 1 , y i = + 1 0 ≤ α i ≤ C 2 , y i = − 1
超球体的球心和半径的计算公式分别为
a = ∑ i = 1 n y i α i Φ ( x i ) R = K ( x v , x v ) − 2 ∑ i = 1 n y i α i K ( x v , x i ) + ∑ i = 1 n ∑ j = 1 n y i y j α i α j K ( x i , x j ) \mathbf{a}=\sum_{i=1}^{n} y_{i} \alpha_{i} \Phi\left(\mathbf{x}_{i}\right) \\ R=\sqrt{K\left(\mathbf{x}_{v}, \mathbf{x}_{v}\right)-2 \sum_{i=1}^{n} y_{i} \alpha_{i} K\left(\mathbf{x}_{v}, \mathbf{x}_{i}\right)+\sum_{i=1}^{n} \sum_{j=1}^{n} y_{i} y_{j} \alpha_{i} \alpha_{j} K\left(\mathbf{x}_{i}, \mathbf{x}_{j}\right)} a = i = 1 ∑ n y i α i Φ ( x i ) R = K ( x v , x v ) − 2 i = 1 ∑ n y i α i K ( x v , x i ) + i = 1 ∑ n j = 1 ∑ n y i y j α i α j K ( x i , x j )
测试样本x t e s t \mathbf{x}_{test} x t e s t 到超球体球心的距离为
d = K ( x test , x test ) − 2 ∑ i = 1 n y i α i K ( x test , x i ) + ∑ i = 1 n ∑ j = 1 n y i y j α i α j K ( x i , x j ) d=\sqrt{K\left(\mathbf{x}_{\text {test }}, \mathbf{x}_{\text {test }}\right)-2 \sum_{i=1}^{n} y_{i} \alpha_{i} K\left(\mathbf{x}_{\text {test }}, \mathbf{x}_{i}\right)+\sum_{i=1}^{n} \sum_{j=1}^{n} y_{i} y_{j} \alpha_{i} \alpha_{j} K\left(\mathbf{x}_{i}, \mathbf{x}_{j}\right)} d = K ( x test , x test ) − 2 i = 1 ∑ n y i α i K ( x test , x i ) + i = 1 ∑ n j = 1 ∑ n y i y j α i α j K ( x i , x j )
从以上原理可知,两个关键计算点包括:
非线性映射函数Φ \Phi Φ 可以优化; 核函数K K K 有不同的选择,可能效果对应变化。 有篇理论解释较为详细的文章:https://zhuanlan.zhihu.com/p/32787491
拉格朗日乘子的求解涉及到凸优化问题的二次规划优化求解,需要使用到 Python 凸优化求解库 cvxopt !https://cvxopt.org/examples/tutorial/qp.html
参数问题比较纠结,可以参考:https://courses.csail.mit.edu/6.867/wiki/images/a/a7/Qp-cvxopt.pdf