通常一类问题出现在需要对训练样本进行一定比例的筛选,或者已知的训练样本都是正样本,而负样本却很少的情况。
这种情况下,往往需要训练一个对于训练样本紧凑的分类边界,就可以通过负样本实验。一个简单的实际例子是:一个工厂对于产品的合格性进行检查时,往往所知道是合格产品的参数,而不合格的产品的参数要么空间比较大,要么知道的很少。这种情况下就可以通过已知的合格产品参数来训练一个一类分类器,得到一个紧凑的分类边界,超出这个边界就认为是不合格产品。
%% 加载“鸢尾花”数据集
% 删除花瓣的长度和宽度
% 将所有的鸢尾花视为同一类
load fisheriris
X = meas(:,1:2);
y = ones(size(X,1),1);
%% 使用处理后的数据集训练SVM分类器
% 假设5%的观测值是异常值
rng(1);
SVMModel = fitcsvm(X,y,'KernelScale','auto','Standardize',true,...
'OutlierFraction',0.05);
% SVMModel模型是一个训练好的分类器
% 默认情况下,软件使用高斯内核的一类学习
%% 绘制观测和检测边界,标记支持向量和可能离群值
svInd = SVMModel.IsSupportVector;
h = 0.02; % 网格步长
[X1,X2] = meshgrid(min(X(:,1)):h:max(X(:,1)),...
min(X(:,2)):h:max(X(:,2)));
[~,score] = predict(SVMModel,[X1(:),X2(:)]);
scoreGrid = reshape(score,size(X1,1),size(X2,2));
figure
plot(X(:,1),X(:,2),'k.')
hold on
plot(X(svInd,1),X(svInd,2),'ro','MarkerSize',10)
contour(X1,X2,scoreGrid)
colorbar;
title('{\bf Iris Outlier Detection via One-Class SVM}')
xlabel('Sepal Length (cm)')
ylabel('Sepal Width (cm)')
legend('Observation','Support Vector')
hold off