是的,即便是出生在山上的小和尚,从来没有下过山,没有见过女人,但是一旦有女施主上山,小和尚依然可以轻松地区分出眼前的人是如此不同。
传统的SVM是寻找一个超平面,而SVDD寻找的超平面更进一步,可以认为它是闭合的超平面。优化目标是曲面面积最小(即半径最小),约束条件是要使得尽可能多的样本被包含在曲面之中,至于到底需要包含多少,那就要涉及到松弛变量。
每个样本都对应一个自己的松弛变量epslon,即对于不同样本的容忍程度可以是不同的,容忍意味着样本可以在一定程度上脱离“包围圈”。最终的优化目标就是R平方的基础上+所有松弛变量之和,同时给这个和一个权重C,C就是惩罚因子,当然C越大,epsilon就要小,那么样本脱离“包围圈”的情况就会越少。
有了目标函数和约束条件,就可以使用拉格朗日乘子法。
,
由(4),(5),(6)得到:
将(6),(7),(8)代入(3)
对于训练样本中的,它相对于球心的关系有三种:
,此时天然满足不等式(2),可行解落在不等式约束区域内部,所以约束不起作用,对应的拉格朗日因子取0.
,此时可行解落在约束区域边界,需要指明梯度反向,所以,此时松弛变量不起作用,所以对应的拉格朗日因子
,此时有点理解无能,只能理解成达到另外一个临界状态:.
那么意义到底是什么。我们知道SVM中大于0表示该因子对应的样本点是支持向量,这是因为它参与了决策超平面的表示,而在SVDD中,通过(8)可以看到,同样是大于0时,样本会参与球心的表示,即这些点决定了球心的位置。球面除了需要知道球心的位置,还需要知道球半径。半径就是球面上点到球心的距离,球心现在我们得到了,怎么知道一个样本点是否在球面上呢?基于刚才的分析,当距离等于半径时,。所以真正的支持向量应该是
既然C这么重要,那么C有没有取值范围呢?C的实际含义是对松弛变量的惩罚权重,C越大,意味着越不能容忍离群点的存在。事实上,当,分离面就会退化成硬间隔。这是因为,所以每个,此时最多有且只有一个点是离群点(只能有一个==C)。
SVDD可以适用于训练数据只有一个类别的情况,那么当我们有负样本的时候仍然可以使用SVDD吗?答案是是的。不同于SVM寻找于距离两个类别最远的超平面,SVDD的超平面会接近包围我们关心的那一类;当面对一个不属于任何两类的样本,SVM会强行分成其中一类,而SVDD会识别出这个是一个外点。
使用负样本的话,会多出一个约束条件,同时多出一个拉格朗日因子。求解的方法一样,可以得到:
同时使用内点和外点的SVDD
其实形式和原始的SVDD是很像的,而当我们令,y取1或者-1代表正样本(内点)与负样本(外点),就会惊奇地得到和原始SVDD完全一致的结构。但是问题是当我们添加了外点作为新约束,那么原来的描述面就要适度调整,而最小的调整将会是正好把外点放在描述球面上,而这样明显是不合适的,它没有很好地描述原来的内点。现在我们寄希望于核函数来解决这个问题:。
先看多项式核。
,实际上多项式一般会有一个常数,我们先以这个形式来说明。内积的计算方式是。首先,因为有角度的计算,当两个样本点的夹角很小时,余弦值会接近1,此时如果训练样本的模也很大,那么映射之后的结果就会以模较大的样本点为主。这种情况可以通过归一化被抑制,但是会放大噪声的影响,并且无法消除不同样本模的差异性。可见多项式核是不适用于SVDD的。
再看高斯核。
因为测试样本z到球心a的距离用下式表示:
第一项是一个常数1,这同时也反映了高斯核的一个特点:不同于多项式核,测试点和球心的相对角度无关,而只与距离有关,而当距离为0时,高斯核取1,所以被高斯核映射后的样本的内积是1:。
现在讨论高斯核中的标准差s。当s很小,只要,那么映射之后的内积约等于0,此时公式(10)退化为,得到,所有的样本点都变成支持向量,这样就会过拟合。当s很大时,高斯核会退化为标准球面的形式(可以通过泰勒展开,会发现优化目标函数和标准形式几乎一样)
误差估计
一个本来应该是内点的样本被支持向量的描述拒绝在范围之内,那么这就是一个error,而这个误差可以通过Leave-One-Out估计方法,由支持向量的个数反映出来。为了理解这个结论,首先要知道什么是essential support vectors。构成一个种类的描述的球心不是唯一是,因为球心由支持向量的加权表示,而支持向量可能是几个不同的处于球面的点。essential support vectors是那些在所有可能的expansions中都会出现的样本。那么什么是expansions呢,就是用Leave-One-Out的方法,每次去掉一个样本,查看用剩余样本训练得到的解是否会发生变化。
当去掉训练数据中的一个样本点,那么得到的解仍然是一样的,同时将该样本用于测试时,它仍然会被认为是内点;而当把非essential support vectors对应的样本点舍弃时,得到的解仍然是一样的;而当把essential support vectors对应的样本点舍弃时,得到的解发生变化:所描述的范围变小了,同时舍弃的那个样本被解划分为外点。当去掉的点,本来就是被误判为外点,去掉之后仍然被误判。结合这几个情况,既然有的点判断正确与否一直不变,有的点会随着是否是essential support vectors而波动,那么我们可以得到一个误判率的上限:
LOO就表示使用的是Leave-One-Out的估计方法。#errors表示的是固有的无法改变的误判,#SVs表示的是随着训练样本的调整对应的不同误判个数(当去除掉essential,误判升高)
基于误差估计,可以对超参数C和s进行设定。对于C,因为,所以
实战
在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=,为了方便,
那么coef是什么呢,coef只有当核函数是线性核时生效。当线性核时,决策函数退化为:
所以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):
而其余常数项被sklearn打包为一项:使用intercept_表示,所以decision_function
参数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