one class SVM

背景:通常一类问题出现在需要对训练样本进行一定比例的筛选,或者已知的训练样本都是正样本,而负样本却很少的情况。

这种情况下,往往需要训练一个对于训练样本紧凑的分类边界,就可以通过负样本实验。一个简单的实际例子是:一个工厂对于产品的合格性进行检查时,往往所知道是合格产品的参数,而不合格的产品的参数要么空间比较大,要么知道的很少。这种情况下就可以通过已知的合格产品参数来训练一个一类分类器,得到一个紧凑的分类边界,超出这个边界就认为是不合格产品。形式化的说明知乎上有个很好的例子:

http://www.zhihu.com/question/22365729

原理:

它求解的模型如下所示:

其中的参数V特别注意,它的值在0-1之间,是一个比例值,它的含义是:你的训练样本中最后被分类为负样本的比例。比如你有100个训练样本,V设为0.1,去学一个one class SVM,然后在学到的SVM上测试你之前用的训练集,最后可以看到有10个左右的样本的标签为-1,被分为负样本。下面还会通过实验进行说明。模型的求解等其他理论细节请参考大牛Bernhard
Scholkopf的文章:Support Vector Method for Novelty Detection

http://papers.nips.cc/paper/1723-support-vector-method-for-novelty-detection.pdf

实验:

libsvm中有关于one class SVM的实现,算法就是根据上面Bernhard Scholkopf的文章。可以用下面代码进行测试:

% Generate training data
r = 20;
fprintf(‘Learning the function x^2 + y^2 < 1\n‘);
[XX,YY] = meshgrid(-1:1/r:1,-1:1/r:1);
X = [XX(:) YY(:)];
Y = 2*(sqrt(X(:,1).^2 + X(:,2).^2) < 1)-1 ;

Pin = find(Y==1);
X1 = X(Pin,:);
Y1 = Y(Pin);

% Plot training data
figure;hold on;
set(gca,‘FontSize‘,16);
for i = 1:length(Y1)
    if(Y1(i) > 0)
        plot(X1(i,1),X1(i,2),‘g.‘);
    else
        plot(X1(i,1),X1(i,2),‘r.‘);
    end
end

% Draw the decision boundary
theta = linspace(0,2*pi,100);
plot(cos(theta),sin(theta),‘k-‘);
xlabel(‘x‘);
ylabel(‘y‘)
title(sprintf(‘Training data (%i points)‘,length(Y)));
axis equal tight; box on;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

通过上面的代码可以构造一个在圆内的训练样本,如下图所有:

这样我们就假设所有圆外的样本为负样本,下面我们就进行one-class SVM训练,可以看到有个参数-n,它就是我们上面提到的V,也就是这些训练样本中包含负样本的比例。

%%train one class SVM with 10% instances to be set as outlier
model = svmtrain(Y1,X1,‘-s 2 -n 0.01‘);
[Y1,Y2,Y3] = svmpredict(Y,X,model);

for i = 1:length(Y)
    if(Y1(i) > 0)
        plot(X(i,1),X(i,2),‘g.‘);
    else
        plot(X(i,1),X(i,2),‘r.‘);
    end
end
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

上面的代码可以得到下面的结果:

其中预测为正的用绿色表示,预测为负的用红色表示。

为了说明参数V的作用,将-n设为0.3后可以得到如下结果:

(黑线圆圈里是我们的训练样本的点)

上面是对负样本的检测效果验证,当一个新样本在圆内时,我们还是希望分类器可以将新样本分为正样本,下面就通过一段代码验证了这个效果:

X21 = rand(100,1);
X22 = 1-X21;
X2 = [X21 X22];
Y2 = ones(100,1);
% X = [X;X2];
% Y = [Y;Y2];
[Y1,Y2,Y3] = svmpredict(Y2,X2,model);

for i = 1:length(Y1)
    if(Y1(i) > 0)
        plot(X2(i,1),X2(i,2),‘g.‘);
    else
        plot(X2(i,1),X2(i,2),‘r.‘);
    end
end
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

上面的代码得到的效果如下图:

可以看到这些新样本的标签都分对了(n设为0.01的情况),另外,由于新样本(x1,y1)满足x1+y1=1所以显示在一条直线上。

时间: 2024-12-06 10:24:35

one class SVM的相关文章

汽车检测SIFT+BOW+SVM

整个执行过程如下:1)获取一个训练数据集. 2)创建BOW训练器并获得视觉词汇. 3)采用词汇训练SVM. 4)尝试对测试图像的图像金字塔采用滑动宽口进行检测. 5)对重叠的矩形使用非极大抑制. 6)输出结果. 该项目的结构如下: |-----car_detector|       |--detector.py| |--__init__.py| |--non_maximum.py| |--pyramid.py| |--sliding_window.py|-----car_sliding_wind

SVM与LR的比较

两种方法都是常见的分类算法,从目标函数来看,区别在于逻辑回归采用的是logistical loss,svm采用的是hinge loss.这两个损失函数的目的都是增加对分类影响较大的数据点的权重,减少与分类关系较小的数据点的权重.SVM的处理方法是只考虑support vectors,也就是和分类最相关的少数点,去学习分类器.而逻辑回归通过非线性映射,大大减小了离分类平面较远的点的权重,相对提升了与分类最相关的数据点的权重.两者的根本目的都是一样的.此外,根据需要,两个方法都可以增加不同的正则化项

在opencv3中利用SVM进行图像目标检测和分类

采用鼠标事件,手动选择样本点,包括目标样本和背景样本.组成训练数据进行训练 1.主函数 #include "stdafx.h" #include "opencv2/opencv.hpp" using namespace cv; using namespace cv::ml; Mat img,image; Mat targetData, backData; bool flag = true; string wdname = "image"; voi

SVM整理

SVM整理 Last modified: 2015.9.2 1.算法总结 支持向量机是Cortes和Vapnik于1995年首先提出的,它在解决小样本,非线性及高维模式识别中表现出许多特有的优势,并能够推广应用到函数拟合等其他机器学习问题中. SVM方法是建立在统计学习理论的VC维理论和结构风险最小原理基础上的,根据有限的样本信息在模型的复杂性(即对特定训练样本的学习精度)和学习能力(即无错误地识别任意样本的能力)之间寻求最佳折衷,以期获得最好的推广能力(或称泛化能力).   1.1进一步小结

支持向量机(SVM)算法

支持向量机(support vector machine)是一种分类算法,通过寻求结构化风险最小来提高学习机泛化能力,实现经验风险和置信范围的最小化,从而达到在统计样本量较少的情况下,亦能获得良好统计规律的目的.通俗来讲,它是一种二类分类模型,其基本模型定义为特征空间上的间隔最大的线性分类器,即支持向量机的学习策略便是间隔最大化,最终可转化为一个凸二次规划问题的求解. 具体原理: 1. 在n维空间中找到一个分类超平面,将空间上的点分类.如下图是线性分类的例子. 2. 一般而言,一个点距离超平面的

SVM支持向量机-拉格朗日,对偶算法的初解

许多地方得SVM讲得都很晦涩,不容易理解,最近看到一篇不错的博文写得很好,同时加上自己的理解,重新梳理一下知识要点 http://blog.csdn.net/zouxy09/article/details/17291543 一.引入 SVM是个分类器.我们知道,分类的目的是学会一个分类函数或分类模型(或者叫做分类器),该模型能把数据库中的数据项映射到给定类别中的某一个,从而可以用于预测未知类别. 对于用于分类的支持向量机,它是个二分类的分类模型.也就是说,给定一个包含正例和反例(正样本点和负样本

监督算法大比拼之BP、SVM、adaboost非线性多分类实验

写在之前: 前些文章曾经细数过从决策树.贝叶斯算法等一些简单的算法到神经网络(BP).支持向量机(SVM).adaboost等一些较为复杂的机器学习算法(对其中感兴趣的朋友可以往前的博客看看),各种算法各有优缺点,基本上都能处理线性与非线性样本集,然通观这些算法来看,个人感觉对于数据(无论线性还是非线性)的分类上来说,里面比较好的当数BP.SVM.adaboost元算法这三种了,由于前面在介绍相应算法原理以及实验的时候所用的样本以及分类情况都是二分类的,对于多分类的情况未曾涉及过,而实际情况往往

支持向量机 人脸识别(SVM)SKLearn

#!/usr/bin/env python # -*- coding: utf-8 -*- import numpy as np import pylab as pl from sklearn import svm # we create 40 separable points np.random.seed(0)#每次运行结果不变 X = np.r_[np.random.randn(20, 2) - [2, 2], np.random.randn(20, 2) + [2, 2]] #randn2

SVM学习笔记-线性支撑向量机

最大间隔超平面 线性分类器回顾 当数据是线性可分的时候,PLA算法可以帮助我们找到能够正确划分数据的超平面hyperplane,如图所示的那条线. 哪一条线是最好的? 对于PLA算法来说,最终得到哪一条线是不一定的,取决于算法scan数据的过程. 从VC bound的角度来说,上述三条线的复杂度是一样的  Eout(w)≤Ein0+Ω(H)dvc=d+1 直观来看,最右边的线是比较好的hyperplane. 为什么最右边的分隔面最好? 对于测量误差的容忍度是最好的.例如对于每

基于支持向量机SVM的人脸识别

一.线性SVM 1. 背景: 1.1 最早是由 Vladimir N. Vapnik 和 Alexey Ya. Chervonenkis 在1963年提出 1.2 目前的版本(soft margin)是由Corinna Cortes 和 Vapnik在1993年提出,并在1995年发表 1.3 深度学习(2012)出现之前,SVM被认为机器学习中近十几年来最成功,表现最好的算法 2. 机器学习的一般框架: 训练集 => 提取特征向量 => 结合一定的算法(分类器:比如决策树,KNN)=>