SVM是一种广泛使用的分类器,通常用于二分类或多分类问题。然而,在异常点检测的场景中,我们通常会将数据视为一个类别(即正常数据点),并尝试找到那些与正常数据点显著不同的点(即异常点)。这可以通过One-Class SVM(单类支持向量机)来实现。
One-Class SVM的原理是寻找一个超平面,使得正常数据点尽可能地分布在这个超平面的一侧,同时使得超平面与原点(或指定的其他点)之间的距离最大化。这样,那些位于超平面另一侧或远离超平面的点就可以被视为异常点。
具体来说,One-Class SVM会学习一个决策函数,该函数将正常数据点的特征空间映射到一个高维空间中,并在这个高维空间中寻找一个最优超平面。这个超平面会尽可能地将正常数据点与原点分开,同时使得超平面与原点之间的距离最大化。在训练过程中,One-Class SVM会利用核函数(如RBF核、线性核等)将数据映射到高维空间,并在这个空间中寻找最优超平面。
实现步骤
- 数据准备:首先,收集并整理好一定量的数据样本,包括各个特征的变量数据。这些数据应该主要是正常数据点,因为我们的目标是找出与这些正常数据点显著不同的异常点。
- 数据预处理:对数据进行必要的预处理,如标准化、归一化、降维等。这些步骤可以帮助提高SVM模型的性能,并减少过拟合的风险。
- 选择核函数:根据数据的特点和问题的需求,选择一个合适的核函数。常用的核函数包括RBF核、线性核、多项式核等。不同的核函数适用于不同类型的数据和问题。
- 训练One-Class SVM模型:使用训练数据来训练One-Class SVM模型。在训练过程中,模型会学习一个决策函数,该函数将正常数据点的特征空间映射到一个高维空间中,并在这个高维空间中寻找一个最优超平面。
- 异常检测:将测试数据输入到训练好的One-Class SVM模型中,得到每个测试数据点的决策函数值。根据这些值的大小,可以判断哪些数据点是异常点。通常,那些决策函数值较小的数据点被认为是异常点。
部分代码
%% 导入数据
load('matlab.mat');
X = res(:,1:6); % 特征数据
n = size(X, 1);
%% 划分训练集和测试集
rng(1); % 设置随机数种子,以确保结果可重现
train_ratio = 1; % 训练集占比
idx = randperm(n);
X_train = X(idx(1:round(train_ratio*n)), :);
%% 数据归一化
[~,ps] = mapminmax(X_train', 0, 1); % 对训练数据进行归一化
X_train_normalized = mapminmax('apply', X_train', ps)'; % 归一化训练数据
%% 创建模型
nu = 0.05; % 设置 OCSVM 参数 nu
效果图