没见过女人的小和尚——SVDD

是的,即便是出生在山上的小和尚,从来没有下过山,没有见过女人,但是一旦有女施主上山,小和尚依然可以轻松地区分出眼前的人是如此不同。

传统的SVM是寻找一个超平面,而SVDD寻找的超平面更进一步,可以认为它是闭合的超平面。优化目标是曲面面积最小(即半径最小),约束条件是要使得尽可能多的样本被包含在曲面之中,至于到底需要包含多少,那就要涉及到松弛变量。

每个样本都对应一个自己的松弛变量epslon,即对于不同样本的容忍程度可以是不同的,容忍意味着样本可以在一定程度上脱离“包围圈”。最终的优化目标就是R平方的基础上+所有松弛变量之和,同时给这个和一个权重C,C就是惩罚因子,当然C越大,epsilon就要小,那么样本脱离“包围圈”的情况就会越少。

有了目标函数和约束条件,就可以使用拉格朗日乘子法。

F(R,a)=R^2+C\sum_i \xi_i.......................(1)     

\left \| x_i-a \right \|^2\leq R^2+\xi_i\xi \geq 0...................(2)

L(R,a,\alpha_i,\gamma,\xi)=R^2 +C\sum_i \xi_i \\ +\sum_i \alpha_i \left \{ \left \| x_i-a \right \| ^2 -2a\cdot x_i +\left \| a \right \| ^2 -R^2 -\xi_i \right \} -\sum_i \gamma_i\xi_i...........................(3)

\frac{\partial{L}}{\partial{R}}=0=2R-\sum_i \alpha_i\cdot 2R...................(4)

\frac{\partial{L}}{\partial{a}}=0=-2\cdot \sum_i \alpha_i \cdot x_i+2 \cdot \sum_i \alpha_i \left \| a\right \|................(5)

\frac{\partial{L}}{\partial{xi_i}}=0=C-\alpha_i-\gamma_i.........................(6)

由(4),(5),(6)得到:

\sum_i\alpha_i=1...................(7)

a=\frac{ \sum_i \alpha_x x_i}{\sum_i \alpha_i}=\frac{ \sum_i \alpha_x x_i}{1}= \sum_i \alpha_x x_i...................(8)

0\leq \alpha_i\leq C...........................(9)

将(6),(7),(8)代入(3)

L=\sum_i \alpha_i(x_i \cdot x_i) -\sum_{i,j}\alpha_i \alpha_j (x_i \cdot x_j)...................(10)

对于训练样本中的x_i,它相对于球心a的关系有三种:

\left \| x_i-a \right \|< R^2,此时天然满足不等式(2),可行解落在不等式约束区域内部,所以约束不起作用,对应的拉格朗日因子取0.

\left \| x_i-a \right \|= R^2,此时可行解落在约束区域边界,需要指明梯度反向,所以0<\alpha<C,此时松弛变量\xi不起作用,所以对应的拉格朗日因子\gamma=0

\left \| x_i-a \right \|> R^2,此时有点理解无能,只能理解成达到另外一个临界状态:\alpha_i=C,\gamma_i>0.

那么\alpha意义到底是什么。我们知道SVM中\alpha大于0表示该因子对应的样本点是支持向量,这是因为它参与了决策超平面的表示,而在SVDD中,通过(8)可以看到,同样是大于0时,样本会参与球心的表示,即这些点决定了球心的位置。球面除了需要知道球心的位置,还需要知道球半径。半径就是球面上点到球心的距离,球心现在我们得到了,怎么知道一个样本点是否在球面上呢?基于刚才的分析,当距离等于半径时,0<\alpha_i<C,\gamma_i=0。所以真正的支持向量应该是0<\alpha_i<C,\gamma_i=0

既然C这么重要,那么C有没有取值范围呢?C的实际含义是对松弛变量的惩罚权重,C越大,意味着越不能容忍离群点的存在。事实上,当C\geq 1,分离面就会退化成硬间隔。这是因为\sum_i \alpha_i=1,所以每个\alpha_i\leq 1,此时最多有且只有一个点是离群点(只能有一个\alpha_i==C)。

SVDD可以适用于训练数据只有一个类别的情况,那么当我们有负样本的时候仍然可以使用SVDD吗?答案是是的。不同于SVM寻找于距离两个类别最远的超平面,SVDD的超平面会接近包围我们关心的那一类;当面对一个不属于任何两类的样本,SVM会强行分成其中一类,而SVDD会识别出这个是一个外点。

使用负样本的话,会多出一个约束条件,同时多出一个拉格朗日因子。求解的方法一样,可以得到:

\sum_i \alpha_i -\sum_l \alpha_l =1

a=\sum_i \alpha_i x_i -\sum_l \alpha_l x_l

0\leq \alpha_i\leq C_1,0\leq \alpha_l\leq C_2

同时使用内点和外点的SVDD

其实形式和原始的SVDD是很像的,而当我们令\alpha^{'}_{i}=y_i \alpha_{i},y取1或者-1代表正样本(内点)与负样本(外点),就会惊奇地得到和原始SVDD完全一致的结构。但是问题是当我们添加了外点作为新约束,那么原来的描述面就要适度调整,而最小的调整将会是正好把外点放在描述球面上,而这样明显是不合适的,它没有很好地描述原来的内点。现在我们寄希望于核函数来解决这个问题:K(x_i,x_j)=(\Phi(x_i),\Phi(x_j))

先看多项式核。

K(x_i,x_j)=(x_i \cdot x_j)^d,实际上多项式一般会有一个常数,我们先以这个形式来说明。内积的计算方式是(x_i \cdot x_j)^d=cos^d( \theta _{i,j})\left \| x_i \right \|^d \cdot \left \| x_j \right \|^d\cong \left \| x_i \right \|^d \cdot \left \| x_j \right \|^d。首先,因为有角度的计算,当两个样本点的夹角很小时,余弦值会接近1,此时如果训练样本的模也很大,那么映射之后的结果就会以模较大的样本点为主。这种情况可以通过归一化被抑制,但是会放大噪声的影响,并且无法消除不同样本模的差异性。可见多项式核是不适用于SVDD的。

再看高斯核。K(x_i,x_j)=exp(-\left \| x_i-x_j \right \|^2/s^2)

因为测试样本z到球心a的距离用下式表示:

\left \| z-a \right \|^2=(z \cdot z) -2\sum_i\alpha_i(z \cdot x_i) + \sum_{i,j}\alpha_j\alpha_j(x_i \cdot x_j)\leq R^2

第一项是一个常数1,这同时也反映了高斯核的一个特点:不同于多项式核,测试点和球心的相对角度无关,而只与距离有关,而当距离为0时,高斯核取1,所以被高斯核映射后的样本的内积是1:\Phi(x_i,)\cdot\Phi(x_i)=1

现在讨论高斯核中的标准差s。当s很小,只要i\not\equiv j,那么映射之后的内积约等于0,此时公式(10)退化为L=\sum_i \alpha_i,得到\alpha_i=1,所有的样本点都变成支持向量,这样就会过拟合。当s很大时,高斯核会退化为标准球面的形式(可以通过泰勒展开,会发现优化目标函数和标准形式几乎一样)

误差估计

一个本来应该是内点的样本被支持向量的描述拒绝在范围之内,那么这就是一个error,而这个误差可以通过Leave-One-Out估计方法,由支持向量的个数反映出来。为了理解这个结论,首先要知道什么是essential support vectors。构成一个种类的描述的球心不是唯一是,因为球心由支持向量的加权表示,而支持向量可能是几个不同的处于球面的点。essential support vectors是那些在所有可能的expansions中都会出现的样本。那么什么是expansions呢,就是用Leave-One-Out的方法,每次去掉一个样本,查看用剩余样本训练得到的解是否会发生变化。

当去掉训练数据中的一个样本点,那么得到的解仍然是一样的,同时将该样本用于测试时,它仍然会被认为是内点;而当把非essential support vectors对应的样本点舍弃时,得到的解仍然是一样的;而当把essential support vectors对应的样本点舍弃时,得到的解发生变化:所描述的范围变小了,同时舍弃的那个样本被解划分为外点。当去掉\alpha_i>C的点,本来就是被误判为外点,去掉之后仍然被误判。结合这几个情况,既然有的点判断正确与否一直不变,有的点会随着是否是essential support vectors而波动,那么我们可以得到一个误判率的上限:

\tilde{E_{LOO}}\leq \frac{ \# SVs + \# errors}{N}

LOO就表示使用的是Leave-One-Out的估计方法。#errors表示的是固有的无法改变的误判,#SVs表示的是随着训练样本的调整对应的不同误判个数(当去除掉essential,误判升高)

基于误差估计,可以对超参数C和s进行设定。对于C,因为\sum^N \alpha_i =1,所以n(\alpha_i >C)=1

实战

在sklearn中提供了接口

decision_function = score_samples - offset_,decision_function 是函数距离,即将坐标和标签符号代入决策函数中,得到的结果的正负号表示正负样本,绝对值大小则表示距离超平面的距离。很显然,当样本正好处于超平面时距离为0。为什么使用函数距离,因为在预测时不需要求解,只关心测试样本落在超平面哪一边。score_samples是在decision_function基础上加了一个偏置,这个偏置是sklearn.svm.OneClassSVM中的一个属性,是intercept_的相反数,而intercept_是决策函数中的常数的相反数。所以score_samples是去除了偏置影响的决策函数的结果。而决策函数的结果实际上可以充当预测时的概率,因为当sklearn.svm.OneClassSVM的属性probability关闭时,无法得到预测概率值,这时就可以使用decision_function 得到ROC曲线。具体在多分类时decision_function又依据‘ovr’和‘ovo’有不同的调整。

得到fit之后的模型,就可以得到一些有用的属性:clf.support_vectors_得到支持向量,以array表示,行数是支持向量的个数,列数是特征个数;clf.dual_coef得到支持向量对应的alpha系数,当然都是大于0的值;clf.support_得到支持向量在训练数据中的索引值,因为支持向量是训练数据的一部分,由索引值可以得到具体是哪些训练样本是如此重要,直接决定了超球面的形成。这时查看支持向量对应的decision_function发现,决策函数的输出值不是0,但是支持向量不应该就落在超球面上吗,个人认为这里是由于引入了松弛变量。

之前提到,当外点也是available时,SVDD是可以加入外点一起训练的,只不过是增加一个约束条件罢了,而且可以通过重构表达式得到和标准SVDD结构一样的解。但是sklearn中貌似不支持训练数据有两个标签,fit函数中自动忽略标签取值。

此外还有其他类似的算法,如ensemble.IsolationForest and neighbors.LocalOutlierFactor covariance.EllipticEnvelope ,他们都可以用来Novelty and Outlier Detection。这里的outlier detection和novelty detection其实是有区别的,outlier detection在训练的过程中是允许有外点的(即便是同一标签的数据,也会存在一些噪点),而外点检测算法会关注于更加集中的数据。对于OneClass SVM而言,它对噪声是很敏感的,所以需要通过超参数nu来调节松弛变量,避免过拟合。而novelty detection的训练数据是不受外点影响的。但其实outlier和novelty经常混用。

模型属性解析

dual_coef的维度是与支持向量个数对应的,它其实还与标签有关。以基本的SVM为例:

decision function=sgn(\sum^n_{i=1}y_i\alpha_iK(x_i,x)+\rho ),为了方便,dual coef=y_i\alpha_i

那么coef是什么呢,coef只有当核函数是线性核时生效。当线性核时,决策函数退化为:sgn(\sum^n_{i=1}y_i\alpha_i<x_i,x> + \rho)=sgn((\sum^n_{i=1}\alpha_iy_ix_i)^T x) + \rho)=\\ sgn(coef\cdot x+ \rho)

所以coef其实是以dual_coef为权重,对训练样本的加权和(每个特征分别加权),最终得到的值的维度和特征数一样,这样就可以直接和测试值求内积,从而求出决策函数输出值。

coef_ndarray of shape (1, n_features)
Weights assigned to the features (coefficients in the primal problem). This is only available in the case of a linear kernel.

coef_ is readonly property derived from dual_coef_ and support_vectors_.

dual_coef_ndarray of shape (1, n_SV)
Coefficients of the support vectors in the decision function.

对于高斯核函数也类似,只不过只能使用dual_coef计算,同时要注意先计算和支持向量的距离,然后使用高斯函数。具体到这里的SVDD,决策函数其实只有第二项是与测试样本z有关的(第一项为常数1):

\left \| z-a \right \|^2=\Phi(z,z) -2\sum_i\alpha_i \Phi (d((z ,x_i) ))+ \sum_{i,j}\alpha_j\alpha_j \Phi(d(x_i,x_j))\leq R^2

而其余常数项被sklearn打包为一项:使用intercept_表示,所以decision_function

\sum_i\alpha_i \Phi (d((z ,x_i) )) +clf. intercept=\\\sum_i\alpha_i exp(d((z ,x_i) *(-clf.gamma)) )) +clf. intercept

参数nu的解释

sklearn的手册中说明了这个参数,但是它居然同时代表了两个含义:An upper bound on the fraction of training errors and a lower bound of the fraction of support vectors. Should be in the interval (0, 1]. By default 0.5 will be taken.

实际上不光在OneClass中,在v-SVC中也有这个参数,也具有相同的含义:Parameter nu in NuSVC/OneClassSVM/NuSVR approximates the fraction of training errors and support vectors.

而这个参数其实是传统C-SVC的另外一种表示方法,二者是等价的:The ν-SVC formulation 15 is a reparameterization of the C-SVC and therefore mathematically equivalent.

nu表示new,可以看文档中提到的这篇论文https://www.stat.purdue.edu/~yuzhu/stat598m3/Papers/NewSVM.pdf

这时对nu的更详细的解释http://ntur.lib.ntu.edu.tw/bitstream/246246/155217/1/09.pdf

Reference:

1.https://scikit-learn.org/stable/modules/generated/sklearn.svm.OneClassSVM.html

2.https://mail.python.org/pipermail/scikit-learn/2016-July/000298.html

3.https://www.zhihu.com/question/32297061

4.https://scikit-learn.org/stable/modules/outlier_detection.html#outlier-detection

5.https://blog.csdn.net/resourse_sharing/article/details/51538480

6.距离与概率https://stats.stackexchange.com/questions/14876/interpreting-distance-from-hyperplane-in-svm

7.nuhttp://www.voidcn.com/article/p-unorlqyr-btg.html

 

 

 

 

 

 

 

 

 

https://zhuanlan.zhihu.com/p/97522759

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值