转自: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(自带)
![](https://i-blog.csdnimg.cn/blog_migrate/cdec0645add3fc3c328197dda5c76203.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/cdec0645add3fc3c328197dda5c76203.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/cdec0645add3fc3c328197dda5c76203.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/cdec0645add3fc3c328197dda5c76203.gif)
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
字符串处理:将邮件进行预处理,只保留单词。
选择出现频率最高的单词,然后形成向量。