MATLAB中Libsvm的安装与测试


Libsvm 是台湾大学 Chih-Chung Chang 及 Chih-Jen Lin 所写的一个支持向量机(SVM)库,可用于分类问题。
官网链接: https://www.csie.ntu.edu.tw/~cjlin/libsvm/.

SVM原理

设样本集 D = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x m , y m ) } D=\{(\mathbf{x_1},y_1),(\mathbf{x_2},y_2),...,(\mathbf{x_m},y_m)\} D={ (x1,y1),(x2,y2),...,(xm,ym)}, y i = − 1 , 1 y_i=-1,1 yi=1,1. 需要找到一个超平面将两类样本分开(先假设可以完全分开),其方程为:
w T x + b = 0 \mathbf{w^Tx}+\mathbf{b}=0 wTx+b=0
由于w,b可以等比例变化而超平面保持不变,可假定对离超平面最近的样本点(即支持向量),有 y i ( w T x i + b ) = 1 y_i(\mathbf{w^Tx_i}+\mathbf{b})=1 yi(wTxi+b)=1。这一假定避免最优的的一组(w,b)等比变化且直观上将两类样本对称分割。
支持向量机即寻找使得两个异类支持向量到超平面的距离之和 γ = 2 / ∥ w ∥ \gamma=2/\|\mathbf{w}\| γ=2/w最大的参数(距离计算参考解析几何教材),于是化为如下问题:
m i n w , b ∥ w ∥ 2 , s . t . y i ( w T x i + b ) ≥ 1 min_{\mathbf{w,b}} \quad \|\mathbf{w}\|^2,\\\quad\\s.t. \quad y_i(\mathbf{w^Tx_i}+\mathbf{b})\geq1 minw,bw2,s.t.yi(wTxi+b)1

大部分情况下,无法保证两类样本可以使用超平面完全分割,于是引入特征空间和松弛变量:
m i n w , b , θ i 1 2 ∥ w ∥ 2 + C ∑ i θ i s . t . y i ( w T ϕ ( x i ) + b ) ≥ 1 − θ i , θ i ≥ 0 min_{\mathbf{w,b},\theta_i}\quad \frac{1}{2}\|\mathbf{w}\|^2+C\sum_i\theta_i\\ s.t.\quad y_i(\mathbf{w^T\phi(x_i)}+\mathbf{b})\geq1-\theta_i,\theta_i\geq0 minw,b,θi21w2+Ciθis.t.yi(wTϕ(xi)+b)1θi,θi0
其中 ϕ \phi ϕ用于将 x \mathbf{x} x映射至高维特征空间,映射后,原来线性不可分的样本可能变为线性可分。其内积称为核函数,通常可采用RBF核,即 K ( x i , x j ) = ϕ T ( x i ) ϕ ( x j ) = e − γ ∥ x i − x j ∥ 2 . K(\mathbf{x}_i,\mathbf{x}_j)=\phi^T(\mathbf{x}_i)\phi(\mathbf{x}_j)=e^{-\gamma\|\mathbf{x}_i-\mathbf{x}_j\|^2}. K(xi,xj)=ϕT(xi)ϕ(xj)=eγxixj2.
松弛变量 θ i \theta_i θi使得支持向量机可以在某些样本上出错。
(参考周志华《机器学习》)

安装

首先需测试电脑里是否已安装minGW. MATLAB 命令行下输入

mex -setup

若出错提示缺少编译器,则按提示安装即可。
之后进入官网下载libsvm压缩包,解压后发现有matlab\java\python 等多个文件夹。由于我们使用matlab,将windows文件夹复制到matlab文件夹里。
此时我们可以发现,里面都是*.c, .h 文件,只有一个make.m,就是用于生成.mex文件。但我直接运行 make.m出错,上网查找,将其修改为:

%meke.m
mex  libsvmread.c
mex  libsvmwrite.c
mex  -largeArrayDims svmtrain.c ../svm.cpp svm_model_matlab.c
mex  -largeArrayDims svmpredict.c ../svm.cpp svm_model_matlab.c

运行,生成四个*.mex文件.
之后,在MATLAB 主页》预设路径下添加文件夹:
C:\Users\Lenovo\Desktop\libsvm\libsvm-3.24\matlab
C:\Users\Lenovo\Desktop\libsvm\libsvm-3.24\matlab\windows

测试

设样本包含两个属性,取值为 [ 0 , 1 ] [0,1] [0,1], 若其值的差别低于0.5,归为同类(y=1),若小于 0.5 0.5 0.5,归为异类(y=-1),且在训练集中加入一些错误分类的样本。这一样本集在二维面上是线性不可分的,测试libsvm的分类效果,代码如下:

train_data=rand(5000,2);
train_label=is_same(train_data,0.1); 

test_data=rand(200,2);
test_label=is_same(test_data,0);
model=svmtrain(train_label,train_data);
pred=svmpredict(test_label,test_data,model);

%判断向量每一行两个数是否差值低于0.3,是返回1,否返回-1
%加入噪声引入误判(用于训练集)
function f=is_same(x,noise)
temp=abs(x(:,1)-x(:,2))+noise*(rand(size(x,1),1)-0.5);
f=2*(temp<0.3)-1;
end

运行后显示准确率为 96.5%(注意svmpredict函数中输入了test_label,但这只用于计算准确率,换为其它维度相同的向量不影响分类结果)。
分类结果如图:
在这里插入图片描
绘图代码:

t_1=test_data((pred==1),:);
t_2=test_data((pred==-1),:);
plot(t_1(:,1),t_1(:,2),'o',t_2(:,1),t_2(:,2),'*')
legend('same','different')
hold on
fplot(@(x)(x+0.3))
fplot(@(x)(x-0.3))
axis([0,1,0,1])

猜你喜欢

转载自blog.csdn.net/certate/article/details/108934708