话接上文(SVM的简单推导),这篇文章我们来看单类SVM:SVDD。可能大家会觉得很奇怪,我们为什么需要单分类呢?有篇博客举了一个很有意思的例子。

花果山上的老猴子,一生阅猴无数,但是从来没有见过其它的物种。有一天,猪八戒来到花果山找它们的大王,老猴子一声令下,把这个东西给我绑起来!

这里老猴子很清楚的知道这个外来物种不是同类,但是它究竟是什么,不得而知。老猴子见过很多猴,它知道猴子的特征,而外来生物明显不符合这个特征,所以它就不是猴子。

这就是一个单分类的简单例子。

而美猴王看到这个场景后,哈哈一笑,把这呆子抬过来!

对比二分类,显著的区别就是,二分类不但能得出来这个东西不是猴子,他还能告诉你这个东西叫“呆子”(当然我们的美猴王见多识广,肯定不止是二分类那么简单了)

今天要介绍的SVDD的全称是Support vector domain description。首先让我们简单了解一下domain description,也就是单分类问题。

单分类问题

不像常见的分类问题,单分类问题的目的并不时将不同类别的数据区分开来,而是对某个类别的数据生成一个描述(description)。这里的description比较抽象,可以理解为是样本空间中的一个区域,当某个样本落在这个区域外,我们就认为该样本不属于这个类别。

单分类方法常用于异常检测,或者类别极度不平衡的分类任务中。

当我们假设数据服从一个概率分布,我们就可以对这个分布中的参数进行估计了。对于一个新样本,如果这个样本在给定类别的概率分布中的概率小于阈值,就会被判定为异常样本。

但是这样的方法存在的问题是,

预先假定的概率分布对模型性能的影响很大。

当特征的维度很大的时候,该方法需要一个很大的数据集。

一些低密度区域的样本点会被误判为异常样本。

另一种思路就是,在样本空间中为此类数据划定一个大致的边界。如何划定这个边界,就是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中使用

可通过下面的代码在python中使用单类SVM

from sklearn.svm import OneClassSVM

参考文献

Tax D M J, Duin R P W. Support vector domain description[J]. Pattern recognition letters, 1999, 20(11-13): 1191-1199.

高斯核函数python代码_单类SVM:SVDD相关推荐

  1. 支持向量机python代码_用TensorFlow实现多类支持向量机的示例代码

    这篇文章主要介绍了用TensorFlow实现多类支持向量机的示例代码,现在分享给大家,也给大家做个参考.一起过来看看吧 本文将详细展示一个多类支持向量机分类器训练iris数据集来分类三种花. SVM算 ...

  2. 角谷猜想python代码_查看“Python-2020-fall”的源代码

    因为以下原因,您没有权限编辑本页: 您所请求的操作仅限于该用户组的用户使用:用户 您可以查看与复制此页面的源代码.== Python程序设计课程主页(2020年秋季学期) == Teacher: [h ...

  3. python 代码_如何让Python代码加速运行?

    Python 是一种脚本语言,相比 C/C++ 这样的编译语言,在效率和性能方面存在一些不足.但是,有很多时候,Python 的效率并没有想象中的那么夸张.本文对一些 Python 代码加速运行的技巧 ...

  4. 随机森林分类算法python代码_随机森林的原理及Python代码实现

    原标题:随机森林的原理及Python代码实现 最近在做kaggle的时候,发现随机森林这个算法在分类问题上效果十分的好,大多数情况下效果远要比svm,log回归,knn等算法效果好.因此想琢磨琢磨这个 ...

  5. 贝叶斯网络python代码_贝叶斯网络,看完这篇我终于理解了(附代码)!

    1. 对概率图模型的理解 概率图模型是用图来表示变量概率依赖关系的理论,结合概率论与图论的知识,利用图来表示与模型有关的变量的联合概率分布.由图灵奖获得者Pearl开发出来. 如果用一个词来形容概率图 ...

  6. 风险平价策略python代码_风险平价组合(risk parity)理论与实践

    本文介绍了风险平价组合的理论与实践:后续文章将对risk parity组合进行更深入探讨以及引入预期收益后的资产配置实战策略. 前言 资产配置是个很广泛的话题,在投资中是一个非常重要的话题 从使用场景 ...

  7. 聚类 python 代码_不足 20 行 Python 代码,高效实现 k-means 均值聚类算法

    下载好向圈APP可以快速联系圈友 您需要 登录 才可以下载或查看,没有帐号?立即注册 x 不足 20 行 Python 代码,高效实现 k-means 均值聚类算法-1.jpg (143.81 KB, ...

  8. python代码_零基础小白必看篇:Python代码注释规范代码实例解析操作(收藏)

    本文内容主要介绍了Python代码注释规范代码实例解析,通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下!!! 一.代码注释介绍 注释就是对代码的解释和说明 ...

  9. 二维高斯核函数(python)

    今天突然想要去试一试opencv里面的高斯模糊怎么实现,虽然以前已经写过很多次关于高斯核的函数了,但是有个好奇点,那就是一般不填sigma这个参数的时候,opencv是怎么计算的. 关于具体的高斯函数 ...

最新文章

  1. python有序队列_Python 队列
  2. 使用纯C++实现SQL Server2005 数据库读写操作详细步骤
  3. 一分钟详解PCL-1.8.1从源码搭建开发环境四(VTK库的编译)
  4. virtualenv使用
  5. 8.STM32中对ADC1_Config()函数(ADC1_GPIO_Config()和ADC1_Mode_Config())的理解(自定义)测试ADC转换电压值输出到终端上。
  6. (转)使用 /proc 文件系统来访问 Linux 内核的内容
  7. 手写简版spring --5--资源加载器解析文件注册对象
  8. HTML5中Web Worker技术的使用实例
  9. unique离散化用法
  10. tensorflow实现余弦cosine相似度
  11. jtopo连线绘制脉冲动画效果
  12. 有关照度和亮度的单位
  13. linux不能打开流的函数为,详解 4 种电脑提示“无法访问函数不正确”的解决方法...
  14. Windows10+CentOS 7 双系统安装
  15. 专业图形卡测试软件,专业卡能玩游戏么?实测很是意外
  16. 如何避免黑客攻击?国内首个云端加密代码库来帮忙
  17. 回顾日本和台湾的股市泡沫
  18. 神奇的口袋 C++ 三种方法(枚举,递归,动态规划)
  19. The 2020 ICPC Asia Yinchuan Regional Programming Contest
  20. 基于SSH的可扩展的程序代码源码Web在线评测系统

热门文章

  1. 使用 QuickBI 搭建酷炫可视化分析
  2. 【杭州云栖】飞天技术汇大视频专场:全民视频时代下的创新技术之路
  3. 一份帮助你更好地理解深度学习的资源清单
  4. 观测云品牌正式亮相,携手通信院共推国内可观测性概念与技术发展!
  5. 天天用Redis,持久化方案你又知道哪些?
  6. 小网站的容器化(下):网站容器化的各种姿势,先跟着撸一波代码再说!
  7. react 使用 leaflet 百度地图_【React】react项目中应用百度地图添加起始点绘制路线...
  8. java组合框的事件有哪些_博为峰Java技术文章 ——JavaSE Swing列表框选取事件的处理...
  9. java替换花括号,用正则表达式替换Java中的大括号{}之间的所有文本
  10. (进阶篇)Redis6.2.0 集群 主从复制_搭建_01