系列文章目录
Python异常检测- Isolation Forest(孤立森林)
python异常检测 - 随机离群选择Stochastic Outlier Selection (SOS)
python异常检测-局部异常因子(LOF)算法
Python异常检测- DBSCAN
文章目录
- 系列文章目录
- 前言
- 一、One-Class SVM原理
- 二、One-Class SVM实现步骤
- 三、优缺点
- 四、应用场景
- 五、python实现
前言
单类支持向量机(One-Class SVM与传统支持向量机(SVM)不同,是一种非监督的学习算法。您可以使用One-Class SVM异常检测通过学习边界对异常点进行预测。
一、One-Class SVM原理
One-Class SVM(Support Vector Machine)是一种无监督学习算法,用于异常检测和离群点检测。它的原理基于支持向量机的思想,旨在通过构建一个边界来区分正常样本和异常样本。具体是通过构建一个只包含正常样本的决策边界来识别异常样本,One-Class SVM的目标是在特征空间中找到一个最优的超平面,使得正常样本尽可能靠近超平面,而异常样本远离超平面。
One-Class SVM的原理表明One-Class SVM 的核心在于选择合适的超平面,以确保正常数据被尽可能包围,而异常数据则尽量远离。为达到这一目标,需要通过优化目标函数来实现的,从而实现最小化超平面到最近正常数据点的距离同时最大化超平面与正常数据之间的距离。
对于一组二维数据,One-Class SVM的目标即就是寻找一个超平面将样本中的正例圈出来-当然,实际是使用的情况下,维数不可能这么低。
二、One-Class SVM实现步骤
One-Class SVM通过构造原点与单类训练数据之间的超平面,进而可以判断测试数据与单类训练数据之间相似与否,并通过测试集数据与单类训练数据相似性来将其标记为1(相似)或-1(不相似)。其具体实现步骤如下
- 数据映射-- 核函数:
将正常数据映射到高维特征空间中,使得正常数据点能够被一个超平面所包围。这个超平面被称为决策边界,通过使用核函数来实现One-Class SVM在原始特征空间中找到非线性分割超平面,一般常用的核函数包括线性核、多项式核和高斯核。 - 寻找最优超平面:
通过最大化超平面与正常数据之间的间隔,寻找一个最优的分割超平面,使得异常点尽可能远离该超平面。正常数据点尽量被包围,并且能离该超平面边界越远越好。 支持向量是离分割超平面最近的正常样本点,它们决定了分割超平面的位置和方向。One-Class SVM通过选择最优的支持向量,以使分割超平面最大化远离正常样本。 - 异常检测:
对于新的数据点,通过计算其与超平面的距离,来判断该数据点是否为异常。距离较大的数据点更有可能是异常点。
下图展示了一个使用OneClassSVM进行异常检测随机生成的数据生成训练样本X_train后,创建并训练OneClassSVM模型clf来对生成测试样本X_test预测异常情况的可视化展示,包含绘制训练样本、测试样本和异常边界,展示了异常检测的结果。
三、优缺点
One-Class SVM的优点包括:
- 不需要异常数据进行训练,只需要正常数据即能够有效地识别异常点或者精准地描绘数据的分布边界;
- 对于高维数据和复杂的数据分布具有较好的适应性;
- 可以通过调整模型参数来控制异常点的检测灵敏度;
- 算法简单,易于实现。
然而,One-Class SVM也有一些限制:
- 不适合处理具有多个类别的数据集。
- 在处理高维数据和大规模数据时,计算复杂度较高。
- 对于类内的数据噪声敏感,噪声太大时可能会过度泛化。
- 对于数据分布不均匀或存在噪声的情况,效果可能不理想。
- 不提供关于支持向量的解释信息,难以理解模型决策过程。
四、应用场景
One_Class SVM在异常检测领域有广泛的应用:
-
网络安全
检测网络中的异常行为,如入侵检测。它可以识别与正常网络流量不同的异常流量模式,从而提高网络安全性。 -
金融欺诈检测
检测信用卡欺诈、异常交易和洗钱行为。它可以识别与正常交易模式不符的异常交易。 -
工业制造
监测工业制造中的设备异常和故障。它可以帮助预测设备可能出现的问题,从而减少停机时间和维修成本。 -
医疗诊断
检测医疗图像中的异常,如肿瘤、病变和异常组织。它有助于提高医学诊断的准确性
五、python实现
首先许哟啊确保安装了scikit-learn库,没有安装的话,可以通过如下指令安装:
pip install scikit-learn
然后通过如下Python代码来实现One-Class SVM的算法测试:
from sklearn import svm
from sklearn.datasets import make_blobs
import numpy as np
# 创建一个数据集
X, _ = make_blobs(n_samples=100, centers=[[0, 0]], cluster_std=0.5)
# 初始化 One-Class SVM 模型
# nu 参数决定了支持向量的数量和训练误差的上限比例
# gamma 是 RBF 内核的系数 (1 / (2 * sigma^2))
clf = svm.OneClassSVM(nu=0.1, kernel="rbf", gamma=0.1)
# 训练模型
clf.fit(X)
# 对新的数据点进行预测
new_data = np.array([[0.5, 0.5], [4.0, 4.0]])
predictions = clf.predict(new_data)
# 输出预测结果
print("Predictions:", predictions)
print("Predicted labels: '1' for normal, '-1' for outliers")
# 查看支持向量
support_vectors = clf.support_vectors_
print("Support vectors:\n", support_vectors)
参考资料
什么是One-Class SVM
One-Class SVM详解
One-Class SVM异常检测