SVM

转自:http://www.cnblogs.com/sbaof/p/4118065.html,部分内容修改过用红色显示

第七章、支持向量机SVM(非线性)

1.逻辑回归支持向量机

代价函数:

用cost1(z)代替,cost0(z)代替,两个函数的图像:


去掉m,用C代替lambda,得支持向量机的算法:

支持向量机的间距(大间隔分类):因为theta' *X>=1而不是0,所以会选择一条离数据最远的一条线,如图:会选择那条黑线


2.支持向量机能实现大间隔分类的原因:

设Ax+By=0表示一条线段,则(A,B)可以表示一条向量,并且和直线垂直。向量相乘可以等化为投影(有正负)乘以向量长度。p(i)表示X(i)在theta上的投影。原式可以转化为如下:

 所以会尽可能让p(i)大,就会实现大间隔分类。


3.核函数kernel:处理更加复杂的非线性问题

对每一个数据做一个等价代换:

 核函数性质:

 的影响:越大越平缓

预测函数:

对于一个问题,

用每个数据集:

支持向量机的核函数求theta的h函数和cost函数:

注意上图中的正则化项在支持向量机中一般用theta' *m*theta(m为数据集个数),目的是提高效率。

4.支持向量机的核函数的偏差和高方差

C较大:低偏差高方差

C较小:高偏差低方差
较大:图像较平缓,高偏差低方差
较小:图像较陡峭,低偏差高方差

 

 5.在octave中使用自带的支持向量机的函数,需要提供一个函数实现(核函数):

在使用高斯函数前,一定要归一化,否则差距太大,可能会忽略掉小的特征值。

6.多分类:一对多,选最大的,和逻辑回归类似。 

7.分类问题的选择

  • 如果特征n相比数据集m较大,则一般不需要非常复杂的边界,用支持向量机的线性核函数(不使用核函数)或逻辑回归来形成一个简单地边界(大约:n=10000,m=10-1000)

  •  相反如果数据集较多,则想要一个较为复杂曲线的边界,用前面提到的支持向量机的高斯核函数(大约:n=1-1000,m=10-10000)

  • 当m太大时,高斯核函数运行会很慢,一般会手动增加特征,并用线性核函数(不使用核函数)或逻辑回归来处理(m=50000+)
  • 神经网络求解也很慢,优化的SVM会比它快,并且存在局部最优解而非整体最优解,能处理非常复杂的问题。

 

 

代码段1:支持向量机的线性核函数和高斯核函数(不是自己写的)mlclass-ex6-007

1.线性核函数

function sim = linearKernel(x1, x2)
    x1 = x1(:); x2 = x2(:);
    sim = x1' * x2; %线性核函数就是直接求内积  

end

2.高斯核函数

复制代码
function sim = gaussianKernel(x1, x2, sigma)
    x1 = x1(:); x2 = x2(:);
    sim = 0;
    x = x1-x2;
    sim = exp(-(x' * x)/(2*sigma*sigma + eps) ); %分母加上eps,避免sigma为0是分母为0
 
end
复制代码

3.高斯核函数选取和C

复制代码
function [C, sigma] = dataset3Params(X, y, Xval, yval)
    C = 1;
    sigma = 0.3;    
    table = [0.01, 0.03, 0.1, 0.3, 1, 3, 10, 30];
    for i = 1:8;
	for j = 1:8;
	%model = svmTrain(X, y, C, @(x1, x2) gaussianKernel(x1, x2, sigma));
	model = svmTrain(X, y, table(i), @(x1, x2) gaussianKernel(x1, x2, table(j)));
	predictions = svmPredict(model, Xval);
	error(i,j) = mean(double(predictions ~= yval));
	end
    end
    [error_min index] = min(error(:));%index是按列计数的
    sigma = table(1 + floor((index-1) / 8));
    C = table(1 + mod(index-1, 8));
end
复制代码

4.svmTrain,visualizeBoundaryLinear,visualizeBoundary,svmPredict(自带)

  View Code
  View Code
  View Code
  View Code

5.整体代码

复制代码
clear ; close all; clc
load('ex6data1.mat');

% Plot training data
%plotData(X, y);

%C = 10;
%model = svmTrain(X, y, C, @linearKernel, 1e-3, 20);
%visualizeBoundaryLinear(X, y, model);

x1 = [1 2 1]; x2 = [0 4 -1]; sigma = 2;
sim = gaussianKernel(x1, x2, sigma);

clear ; close all; clc
load('ex6data2.mat');
%plotData(X, y);

C = 1; sigma = 0.1;

%model= svmTrain(X, y, C, @(x1, x2) gaussianKernel(x1, x2, sigma)); 
%visualizeBoundary(X, y, model);

clear ; close all; clc
load('ex6data3.mat');
%plotData(X, y);
[C, sigma] = dataset3Params(X, y, Xval, yval);

model= svmTrain(X, y, C, @(x1, x2) gaussianKernel(x1, x2, sigma)); 
visualizeBoundary(X, y, model);
复制代码

 

代码段2:垃圾邮件分类  mlclass-ex6-007

字符串处理:将邮件进行预处理,只保留单词。

选择出现频率最高的单词,然后形成向量。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值