登录
首页精彩阅读在MATLAB中进行基于SVM的数据分析
在MATLAB中进行基于SVM的数据分析
2017-03-20
收藏

在MATLAB中进行基于SVM的数据分析

MATLAB除了可以被用来进行信号处理之外,还可以用来完成一些数据挖掘任务。而说到数据挖掘,你脑海里一定会闪现过许多熟悉的算法,例如决策树朴素贝叶斯逻辑回归,以及支持向量机SVM)等等。下面我们就以SVM为例来看看利用MATLAB进行数据挖掘是一种怎样的体验。

MATLAB中用来进行基于SVM数据挖掘的核心函数是 svmclassify() 和 svmtrain()。从函数名就能很容易地看出来,后者是用来进行模型训练的,而前者则是用后者训练出来的模型来对数据进行分类。首先我们来看看线性可分的情况,后续我们还会讨论更复杂的线性不可分的例子。

这里所使用的数据是费希尔的鸢尾花数据,我们首先导入数据(数据一共有150行,取前2/3作为训练数据,对应的类别是setosa和versicolor)
[plain] view plain copy
>> load fisheriris  
>> xdata = meas(1:100,3:4);  
>> group = species(1:100);  

函数 svmtrain()的调用格式如下:
SVMStruct = svmtrain(Training,Group,Name,Value)
其中Training是feature向量,Group表示分属之类别。Name和Value是可选参数(也就是可以不写),而且必须成对使用,其中Name表示参数名,而Value则对应相应的参数取值。由于Name-Value的可取参数对非常之多,我们这里不一一列举(有需要的读者可以参阅MATLAB的帮助文档以了解更多),仅仅给出两个例子:比如,如果把Name置为'showplot',就可以通过紧跟其后的Value取值来控制是否将训练模型绘制成图,默认是'False',表示不会图。另外一个有用的参数是'kernel_function',如果你对SVM算法比较了解的话应该知道,核函数主要是通过空间转换来将原本线性不可分的数据,转换到另外一个线性可分的空间上,后续我们还会给出具体例子。
下面的代码就可以训练得到一个分类模型:
[plain] view plain copy
>> svmStruct = svmtrain(xdata,group,'ShowPlot',true);  

上述代码的执行结果如下图所示(注意因为我们为参数'showplot'赋值为True,所以系统会绘制出图):

下面我们用svmclassify() 来测试一下模型的分类能力:
[plain] view plain copy
<span style="font-size:18px;">>> testdata = [4 1.5;1.8 0.38];  
>> species = svmclassify(svmStruct,testdata,'ShowPlot',true)  
 
species =   
 
    'versicolor'  
    'setosa'</span>  

如果觉得文字表述的结果不够形象,还可以用图形来表示:
[plain] view plain copy
<span style="font-size:18px;">>> hold on;  
>> plot(testdata(:,1),testdata(:,2),'ro','MarkerSize',12);  
>> hold off</span>  

上述代码的执行结果如图所示(其中被圆周圈起来的就是我们引入的测试数据):

如果数据是线性不可分的,SVM是否能够应对呢?来看下面的例子,首先,我们生成两组数据data1和data2
[plain] view plain copy
>> rng(1); % For reproducibility  
r = sqrt(rand(100,1)); % Radius  
t = 2*pi*rand(100,1);  % Angle  
data1 = [r.*cos(t), r.*sin(t)]; % Points  
>> r2 = sqrt(3*rand(100,1)+1); % Radius  
t2 = 2*pi*rand(100,1);      % Angle  
data2 = [r2.*cos(t2), r2.*sin(t2)]; % points  

data1和data2是线性不可分的。用图形来表示或许更加一目了然,所以我们来绘图:
[plain] view plain copy
>> figure;  
plot(data1(:,1),data1(:,2),'r.','MarkerSize',15)  
hold on  
plot(data2(:,1),data2(:,2),'b.','MarkerSize',15)  
ezpolar(@(x)1);ezpolar(@(x)2);  
axis equal  
hold off  

上述代码的执行结果如下:

然后我们把两组数据组织到一起,并加上分类标签‘+1’和‘-1’。
[plain] view plain copy
>> data3 = [data1;data2];  
theclass = ones(200,1);  
theclass(1:100) = -1;  

然后分别用高斯核函数与多项式核函数来进行空间转换,并在此基础上进行基于SVM的分类:
[plain] view plain copy
>> svmModel = svmtrain(data3, theclass, 'kernel_function','rbf','ShowPlot',true);  
>> svmModel = svmtrain(data3, theclass, 'kernel_function','polynomial','ShowPlot',true);  
 
下图基于高斯核函数的SVM分类结果:

下图基于多项式核函数的SVM分类结果:

可见原本不可分的数据,现在已经被成功分类了。

数据分析咨询请扫描二维码

客服在线
立即咨询