MATLAB的符号计算

所谓符号计算是指在运算时,无须事先对变量赋值,而将所得到结果以标准的符号形式来表示。
例如,在符号变量运算过程中pi就用pi表示,而不是具体的近似数值3.14或3.14159。使用符号变量进行运算能最大限度减少运算过程中因舍入造成的误差。符号变量也便于进行运算过程的演示。

一、符号计算基础

(一) 定义符号变量
参与符号运算的对象可以是符号变量、符号表达式或符号矩阵。符号变量要先定义,后引用。可以用sym函数、syms函数将运算量定义为符号型数据。引用符号运算函数时,用户可以指定函数执行过程中的变量参数;若用户没有指定变量参数,则使用默认的变量作为函数的变量参数。

1、sym函数
sym函数的主要功能是创建符号变量,以便进行符号运算,也可以用于创建符号表达式或符号矩阵。用sym函数创建符号变量的一般格式为:

x = sym(‘x’)

其目的是将’x’创建为符号变量,以x作为输出变量名。每次调用该函数,可以定义一个符号变量。

1
2
3
4
5
6
7
8
9
a=sym(‘a’); %定义‘a’为符号运算量,输出变量名为a
b=sym(‘b’);
x=sym(‘x’);
y=sym(‘y”);  
[x,y]=solve(‘a*x-b*y=1’, ‘a*x+b*y=5’, ‘x’, ‘y’)
                                %以a,b为符号常数,x,y为符号变量
即可得到方程组的解:
x =3/a
y =2/b

(一) 定义符号变量

【例2】已知一复数表达式 z=x+i*y, 试求其共轭复数,并求该表达式与其共轭复数乘积的多项式。
为了使乘积表达式x^2+y^2非负,这里,把变量x和y定义为实数。
x=sym(‘x’,’real’);
y=sym(‘y’,’real’);

z=x+i*y; %定义复数表达式
conj(z); %求共轭复数
expand(z*conj(z)) %求表达式与其共轭复数乘积的
多项式
ans =
x^2+y^2
若要去掉’x’的属性,可以使用下面语句
x = sym(‘x’,’unreal’)
将’x’创建为纯格式的符号变量。

2、syms函数
syms函数的功能与sym函数类似。syms函数可以在一个语句中同时定义多个符号变量,其一般格式为:
syms arg1 arg2 …argN
用于将rg1, arg2,…,argN等符号创建为符号型数据。

(二)默认符号变量
在数学表达式中,一般习惯于使用排在字母表中前面的字母作为变量的系数,而用排在后面的字母表示变量。例如:
f=ax2+bx+c
表达式中的a,b,c通常被认为是常数,用作变量的系数;而将x看作自变量。

例如,数学表达式
f=xn
g=sin(at+b)
根据数学式中表示自变量的习惯,默认a,b,c为符号常数,x为符号变量。
若在MATLAB中表示上述表达式,首先用syms 函数定义a,b,n,t,x为符号对象。在进行导数运算时,由于没有指定符号变量,则系统采用数学习惯来确定表达式中的自变量,默认a,b,c为符号常数,x,t为符号变量。
即 :   对函数f求导为:df/dx
对函数g求导为:dg/dt

(四) 生成符号函数
将表达式中的自变量定义为符号变量后,赋值给符号函数名,即可生成符号函数。例如有一数学表达式:

其用符号表达式生成符号函数fxy的过程为:
syms a b c x y              %定义符号运算量
fxy=(a*x^2+b*y^2)/c^2      %生成符号函数
生成符号函数fxy后,即可用于微积分等符号计算。

1
2
3
4
5
6
7
8
9
【例4】定义一个符号函数 fxy=(a*x2+b*y2)/c2 ,分别求该函数对x、y的导数和对x的积分。
syms a b c x y            %定义符号变量
fxy=(a*x^2+b*y^2)/c^2;  %生成符号函数 
diff(fxy,x)             %符号函数fxy对x求导数
ans =2*a*x/c^2
diff(fxy, y)            %符号函数fxy对y求导数   
ans =2*b*y/c^2
int(fxy, x)             %符号函数fxy对x求积分
ans =1/c^2*(1/3*a*x^3+b*y^2*x)

(五)标准代数运算

很多标准的代数运算可以在符号表达式上执行,函数symadd、symsub、symmul和symdiv为加、减、乘、除两个表达式,sympow将一个表达式上升为另一个表达式的幂次。

f= ‘ 2*x^2+3*x-5 ‘   %  define the symbolic expression
>>f=
2*x^2+3*x-5
>> g= ‘ x^2-x+7 ‘
g=
x^2-x+7

>> symadd(f,g)  %  find an expression for f+g
ans= 3*x^2+2*x+2
>> symsub(f,g)  %  find an expression for f-g
ans= x^2+4*x-12
>> symmul(f,g)  %  find an expression for f*g
ans= (2*x^2+3*x-5)*(x^2-x+7)
>> symdiv(f,g)  %  find an expression for f/g
ans= (2*x^2+3*x-5)/(x^2-x+7)
>> sympow(f, ‘ 3*x ‘ )  %  the same as sym(A)^sym(B)
ans= (2*x^2+3*x-5)^3*x

Matlab之Mupad散点画线并填充斜线阴影

点对数组:( [ x1,y1]…. [xn,yn] ) 做线:

num := 50;
for i from 1 to num do
x(i) := (i*PI)/num;
end_for;
for i from 1 to num do
y(i) := sin(x(i));
z(i) := cos(x(i));
end_for;

// f1 := plot::Line2d([x(i),y(i)],[x(i+1),y(i+1)],Color=RGB::Blue) $ i=1..(num-1) ;
// f2 := plot::Line2d([x(j),z(j)],[x(j+1),z(j+1)],Color=RGB::Red) $ j=1..(num-1) ;
// plot(f1,f2);
f3 := plot::Polygon2d([[x(i),y(i)] $i = 1..(num-1)],Closed = FALSE);
// S1 = plot::Scene2d(f3,Filled = TRUE,FillStyle = Winding);
plot(f3,Filled = TRUE,FillStyle = Winding);

 

使用了plot::Polygon2d 也就是把这些点看做多边形上的部分顶点,然后做多边形。可以通过选项

Closed = TRUE 或者 Closed = FALSE来设置是否要把这个多边形弄成封闭的多边形。

在plot的时候 设置Filled = TRUE来填充,并使用FillStyle来设置填充方式。

上边的那段代码的运行图为:

这种方法的数组画线法明显比上篇文章里面的三种方法都要好,简便而且好看。

对于例如

这样起终点不在同一个水平线上的,如果直接采用上边的填充方法就会出现很恶心的情况,这是因为虽然起终点没有连接在一块,但仍然把他们连在一块来看做多边形的。你懂的,图如下:

那么,处理方法就是,添加两个额外的点,额外的点分别对应始终点的x轴映射点。 如下f4. 为了不让f4显示出来边只用来显示填充,把他的边颜色设置成白色。而边部分另外画,如f5

f4 := plot::Polygon2d([[x(1),0],[x(i),z(i)] $i=1..(num),[x(num),0]],Closed = FALSE,Color=RGB::White);
f5 := plot::Polygon2d([[x(i),z(i)] $i=1..(num)],Closed = FALSE,Color=RGB::Red);

f4, f5效果图:

这正是我们想要的结果!!!

那么把f3 和 f4,f5画在一块,为了区分阴影部分,就要对阴影填充方式进行设置,用Fillpattern参数:

f3,f4,f5的赋值再次写在这里:

f3 := plot::Polygon2d([[x(i),y(i)] $i = 1..(num-1)],Closed = FALSE,Color=RGB::Blue,FillPattern = FDiagonalLines); //设置成反斜线
f4 := plot::Polygon2d([[x(1),0],[x(i),z(i)] $i=1..(num),[x(num),0]],Closed = FALSE,Color=RGB::White);
f5 := plot::Polygon2d([[x(i),z(i)] $i=1..(num)],Closed = FALSE,Color=RGB::Red);
plot(f3,f4,f5,Filled = TRUE,FillStyle = Winding ,Layout = Horizontal);

效果图:

还阔以。 回宿舍了。明天再探讨如何只在两个线之间画线。

继续昨天的讨论,在两线之间画阴影。  大致思想就是,把需要画阴影的部分的两线之间的点连成一个多边形。不解释了,自己看代码和下面的截图:

f3 := plot::Polygon2d([[x(i),y(i)] $i = 1..(num-1)],Closed = FALSE,Color=RGB::Blue,FillPattern = FDiagonalLines); //设置成反斜线
//f4 := plot::Polygon2d([[x(1),0],[x(i),z(i)] $i=1..(num),[x(num),0]],Closed = FALSE,Color=RGB::White);
f5 := plot::Polygon2d([[x(i),z(i)] $i=1..(num)],Closed = FALSE,Color=RGB::Red);
//plot(f3,f4,f5);
f6 := plot::Polygon2d([[x(i),y(i)] $i=20..(30),[x(abs(j-30)),z(abs(j-30))] $j = 0..10],Closed = TRUE,Color = RGB::Green,Filled = TRUE);
plot(f3,f5,f6);

至此,想要画阴影线区域的目的都可以达到了。本课题结束。

matlab之mupad用散点画线方法

matlab的mupad中,使用两个数组进行画线的实现方法:

生成两个散点数组:

num := 50;
for i from 1 to num do
x(i) := (i*PI)/num;
end_for;
for i from 1 to num do
y(i) := sin(x(i));
z(i) := cos(x(i));
end_for;

然后实现 plot(x,y); hold on; plot(x,z);的功能:

plot(plot::Line2d([x(i),y(i)],[x(i+1),y(i+1)]) $ i=1..(num-1),plot::Line2d([x(j),z(j)],[x(j+1),z(j+1)]) $ j=1..(num-1),Color=RGB::Blue);

这样是对 x,y 的每两个相邻点之间都画线段,然后连接起来。x,z也是一样。

效果如图:

如果想要sin线 与 cos线 不同的颜色。则可以使用下述的方法:

f1 := plot::Line2d([x(i),y(i)],[x(i+1),y(i+1)],Color=RGB::Blue) $ i=1..(num-1) ;
f2 := plot::Line2d([x(j),z(j)],[x(j+1),z(j+1)],Color=RGB::Red) $ j=1..(num-1) ;

plot(f1,f2)

画出的图形为:

如果觉得使用 plot::Line2d来对数组画线太过复杂,想要使用直接对数组画线的函数。那么就用:

plot::Listplot 来对数组进行画线。

例子如下:

y2 := array(1..num);
for i from 1 to num do
y2[i] := sin(x(i));
end_for;
plot( plot::Listplot(y2,PointsVisible=FALSE) )

生成散点 y2 ,然后对y2进行画线。 并且设置不显示点。 效果如图:

是的被你发现了。有一个非常难看的框框,旁边还有莫名其妙的几行文字。所以,才有上边的前两种情况。

 

使用Matlab符号工具箱中MuPAD画带阴影的示意图

Wikipedia, MuPad 是一个计算机代数系统。最初由德国帕德博恩大学(University of Paderborn) 的MuPAD研究小组开发而成。之后,由该研究小组,SciFace Software公司和其他大学的合作伙伴共同开发。2008年9月SciFace被Matlab的东家Mathworks收购,因而,MuPad被整合 进Matlab中的符号工具箱。

以上是MuPad的历史,了解这个有两个用处:第一,Matlab2009以后才有这个功能;第二,MuPad中的语法和Matlab的语法是不一样的。

如何打开MuPad

打开Matlab–>单击左下角的Start–>Toolboxes–>Symbolic Math–>MuPAD

然后会出现一个新的窗口:

一个例子

这个例子是我最近写论文时要画得一个示意图。除了阴影部分,其他都可以用Matlab的常规画图命令画出来;而要画阴影部分,则必须用到MuPAD

成果图:

分析一下图片:一个长方形的框、四条线(两条实线、两条虚线)、两条实线中间的阴影部分。

在MuMAD中画图用plot。如果要画多个图,也只需要一个plot命令。比如,plot(sin(x), cos(x), tan(x), cot(x))因此,我们只需要把图片的每个部分定义好,最后再用plot命令即可。

从最简单的长方形开始。画长方形的代码为:plot::Rectangle(0.95..1.05,1..1.1,LineColor=RGB::Black)其中,0.95..1.05定义的是长方形横坐标的范围,1..1.1定义的纵坐标的范围,LineColor=RGB::Black 定义的是边的颜色。

之后,我们说一下虚线的画法。代码为:plot::Function2d(0.98/x,x=0.95 .. 0.98,Line>

最后就是阴影区域。代码为:plot::Hatch(f1,f2,x=0.95 .. 1.01,Fill>

全部代码如下:

p1:=piecewise([x=0.99,1]):
f1:=plot::Function2d(p1,x=0.95 .. 1.01,LineColor=RGB::Black):
f2:=plot::Function2d(1.01/x,x=0.95 .. 1.01,LineColor=RGB::Black):
f3:=plot::Function2d(0.98/x,x=0.95 .. 0.98,LineColor=RGB::Black,LineStyle=Dashed):
f4:=plot::Function2d(1.02/x,x=0.95 .. 1.02,LineColor=RGB::Black,LineStyle=Dashed):
g:=plot(f1,f2,f3,f4,plot::Hatch(f1,f2,x=0.95 .. 1.01,FillColor=RGB::Black),
plot::Rectangle(0.95..1.05,1..1.1,LineColor=RGB::Black)):

说明:

  • 在输入命令时,如果需要换行,按Ctrl+Enter;直接按Enter的话,就输出结果。
  • Matlab中,通过”=”赋值;MuPAD中,通过”:=”赋值。
  • 如果一次要运行多个命令,需用”:”把命令分隔开。

导出图像

右键图片–>Export Graphics…–>Next–>选择Export current image of animation only–>Next–>选择图片格式和文件保存路径–>Export

图片可保存为png, gif, bmp, tiff, jped, wmf, eps, svg, pdf, jvx, jvd. 如果要用于Latex的话,就存成eps格式的矢量图。

matlab中patch函数的用法

patch

创建补片图形对象

句法:

patch(X,Y,C)

patch(X,Y,Z,C)

patch(FV)

patch(…’PropertyName’,propertyvalue…)

patch(‘PropertyName’,propertyvalue,…)

handle = patch(…)

描述:

   patch是个底层的图形函数,用来创建补片图形对象。一个补片对象是由其顶点坐标确定的一个或多个多边形。用户可以指定补片对象的颜色和灯光。

patch(X,Y,C)

   添加已填充的二维补片到当前坐标轴。X和Y中的元素指定了多边形的定点。如果X和Y是矩阵,MATLAB将每一列生成一个多边形。C决定了补片的颜色,它可以是单个的ColorSpec,每个表面一个颜色,或每个定点一个颜色。如果C是1*3的向量,它将被看成是RGB三元组,直接指定颜色。

patch(X,Y,Z,C)

   创建三维坐标下的补片。

patch(FV)

   使用结构体FV来创建补片。FV包含如下的结构域:vertices、faces以及facevertexdata(可选)。这些结构域对应补片对象的Vertices、Faces和FaceVerticxCData属性。

patch(‘PropertyName’,propertyvalue,…)

   利用指定的属性/值参数对来指定补片对象的所有属性。除非用户显式的指定FaceColor和EdgeColor的值,否则,MATLAB会使用缺省的属性值。该调用格式允许用户使用Faces和Vertices属性值来定义补片。

handle=patch(…)

   返回创建的补片对象的句柄。

注意:

   不像fill或area这样的高层创建函数,patch并不检查图形窗口的设置以及坐标轴的NextPlot属性,它仅仅将补片对象添加到当前坐标轴。

   如果坐标数据不能定义封闭的多边形,patch函数自动使多边形封闭。数据能定理凹面或交叉的多边形。然而,如果单个补片面的边缘相互交叉,得到的面可能不会完全填充。在这种情况下,最好将面分解为更小的多边形。

详细说明patch的属性:

   你可以注明这些属性为:属性名字和属性值成对形式、结构矩阵和细胞矩阵。

   其中有两个属性是用来说明颜色的:

   CData:用在说明X、Y、Z坐标时(XData、YData、ZData)

   FaceVertexCData:用在说明顶点或联接矩阵(Vertices和Faces)

   CData和FaceVertexCData属性接受这样的颜色数据:索引值、真彩色(RGB)值。(CData、FaceVertexCData)

  

   索引颜色数据可以表示整个色图的直接索引值或线性映射到整个色图的刻度值(caxis)。CDataMapping 决定了matlab如何翻译索引颜色数据。
matlab中patch函数的用法鈥斺攅mily

颜色数据说明:

patch的颜色说明如下:

   所有面用同一个颜色;

   一个面一个颜色,即平面着色;

   一个顶点一个颜色,即插值着色;

  

   下面的表格说明了matlab如何解释由CData、FaceVertexCData定义的颜色数据。

   [X,Y,Z]                    CData  

                    索引值            真彩色                  

     m*n             标量              1*1*3        所有面用同一个颜色,边缘用同一个颜色

     m*n            1*n(n>=4)        1*n*3        一个面一个颜色,边缘用一个颜色
     m*n              m*n             m*(n-3)     一个顶点一个颜色,面可以是平滑的一个颜色的或插值的,边缘也可以是平滑的或插值的。

    顶点         面             FaceVertexCData

                            索引值          真彩色

    m*n          k*3         标量            1*3

    m*n          k*3          k*1            k*3               同上

    m*n          k*3          m*1            m*3

举例:

   该例中使用两种不同的方法来创建一个补片对象:

   指定x、y和z坐标以及颜色数据(XData、YData和ZData以及CData属性)

   指定顶点,连接矩阵以及颜色矩阵(Vertices、Faces、FaceVertexCData以及FaceColor属性)

   1、指定x、y和z坐标

   x=[0 0;0 1;1 1];

   y=[1 1;2 2;2 1];

   z=[1 1;1 1;1 1];

   tcolor(1,1,1:3)=[1 1 1];

   tcolor(1,2,1:3)=[.7 .7 .7];

   patch(x,y,z,tcolor)

matlab中patch函数的用法鈥斺攅mily
   注意每个面和其他面之间共用两个顶点。

   2、指定定点和表面

   Vertices属性包含定义补片的每一个定点的坐标,Faces属性确定如何连接这些顶点来组成不判的每一个表面。在本例中,两个顶点位于同一个位置,因此需要指定六个顶点。每一样包含定点的x、y和z坐标。
   vert=[0 1 1;0 2 1;1 2 1;1 1 1];

   有两个表面,按照指定的顺序连接定点而成:

   fac=[1 2 3;1 3 4];

   指定表面的颜色,指定包含两个RGB颜色的2*3的矩阵;

   tcolor=[1 1 1;.7 .7 .7];

   用户必须设置FaceColor属性为flat,通过指定Faces、Vertices、FaceVertexCData以及FaceColor属性来创建

   补片对象:

   patch(’Faces’,fac,’Vertices’,vert,’FaceVertexCData’,tcolor,’FaceColor’,’flat’)

   结果如上图所示。

matlab中patch函数的用法鈥斺攅mily

。。。。。。

  

 

图像处理函数详解——imdilate

功能:对图像实现膨胀操作。

用法:IM2 = imdilate(IM,SE)
IM2 = imdilate(IM,NHOOD)
IM2 = imdilate(IM,SE,PACKOPT)
IM2 = imdilate(…,PADOPT)
IM2 = imdilate(IM,SE) 膨胀灰度,二值,压缩二值图像IM,返回IM2。参数SE为由strel函数返回的结构元素或者结构元素对象组。
IM2 = imdilate(IM,NHOOD)膨胀图像IM,这里NHOOD是定义结构元素邻域0和1的矩阵。
IM2 = imdilate(IM,SE,PACKOPT)定义IM是否是一个压缩的二值图像。
IM2 = imdilate(…,PADOPT)指出输出图像的大小。

例子:
I = imread(‘cameraman.tif’);
se = strel(‘ball’,5,5);
I2 = imdilate(I,se);
imshow(I), title(‘Original’)

figure, imshow(I2), title(‘Dilated’)

Matlab 把数字产生001、00n这样的字符串 | num2str用法 |sprintf用法 |int2str用法

Matlab 把数字产生001、00n这样的字符串 | num2str用法 |sprintf用法 |int2str用法

Matlab把数字转变成str,可以用num2str, sprintf, int2str等

如果想要在转变的时候控制精度,可以在num2str的第二个参数设置format. sprintf 的第一个参数设置format
sprintf:


sprintf

Format data into string
Syntax

str = sprintf(format, A, ...)
[str, errmsg] = sprintf(format, A, ...)
Description

str = sprintf(format, A, ...) applies the format to all elements of array A and any additional array arguments in column order, and returns the results to string str.

[str, errmsg] = sprintf(format, A, ...) returns an error message string when the operation is unsuccessful. Otherwise, errmsg is empty.

num2str:

num2str

Convert number to string
Syntax

str = num2str(A)
str = num2str(A, precision)
str = num2str(A, format)
Description

The num2str function converts numbers to their string representations. This function is useful for labeling and titling plots with numeric values.

str = num2str(A) converts array A into a string representation str. Converted floating-point values have a maximum of four digits of precision, and an exponent if required. For integer values, num2str returns the exact string representation of the value.

str = num2str(A, precision) converts the array A into a string representation str with the maximum number of digits specified by precision.

str = num2str(A, format) converts array A using the supplied format, as described on the fprintf function reference page. By default, num2str displays floating point values using the '%11.4g' format (four significant digits in exponential or fixed-point notation, whichever is shorter).
Remarks

Unlike fprintf, the num2str function trims any leading spaces from a string, even when used with the space character flag. For example, num2str(42.67, '% 10.2f') returns a 1-by-5 character array '42.67'.

num2str(1.33333,’%.3d’) 把整数部分格式化成3位精度 1.33e000
num2str(1.333333,’%.3f’) 把小数部分格式化成3位精度 1.333
num2str(1,’%.3d’) 如果是一个整数没有小数部分,对整数部分格式化为3位精度就变为:001

Matlab 产生随机数 | Matlab随机数函数

Matlab自带函数randperm(n)产生1到n的整数的无重复的随机排列,利用它就可以得到无重复的随机数。

function p = randperm(n);

%RANDPERM Random permutation.

% RANDPERM(n) is a random permutation of the integers from 1 to n.

% For example, RANDPERM(6) might be [2 4 5 6 1 3].

%

% Note that RANDPERM calls RAND and therefore changes RAND’s state. %

% See also PERMUTE. % Copyright 1984-2002 The MathWorks, Inc.

% $Revision: 5.10 $ $Date: 2002/04/09 00:26:14 $

[ignore,p] = sort(rand(1,n));

原理:

1. rand(1, n)产生1行n列的0-1之内的随机数矩阵。

2. sort()把这个矩阵排序,返回的ignore是排序后的序列,p是排序后的序列的各数原来的索引,这个索引肯定是随机的,而且是在1到n间无重复的整数。

附:《Matlab中的几个随机函数》

rand

rand(n):生成0到1之间的n阶随机数方阵

rand(m,n):生成0到1之间的m×n的随机数矩阵

randint

randint(m,n,[1 N]):生成m×n的在1到N之间的随机整数矩阵,其效果与randint(m,n,N+1)相同。

>> randint(3,4,[1 10])

ans =

     5     7     4    10
5     1     2     7
8     7     8     6
>> randint(3,4,11)

ans =

    10     9     6     9
5    10     8     9
10     0     2     6

randperm

randperm(n):产生一个1到n的随机顺序。
>> randperm(10)

ans =

     6     4     8     9     3     5     7    10     2     1

Matlab SVM库函数的使用(libsvm)

在上篇文章中,对于SVM的原理,Matlab中libSVM的时候介绍的都非常的详细。

这篇文章是上篇文章中包含的一个很小很简单的部分。目的是方便以后我自己的查阅~~    ^_^

在以后使用libsvm的时候,不想再细细查阅SVM的理论,libSVM非常详细的使用,只是想要很快的对libsvm上手,用它来很快的做开发,那么这篇文章的目的就在这里。

在matlab中输入svmtrain,确定,给出了详细的说明。

>> svmtrain
Usage: model = svmtrain(training_label_vector, training_instance_matrix, ‘libsvm_options’);
libsvm_options:
-s svm_type : set type of SVM (default 0)
0 — C-SVC
1 — nu-SVC
2 — one-class SVM
3 — epsilon-SVR
4 — nu-SVR
-t kernel_type : set type of kernel function (default 2)
0 — linear: u’*v
1 — polynomial: (gamma*u’*v + coef0)^degree
2 — radial basis function: exp(-gamma*|u-v|^2)
3 — sigmoid: tanh(gamma*u’*v + coef0)
4 — precomputed kernel (kernel values in training_instance_matrix)
-d degree : set degree in kernel function (default 3)
-g gamma : set gamma in kernel function (default 1/num_features)
-r coef0 : set coef0 in kernel function (default 0)
-c cost : set the parameter C of C-SVC, epsilon-SVR, and nu-SVR (default 1)
-n nu : set the parameter nu of nu-SVC, one-class SVM, and nu-SVR (default 0.5)
-p epsilon : set the epsilon in loss function of epsilon-SVR (default 0.1)
-m cachesize : set cache memory size in MB (default 100)
-e epsilon : set tolerance of termination criterion (default 0.001)
-h shrinking : whether to use the shrinking heuristics, 0 or 1 (default 1)
-b probability_estimates : whether to train a SVC or SVR model for probability estimates, 0 or 1 (default 0)
-wi weight : set the parameter C of class i to weight*C, for C-SVC (default 1)
-v n : n-fold cross validation mode
-q : quiet mode (no outputs)

ans =

[]

>> model = svmtrain(training_label_vector, training_instance_matrix, ‘libsvm_options’);

svmtrain有三个参数,一个返回值。

返回的就是由训练得到的,在预测的时候将要用到的svm模型。

三个参数:

1. training_label_vector : 训练的标签向量,也就是一系列的-1,1组成的向量,-1表示训练集中该行放的负例的特征向量,

1表示在训练集中该行存放的是正例的特征向量。     向量是 m*1 维度 ( 假设训练集中一共有m个训练样本  )

2. training_instance_matrix : 训练集的样本的特征向量组成的特征矩阵。m*n维度。 m表示训练集中一共有m个样本。

n表示每一个样本使用一个n维的特征向量来表示。所以,在该特征向量矩阵中,每一行就表示一个样本的特征向量。

training_instance_matrix的顺序应该是和training_label_vector严格的保持一致的。

3. libsvm_options :  这是对建立的svm模型的一些参数的设置的选项。

也可以不写该参数而采用默认值。但是为了分类预测准确的目的一般还是需要填写这个选项的,并且根据对这个选项的调节来实现“svm参数调优”

常用到的参数有:
-s svm_type : set type of SVM (default 0)
0 -- C-SVC
1 -- nu-SVC
2 -- one-class SVM
3 -- epsilon-SVR
4 -- nu-SVR
-t kernel_type : set type of kernel function (default 2)
0 -- linear: u'*v
1 -- polynomial: (gamma*u'*v + coef0)^degree
2 -- radial basis function: exp(-gamma*|u-v|^2)
3 -- sigmoid: tanh(gamma*u'*v + coef0)
4 -- precomputed kernel (kernel values in training_instance_matrix)
-d degree : set degree in kernel function (default 3)
-g gamma : set gamma in kernel function (default 1/num_features)

-v n : n-fold cross validation mode
其中-s用来选定svm的类别,是用作分类器,还是做回归等,  用作分类器的话就设置 -s 0 或者省略,默认为-s 0

-t 用来设置svm的核函数,

-t 0 表示选用线性核函数

-t 1 表示选用多项式核函数

-t 2 表示选用径向基(高斯)核函数

-t  3 表示选用sigmoid核函数

-t 4 表示选用自定义核函数。 这个时候可以自己定义核函数,并且把核函数计算出来的核矩阵传入svmtrain,svmpredict中来进行训练和预测.

-d 用来设置多项式核函数的幂次。 由svmtrain的help文档中,我们就可以很轻易的看出,degree这个变量只有在-t 1多项式核函数的函数式中才出现,故而只有在-t 1 选用多项式核函数的时候-d 这个选项才有意义。 因为多项式核函数也是比较常用的核函数,故而-d选项还是比较常常用到,-d 3表示多项式核函数的幂次为3

-g 用来设置在 多项式函数、径向基核函数、sigmoid核函数中的gammar系数。 默认这个值选用1.

-v 用来设置在交叉验证的时候,fold的次数。

 

具体每一个参数设置为多少合适,往往需要经过参数选优过程之后才会知道。参数选优过程的本质,其实就是试一试啦~~哈哈。就是试一试这个参数正确率多少,变一下,把参数设置成那样,正确率是多少,然后选择一套正确率最高的参数。这样。呵呵。

 

而预测过程使用函数:svmpredict

直接在matlab中输入svmpredict 确定,给出了非常详细易懂的说明:

>> svmpredict
Usage: [predicted_label, accuracy, decision_values/prob_estimates] = svmpredict(testing_label_vector, testing_instance_matrix, model, 'libsvm_options')
Parameters:
model: SVM model structure from svmtrain.
libsvm_options:
-b probability_estimates: whether to predict probability estimates, 0 or 1 (default 0); one-class SVM not supported yet
Returns:
predicted_label: SVM prediction output vector.
accuracy: a vector with accuracy, mean squared error, squared correlation coefficient.
prob_estimates: If selected, probability estimate vector.

ans =

[]

>>

先说svmpredict的四个参数:testing_label_vector,testing_instance_matrix,model,’libsvm_options’

通常使用前三个参数就可以了。这篇文章为了快速入手而写,所以只介绍一下前三个参数,至于第四个参数的使用,查看matlab的help就可以知道了。

1.testing_label_vector,这个参数用于在预测的时候同时得到准确的预测正确率。 如果需要预测的测试集是事先就知道分类结果的,这种情况下往往是用来评测算法的性能或者评测分类器的性能的时候,这时候,这个序列中是对应于第二个参数testing_instance_matrix对应的分类label(-1,1的序列)。 如果不是用于评测算法或者分类器的性能,而是用于实际的预测的场合,那么这个参数的赋值是什么都无所谓的,但是行数应该和第二个参数testing_instance_matrix保持一致。

2.testing_instance_matrix:测试样本矩阵。其实就是测试样本的特征向量组成的矩阵。m*n维。表示m个样本,每一个样本表示成一个n维矩阵。矩阵的每一行表示的就是一个样本的特征向量。

3.model:进行预测时使用的svm model。这个model无疑是使用前面的函数svmtrain得到的。

svmpredict有三个返回值:

[predicted_label, accuracy, decision_values/prob_estimates]

1.predicted_label :返回一个-1,1的序列,该序列的行数与输入参数testing_instance_matrix的行数相同,每一行为1或者-1.表示的svm预测的改行对应的样本的分类结果,属于正类1,或者负类-1.

2.accuracy: 当输入的第一个参数testing_label_vector是先验的测试样本的正确分类的时候,这个返回值accuracy就是svm在这次预测中的正确率。

3.decision_values:我们知道svm分类过程本质是一个函数取优的过程,效果就是使得两个类别距离分类平面之间的margin最大化。

svm本质是优化问题

那么这个 decision_values 是一个m*1的向量,也就是行数与输入的测试样本数目相同。每一行的值对应的也就是这个测试样本在上边的这个优化函数中的目标函数的值了。从Predicted_label我们得到了每一个测试样本的分类结果(其实分类依据就是这个目标函数的值咯…),但是只有predict_labels我们不知道那个测试样本判别的有把握,哪些判别的不大有把握,也就是置信度的问题。 decision_values就给出了置信度。【应该decision_values和优化函数的目标函数不完全相同,希望读者能够斧正,并留言讨论。谢谢】

一切都是关于 SVM !

这篇文章是我之前在我的百度博客总结的svm的一些原理和libsvm的使用的资料。现在转移到这个博客来。方便自己的查阅。

 

SVM原理 入门(1-10):

(1-3)简介+线性分类器     http://www.blogjava.net/zhenandaci/archive/2009/02/13/254519.html

(4) 线性分类器的求解        http://www.blogjava.net/zhenandaci/archive/2009/02/13/254578.html

(5) 线性分类器的求解        http://www.blogjava.net/zhenandaci/archive/2009/02/14/254630.html

(6) 线性分类器的求解       http://www.blogjava.net/zhenandaci/archive/2009/03/01/257237.html

(7) 为何需要核函数          http://www.blogjava.net/zhenandaci/archive/2009/03/06/258288.html

(8) 松弛变量                    http://www.blogjava.net/zhenandaci/archive/2009/03/15/259786.html

(9) 松弛变量                    http://www.blogjava.net/zhenandaci/archive/2009/03/17/260315.html

(10)将SVM用于多分类    http://www.blogjava.net/zhenandaci/archive/2009/03/26/262113.html

 

libsvm简易入门:中英双语

http://ntu.csie.org/~piaip/svm/svm_tutorial.html#svmtoy

只讲解了最简单最简单的怎么能运行的起来libsvm而已。没有如何调节参数,如何做回归,如何svm的参数寻优,如何自定义核函数等等。

 

比较详细的libsvm或者libsvm-mat的使用教程:

http://www.matlabsky.com/forum-viewthread-tid-10966-fromuid-18677.html

 

关于SVM的那点破事


简易目录:

写在前面的碎碎念;
Libsvm下载;
SVM入门;
Libsvm安装与使用(待完善);
SVM相关文献资料;
SVM相关书籍推荐;
SVM[Libsvm]相关应用(待完善);
SVM相关杂帖(待完善);
写在最后的闲扯淡;
Faruto的联系方式(讨论MATLAB相关问题或者具体一些SVM相关问题或者再具体一些libsvm使用相关问题或者再再具体一些 … …);

===================无聊的分隔线=========================

写在前面的碎碎念 by faruto

还记得初次接触SVM是本科大三的时候参加北师本科科研基金在管理学院系统科学那边做一个有关脑电波EEG模式识别的项目,那时候对于“机器学习” 这个概念还是头一次染指,后来使用libsvm工具箱来做分类和回归,在用的过程中来学习SVM底层的统计学习理论,再后来自己完善提升libsvm的 matlab版本,在林智仁先生的libsvm-mat基础上自己编写了一些辅助函数(参数寻优什么的),后来不断完善,最终自己的libsvm-mat 版本是libsvm-mat-2.89-3[FarutoUltimate3.0],方便自己使用以及论坛的一些朋友使用。
SVM的实现工具箱有很多,但我还是认为libsvm最好用(lssvm也不错的说),我认为把这一个SVM的实现工具箱研究的透彻就够了,反正我 是够用了,即如果现在需要SVM这个工具来进行分类或者回归我可以拿来libsvm-mat-2.89-3[FarutoUltimate3.0]就能熟 练使用以达到解决自己的问题的目的,而不用再重新学习掌握SVM这个工具。
其实还有一些话要说,姑且先留着吧 … …

====================
MATLAB技术论坛电子期刊第九期(2011.06)[faruto帖子集锦]
http://www.matlabsky.com/thread-17223-1-1.html
====================
《Learn SVM Step by Step 》系列视频应用篇

Libsvm的下载、安装和使用
http://www.matlabsky.com/thread-18080-1-1.html

Libsvm参数实例详解
http://www.matlabsky.com/thread-18457-1-1.html

一个实例搞定libsvm分类
http://www.matlabsky.com/thread-18521-1-1.html

一个实例搞定libsvm回归
http://www.matlabsky.com/thread-18552-1-1.html

Libsvm下载

Libsvm-mat林智仁先生的原始版本下载

libsvm官方更新[2011.04.01]:libsvm-3.1
http://www.matlabsky.com/thread-14345-1-1.html

libsvm-mat-2.91-1.zip
http://www.matlabsky.com/thread-9328-1-1.html
【说明:最新的版本为libsvm-mat-3.0-1.zip大家可以在这里下载http://www.csie.ntu.edu.tw/~cjlin/libsvm/ 最新版本的改动是将SVM的model structure移动到了svm.h里面,对于常规用户没有影响基本和以前的都一样,只是方便一些高级用户自己进行底层代码的修改】

Libsvm-mat faruto版本下载

(更新libsvm-faruto版本归来)libsvm-3.1-[FarutoUltimate3.1Mcode]
http://www.matlabsky.com/thread-17936-1-1.html

libsvm-mat-2.89-3[FarutoUltimate3.0]
http://www.matlabsky.com/thread-9327-1-1.html

GUI版本下载【基于libsvm-mat-2.89-3[FarutoUltimate3.0]】
[原创]SVM_GUI_2.0[mcode][by_faruto]
http://www.matlabsky.com/thread-9333-1-1.html

SVM入门

我个人推荐您看这个系列帖子

SVM入门精品系列讲解目录
http://www.matlabsky.com/thread-10317-1-1.html
共有10个系列讲解,很适合SVM入门。

[整理]Libsvm官方FAQ翻译
http://www.matlabsky.com/thread-15225-1-1.html

Libsvm安装与使用(待完善);

libsvm-mat在MATLAB平台下的安装【by faruto】
http://www.matlabsky.com/thread-11925-1-1.html

如何使用libsvm进行分类【by faruto】
http://www.matlabsky.com/thread-12379-1-1.html

如何使用libsvm进行回归预测【by faruto】
http://www.matlabsky.com/thread-12390-1-1.html

利用libsvm-mat建立分类模型model参数解密【by faruto】
http://www.matlabsky.com/thread-12649-1-1.html

libsvm如何使用自定义核函数[有关-t 4 参数的使用例子]
http://www.matlabsky.com/thread-15296-1-1.html

【转】Matlab中使用libsvm进行分类预测时的标签问题再次说明
http://www.matlabsky.com/thread-12396-1-1.html

基于GridSearch的svm参数寻优
http://www.matlabsky.com/thread-12411-1-1.html

基于GA的svm参数寻优
http://www.matlabsky.com/thread-12412-1-1.html

基于PSO的svm参数寻优
http://www.matlabsky.com/thread-12414-1-1.html

线性可分模式的最优超平面的详细推导过程【支持向量机相关】
http://www.matlabsky.com/thread-12613-1-1.html

libsvm 参数说明【中英文双语版本】
http://www.matlabsky.com/thread-12380-1-1.html

这部分过一段还要完善,目前关于libsvm的安装与使用可以参看以下资源

另外一篇:MATLAB自带的svm实现函数与libsvm差别小议

1 MATLAB自带的svm实现函数仅有的模型是C-SVC(C-support vector classification); 而libsvm工具箱有C-SVC(C-support vector classification),nu-SVC(nu-support vector classification),one-class SVM(distribution estimation),epsilon-SVR(epsilon-support vector regression),nu-SVR(nu-support vector regression)等多种模型可供使用。
2 MATLAB自带的svm实现函数仅支持分类问题,不支持回归问题;而libsvm不仅支持分类问题,亦支持回归问题。
3 MATLAB自带的svm实现函数仅支持二分类问题,多分类问题需按照多分类的相应算法编程实现;而libsvm采用1v1算法支持多分类。
4 MATLAB自带的svm实现函数采用RBF核函数时无法调节核函数的参数gamma,貌似仅能用默认的;而libsvm可以进行该参数的调节。
5 libsvm中的二次规划问题的解决算法是SMO;而MATLAB自带的svm实现函数中二次规划问题的解法有三种可以选择:经典二次方法;SMO;最小二乘。(这个是我目前发现的MATLAB自带的svm实现函数唯一的优点~)

参看在优酷上的一个有关libsvm的视频(这个是我以前在国内某论坛制作过的一个视频被网友放到了优酷上)

http://v.youku.com/v_show/id_XMTIwOTIzNTQ4.html

SVM相关文献资料

[flash]
http://player.youku.com/player.php/sid/XMTIwOTIzNTQ4/v.swf
[/flash]

关于SVM的理论相关的,在下面提供了一些资源和paper, ppt,pdf,虽然这几个资源是有限的,但我敢说足够了.原因有两个:a.下面的几个文献本身质量就很高.b.这些文献主要的SVM的参考文献已经几乎全部列出了,你可以寻径查找.

田英杰_支持向量回归机及其应用研究
http://www.matlabsky.com/thread-12841-1-1.html

Sequential Minimal Optimization for SVM
http://www.matlabsky.com/thread-13059-1-1.html

 

 

SVM[Libsvm]相关应用(待完善)

基于libsvm的手写字体识别
http://www.matlabsky.com/thread-11025-1-1.html
基于libsvm的图像分割
http://www.matlabsky.com/thread-11026-1-1.html
基于SVM的基因选择(SVM-RFE算法)[SVM Recursive Feature Elimination (SVM RFE)]
基因选择算法SVM-RFE
http://www.matlabsky.com/thread-11568-1-1.html

基于平均影响值MIV的SVM变量筛选方法
http://www.matlabsky.com/thread-11569-1-1.html

基于SVM的语音特征信号分类
http://www.matlabsky.com/thread-11821-1-1.html

如何可视化libsvm的分类结果以及分类曲线
http://www.matlabsky.com/thread-12358-1-1.html

【转】文本分类入门(番外篇)特征选择与特征权重计算的区别
http://www.matlabsky.com/thread-12574-1-1.html

一些计划中将要发的帖子:
下几个帖子计划 掰饽饽说馅 的给大家说说
如何使用libsvm进行分类
如何使用libsvm进行回归
如何优化libsvm的各种参数
使用libsvm进行分类和回归的通常的流程以及注意事项

这 个最有技术含量了,因为总有朋友说用libsvm做分类或者回归效果不好,我说把数据给我试一下,结果我做的效果一般都会比其要好,为啥捏?这里先简单说 一点点:使用libsvm(SVM)不是简简单单的用svmtrain输入几个参数 -c -g 生成model后用svmpredict来分类或者回归,其实更重要的是前期的数据预处理和后期的参数选择(归一化范围的选取,降维算法的选取,以及最佳 参数选取的算法)这些才是关键,其实说白了如果这些您都搞得很透彻的话,选择其他分类器也能做好,即这些(前期的数据预处理和后期的参数选择)做好了,选 择神马分类器真的并不重要,在libsvm-mat-2.89-3[FarutoUltimate3.0]工 具箱中我把常见的数据预处理方法(归一化,降维pca)和参数选择算法(grid search 暴力搜索方法,启发式GA、PSO方法)都封装好了方便大家使用,同样是用这个加强工具箱,但对于同一个测试数据集合,我敢保证肯定会有人用的效果就没有 我的好,为啥捏?因为知其然不知其所以然!肯定是其仅仅是了解一些表象的使用,而对于底层到底是怎么回事没有搞清楚,这样在具体的参数调整上肯定是不行 的,这也回答之前的“为什么总有朋友说用libsvm做分类或者回归效果不好,我说把数据给我试一下,结果我做的效果一般都会比其要好”的原因。

如何可视化libsvm的分类结果【虚幻的浮云~】
如何处理unbalanced label(不平衡数据标签)问题【难点问题】

SVM相关杂帖(待完善)

交叉验证(Cross Validation)方法思想简介
http://www.matlabsky.com/thread-10567-1-1.html

SVM的多分类问题
http://www.matlabsky.com/thread-9471-1-1.html

MATLAB数据归一化汇总(最全面的归一化介绍)
http://www.matlabsky.com/thread-9268-1-1.html

LibSVM程序代码注释详解
http://www.matlabsky.com/thread-9462-1-1.html

PSO资源整合工具箱
http://www.matlabsky.com/thread-9330-1-1.html

Matlab Toolbox for Dimensionality Reduction [降维工具箱]
http://www.matlabsky.com/thread-9335-1-1.html

TSVM(Transductive SVM)
http://www.matlabsky.com/thread-14257-1-1.html

Matlab神经网络30个案例读者交流群
http://www.matlabsky.com/thread-14315-1-1.html

关于matlab中princomp的使用说明讲解小例子【by faruto】
http://www.matlabsky.com/thread-11751-1-1.html

主成份分析PCA源代码
http://www.matlabsky.com/thread-11750-1-1.html

SVM相关QQ讨论群整理
http://www.matlabsky.com/thread-11971-1-1.html

写在最后的闲扯淡
如题,O(∩_∩)O~
外两篇:**有趣图片

Faruto的联系方式(讨论MATLAB相关问题或者具体一些SVM相关问题或者再具体一些libsvm使用相关问题或者再再具体一些 … …);

欢迎大家一起讨论svm相关问题,共同提高。
推荐大家可以在matlabsky发帖子共同讨论。O(∩_∩)O~
www.matlabsky.com
http://video.ourmatlab.com/