Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >异常检测 One Class SVM 算法的个人理解

异常检测 One Class SVM 算法的个人理解

作者头像
为为为什么
发布于 2022-11-23 12:30:17
发布于 2022-11-23 12:30:17
3.6K00
代码可运行
举报
文章被收录于专栏:又见苍岚又见苍岚
运行总次数:0
代码可运行

SMV 被广泛用于数据二分类,在变种中也有做异常检测的应用,本文记录异常检测算法 OCSVM(One Class SVM)。

OCSMV 的思想

  • 异常检测是工业领域或应对样本不均衡时的常用方法,训练异常检测模型时往往仅运用 1 类标签数据
  • 在 SVM 下实现异常检测时也是仅有一类数据,The Support Vector Method For Novelty Detection by Schölkopf et al. 基本上将所有的数据点与零点在特征空间 F 分离开,并且最大化分离超平面到零点的距离。实现的思路是找到一个超平面将所有样本都放在一侧,同时让这个平面距离原点的距离更远
  • 也就是找到一个相对于原点来说最“紧致”的平面
  • 在测试数据时,在平面远离原点一侧的数据我们认为是同类数据,反之出现在靠近原点一侧的数据则认为是异常数据

优化目标由来

论文描述的优化目标
  • 在论文中,直接给出了 OCSVM 的优化目标:

$$ \begin{array}{c} \min _{w, \zeta_{i}, \rho} \frac{1}{2}\|w\|^{2}+\frac{1}{\nu n} \sum_{i=1}^{n} \zeta_{i}-\rho \\ s.t. \left(w^{T} \phi\left(x_{i}\right)\right)>\rho-\zeta_{i}, i=1, \ldots, n \\ \zeta_{i}>0 \end{array} $$

  • 其中 \zeta_{i} 表示松弛变量, \nu 类似于二分类SVM中的 C ,表示正则项系数,用于软 SMV 模型的训练,给训练数据中的异常留个余地
  • 论文中并没有叙述这个公式是怎么来的,我按照自己对 SVM 和 OCSVM 的目标的理解尝试做了推导,如有不当烦请指正
直接根据定义推导优化目标
  • 假设我们有 nm 维数据 {x_1,x_2, …,x_n},x\in R^m,都是同一类数据,以此建立 One Class SVM 模型,如果我们暂时不加入松弛变量
  • SVM 模型框架不变,目标是寻找一个超平面,在此处我们将超平面方程表示为:
f(x)=w^{T} x- \rho =0
  • 既然我们的目的是将现有数据和原点区分开,那么我们不妨假设现有数据标签为 1,那么对样本的约束为:
w^Tx_i-\rho \geq0
  • 在满足约束的条件下我们的优化目标是使得原点到平面的几何间隔最大,根据我们已经知道的 SVM 的推导过程,几何间隔为:
\gamma=\frac{f(x)}{||w||}
  • 几何间隔是分正负的,此时事实上分为两种情况:
    • 如果该平面的位置无论如何都会将原点和数据分到平面的同一侧时,几何间隔非正,要使得几何间隔最大,需要拉近原点和平面的距离
    • 如果平面可以将原点和数据分开,此时几何间隔为正,那么就要拉远原点和平面的距离
  • 原点到屏幕的几何距离(几何间隔的绝对值)为:
l=\frac{|f(0)|}{||w||}=\frac{|\rho|}{||w||}
  • 时:
w^T0-\rho < 0

时:

w^T0-\rho \geq 0

此时原点和数据在一起,在“数据侧”

  • 因此在约束条件下的 l,我们的优化目标也分情况讨论: 当 \rho >0 \rho \leq0,需要最小化平面到原点的距离,当前优化问题变为:
  • 这是可以发现,两种情况下的优化目标事实上是相同的,那么我们可以合并两种情况,拿掉对 \rho 的约束,得到原始的 OCSVM 优化目标:

$$ \begin{array}{c} \max \frac{\rho}{||w||}\\ s.t. w^Tx_i-\rho \geq0,i\in\{1,2,...,n\}\\ \end{array} $$

  • 即:
\min ||w||-\rho

当 即:

\min -||w||-\rho
  • 这就不好搞了,也和论文中的优化目标相悖
  • 由于 \rho 的符号会左右优化目标,按照数据原始样貌训练 OCSVM 很可能难以优化下去
加入松弛变量
  • 既然直接搞搞不了,论文作者在文中事实上有一句话为问题加了额外的约束:

To separate the data set from the origin, we solve the following quadratic program

  • 也就是说这个平面必须将原点和数据分开
  • 分不开?咱们加核函数:
\left(w^{T} \phi\left(x_{i}\right)\right)-\rho > 0
  • 还分不开?那就加软间隔惩罚项,这回必须保证平面把原点和数据给我分开喽,实在分不开的点就记个账,在优化目标上付点代价假装他分开了:
\left(w^{T} \phi\left(x_{i}\right)\right)>\rho-\zeta_{i}
  • 这样的话我们就多了个假设,该超平面已经将原点和数据区分开,那么就强行按照 \rho >0
\min ||w||-\rho
  • 等价于:
\min \frac{1}{2}||w||^{2}-\rho
  • 再加入软间隔的代价补偿,就得到了原始论文中的优化目标:

$$ \begin{array}{c} \min _{w, \zeta_{i}, \rho} \frac{1}{2}\|w\|^{2}+\frac{1}{\nu n} \sum_{i=1}^{n} \zeta_{i}-\rho \\ s.t. \left(w^{T} \phi\left(x_{i}\right)\right)>\rho-\zeta_{i}, i=1, \ldots, n \\ \zeta_{i}>0 \end{array} $$

终极纠结
  • 我有点死钻牛角尖了,在上述优化目标没有强制加上 \rho \geq 0 的情况下,我认为还是有可能解出 \rho < 0
  • 那么一旦这种情况出现,个人认为此时的边界很可能不是最优边界,因为此时正在 \min ||w||,平面距离原点的几何距离可能并不会很小,也就是这不是一个包裹住所有数据的最”紧致“平面

求解和 infer

  • 求解上述优化函数就可以直接上 SVM 的套路了,原始问题 -> 对偶问题 -> SMO 解拉格朗日乘子 …
  • 推断测试数据时,直接用公式:

$$ f(x)=sign\left(\left(w^{T} \phi\left(x_{i}\right)\right)-\rho\right) =sign( \sum_{i=1}^{n n} \alpha_{i} K\left(x, x_{i}\right)-\rho ) $$

  • 负数即为异常样本

Python 实现

引用一位大佬文章的代码:

  • 核心算法用 sklearn 库实现:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.font_manager
from sklearn import svm

"""
Anomaly detection: generate data, and fit the model using scikit-learn OneClassSvm.
scikit-learn Reference: 
https://scikit-learn.org/stable/modules/generated/sklearn.svm.OneClassSVM.html
"""
# Generate train/test/abnormal data
X = 0.3 * np.random.randn(100, 2) 
XX = 0.3 * np.random.randn(20, 2)
X_train = np.r_[X + 2, X - 2]
X_test = np.r_[XX + 2, XX - 2]
X_outliers = np.random.uniform(low=-4, high=4, size=(20, 2))

# fit the model
clf = svm.OneClassSVM(nu=0.5, kernel='rbf', gamma=0.1)
clf.fit(X_train)
y_pred_train = clf.predict(X_train) # return 1,-1
y_pred_test = clf.predict(X_test)   # return 1,-1
y_pred_outliers = clf.predict(X_outliers)

# fp/fn
n_error_train = y_pred_train[y_pred_train == -1].size
n_error_test = y_pred_test[y_pred_test == -1].size
n_error_outliers = y_pred_outliers[y_pred_outliers == 1].size 


"""
Visualization of the result.
"""
xx, yy = np.meshgrid(np.linspace(-5, 5, 500), np.linspace(-5, 5, 500))

# plot the line, the points, and the nearest vectors to the plane
Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.figure(figsize=(10,6))
plt.title('Novelty Detection')
plt.contourf(xx, yy, Z, levels=np.linspace(Z.min(), 0, 7), cmap=plt.cm.PuBu)
a = plt.contour(xx, yy, Z, levels=[0], linewidths=2, colors='darkred')
plt.contourf(xx, yy, Z, levels=[0, Z.max()], colors='palevioletred')

s = 40
b1 = plt.scatter(X_train[:, 0], X_train[:, 1], c='white', s=s, edgecolors='k')
b2 = plt.scatter(X_test[:, 0], X_test[:, 1], c='blueviolet', s=s,
                 edgecolors='k')
c = plt.scatter(X_outliers[:, 0], X_outliers[:, 1], c='gold', s=s,
                edgecolors='k')
plt.axis('tight')
plt.xlim((-5, 5))
plt.ylim((-5, 5))
plt.legend([a.collections[0], b1, b2, c],
           ['learned frontier', 'training observations',
            'new regular observations', 'new abnormal observations'],
           loc='upper left',
           prop=matplotlib.font_manager.FontProperties(size=11))
plt.xlabel(
    'error train: %d/200 ; errors novel regular: %d/40 ; '
    'errors novel abnormal: %d/40'
    % (n_error_train, n_error_test, n_error_outliers))
plt.show()

  • 运行效果:

原始论文

参考资料

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年10月29日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
OCSVM 学习笔记
OCSVM(OneClass SVM) 算法是一种经典的异常检测算法,基本原理与 SVM 类似,与 SVM 关注的二分类问题不同的是,就像它的名字 OneClass SVM 那样,OCSVM 只有一个分类,这也正是异常检测所需要的,我们不关注那些异常的数据点。
EmoryHuang
2022/10/31
1.2K0
OCSVM 学习笔记
无监督︱异常、离群点检测 一分类——OneClassSVM
根据文章内容总结的摘要
悟乙己
2018/01/02
8.2K0
无监督︱异常、离群点检测 一分类——OneClassSVM
【python数据挖掘实战】之一:异常检测
等,有着重要的作用。由于在以上场景中,异常的数据量都是很少的一部分,因此诸如:SVM、逻辑回归等分类算法,都不适用,因为:
统计学家
2019/04/10
2.3K0
【python数据挖掘实战】之一:异常检测
机器学习(二十一) 异常检测算法之IsolationForest
IsolationForest指孤立森林,是一种高效的异常检测算法。在所有样本数据中,异常数据具有数量少并且与大多数数据不同的特点,利用这一特性分割样本,那些异常数据也容易被隔离处理。
致Great
2019/09/19
1.7K0
机器学习(二十一) 异常检测算法之IsolationForest
14种异常检测方法汇总(附代码)!
今天给大家分享一篇关于异常检测的文章,重点介绍了14种公开网络上一些常见的异常检测方法(附资料来源和代码)。
小白学视觉
2022/12/27
2.7K0
14种异常检测方法汇总(附代码)!
Python 离群点检测算法 -- OCSVM
支持向量机(SVM)是一种监督学习算法,可处理分类和回归问题,由Vladimir Vapnik及其同事在1992-1995年在AT&T贝尔实验室开发。现已广泛应用于分类问题。
数据STUDIO
2024/04/30
5030
Python 离群点检测算法 -- OCSVM
【机器学习 | 数据挖掘】离群点检测
智能大数据分析是指利用先进的技术和算法对大规模数据进行深入分析和挖掘,以提取有价值的信息和洞察。它结合了大数据技术、人工智能(AI)、机器学习(ML)和数据挖掘等多种方法,旨在通过自动化的方式分析复杂数据集,发现潜在的价值和关联性,实现数据的自动化处理和分析,从而支持决策和优化业务流程。与传统的人工分析相比,智能大数据分析具有自动化、深度挖掘、实时性和可视化等特点。智能大数据分析广泛应用于各个领域,包括金融服务、医疗健康、零售、市场营销等,帮助企业做出更为精准的决策,提升竞争力。 【GitCode】专栏资源保存在我的GitCode仓库:https://gitcode.com/Morse_Chen/Intelligent_bigdata_analysis。
Francek Chen
2025/01/22
1430
【机器学习 | 数据挖掘】离群点检测
理论结合实践,一文搞定异常检测技术
数据集汇总的异常数据通常被认为是异常点、离群点或孤立点,特点是这些数据的特征与大多数数据不一致,呈现出"异常"的特点,检测这些数据的方法称为异常检测。
数据STUDIO
2021/07/21
1.4K0
算法入门(八)—— 有“边界感”的支持向量机(SVM) (内附Kaggle实战源码与数据集)
机器学习中,支持向量机(SVM)是一种经典的分类算法,它的优势在于高效的性能与良好的泛化能力。简而言之,SVM就像一个能精准“分割”不同类别的高手,它通过找到一个最佳分割线(在高维空间中是超平面),来区分数据点。
万事可爱^
2025/01/23
2460
算法入门(八)—— 有“边界感”的支持向量机(SVM) (内附Kaggle实战源码与数据集)
SVM笔记
SVM(Support Vector Machine)是一种寻求最大分类间隔的机器学习方法,广泛应用于各个领域,许多人把SVM当做首选方法,它也被称之为最优分类器,这是为什么呢?这篇文章将系统介绍SVM的原理、推导过程及代码实践。
努力努力再努力F
2018/09/11
1.2K0
SVM笔记
支持向量机(Support Vector Machines,SVM)
线性可分SVM学习方法,对线性不可分训练数据是不适用的,怎么将它扩展到线性不可分,需要修改硬间隔最大化,使其成为软间隔最大化。
Michael阿明
2020/07/13
1.9K1
支持向量机(Support Vector Machines,SVM)
机器学习-支持向量机SVM算法
支持向量机(Support Vector Machine, SVM)对监督学习下二分类问题提供了一个绝妙的解决方案。通过对偶函数和核函数求解,将适用范围从二维线性推广到多维非线性模型,使用相关方法变形,也可用于多分类问题和回归问题。
唔仄lo咚锵
2023/05/23
5580
机器学习-支持向量机SVM算法
基于机器学习算法的时间序列价格异常检测(附代码)
异常检测也称为异常值检测,是一种数据挖掘过程,用于确定数据集中发现的异常类型并确定其出现的详细信息。 在当今世界,由于大量数据无法手动标记异常值,自动异常检测显得至关重要。 自动异常检测具有广泛的应用,例如欺诈检测,系统健康监测,故障检测以及传感器网络中的事件检测系统等。
量化投资与机器学习微信公众号
2019/02/26
6.3K0
机器学习算法|支持向量机(Support Vector Machine,SVM)
机器学习(MachineLearning),作为计算机科学的子领域,是人工智能领域的重要分支和实现方式。
阿巴阿巴-
2025/03/03
1K0
支持向量机(SVM)算法
训练集 => 提取特征向量 => 结合一定的算法(分类器:比如决策树,KNN)=>得到结果
foochane
2019/05/23
7130
支持向量机(SVM)算法
离群点异常检测及可视化分析工具pyod测试
找到了一个对Outlier Detection (Anomaly Detection) 异常值检测(异常检测)的比较好的工具(https://github.com/yzhao062/Pyod),该工具集成了多个算法。
sparkexpert
2019/05/26
1.5K0
支持向量机(SVM)
支持向量机(Support Vector Machine, SVM)是一种强大的监督学习算法,广泛应用于分类和回归问题,尤其在处理高维数据、非线性问题和小样本数据时表现尤为优秀。SVM通过寻找一个最优的超平面来最大化分类边界,从而实现分类。它的基本思想源于几何和优化理论,具有很强的数学基础,并且在实践中取得了广泛的应用。
LucianaiB
2025/01/17
3950
总结了14种数据异常值检验的方法!
来源:宅码本文约7100字,建议阅读10+分钟本文收集整理了公开网络上一些常见的异常检测方法(附资料来源和代码)。 一、基于分布的方法 1. 3sigma 基于正态分布,3sigma准则认为超过3sigma的数据为异常点。 图1: 3sigma def three_sigma(s): mu, std = np.mean(s), np.std(s) lower, upper = mu-3*std, mu+3*std return lower, upper ‍ 2. Z-sco
数据派THU
2022/09/19
1.1K0
总结了14种数据异常值检验的方法!
支持向量机SVM算法的学习记录
本文是对于机器学习中SVM算法的一次学习记录,主要介绍SVM的原理和简单应用。通过自己实际操作去理解SVM。
p4nda
2023/01/03
5420
支持向量机SVM算法的学习记录
异常检测算法比较
算法:异常检测算法比较是包括Robust covariance、One-Class SVM、Isolation Forest和Local Outlier Factor的参数根据实际数据选择的异常检测的结果比较。
裴来凡
2022/05/29
4170
异常检测算法比较
相关推荐
OCSVM 学习笔记
更多 >
LV.1
这个人很懒,什么都没有留下~
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验