El uso de LIBSVM bajo Matlab

Support Vector Machine (SVM, Support Vector Machine) es un método de reconocimiento de patrones basado en la teoría del aprendizaje estadístico, que se utiliza ampliamente para resolver problemas de clasificación no lineal, de alta dimensión y de muestras pequeñas.

LIBSVM es un paquete de software para el reconocimiento y regresión de patrones de SVM desarrollado por el profesor Lin Chih-Jen de la Universidad Nacional de Taiwán. Es fácil de usar y poderoso. Este artículo presenta principalmente su uso en Matlab.

Una instalación

1. Descarga

Descargue la última versión del paquete de software en la página de inicio de LIBSVM y descomprímalo en un directorio adecuado.

2. Compilar

Si está utilizando un sistema operativo de 64 bits y Matlab, no es necesario que realice el paso de compilación, porque el paquete de software integrado ya contiene la versión compilada de 64 bits: libsvmread.mexw64, libsvmwrite.mexw64, svmtrain.mexw64, svmpredict .mexw64. De lo contrario, debe compilar el archivo binario usted mismo.

Primero ingrese el directorio matlab bajo el directorio raíz LIBSVM en Mtlab (como C: \ libsvm-3.17 \ matlab), ingrese en la ventana de comandos

>> mex –configuración

Luego, Matlab le pedirá que elija un compilador C / C ++ para compilar archivos mex, simplemente elija un compilador instalado, como Microsoft Visual C ++ 2010. Después de eso, Matlab le pedirá que confirme el compilador seleccionado, ingrese y para confirmar.

Luego puede ingresar el siguiente comando para compilar.

>> hacer

Tenga en cuenta que si la versión de Matlab o VC es demasiado baja, puede provocar un error de compilación.Se recomienda utilizar la última versión.

Después de que la compilación sea exitosa, aparecerán varios archivos con el sufijo mexw64 (sistema de 64 bits) o mexw32 (sistema de 32 bits) en el directorio actual.

3. Cambiar nombre (opcional, pero recomendado)

Una vez completada la compilación, los dos archivos svmtrain.mexw64, svmpredict.mexw64 (sistema de 64 bits) o svmtrain.mexw32, svmpredict.mexw32 (sistema de 32 bits) aparecen en el directorio actual, y los nombres de archivo svmtrain y svmpredict se cambian a libsvmtrain en consecuencia Y libsvmpredict.

Esto se debe a que Matlab viene con una caja de herramientas de SVM, y sus nombres de función son svmtrain y svmpredict, que son los mismos que los nombres predeterminados de LIBSVM. A veces pueden surgir ciertos problemas en el uso real, como llamar a LIBSVM en una llamada Matlab SVM.

Si hay un cambio de nombre, siempre usará los dos nombres libsvmtrain y libsvmpredict cuando use LIBSVM en el futuro.

4. Agregar ruta

Para la conveniencia de un uso futuro, se recomienda agregar la ruta del archivo compilado de LIBSVM (como C: \ libsvm-3.17 \ matlab) a la ruta de búsqueda de Matlab. La operación específica es: (correspondiente a la versión china de Matlab)

INICIO -> Establecer ruta -> Agregar carpeta -> Agregar la ruta donde se encuentra el archivo compilado (como C: \ libsvm-3.17 \ matlab)

Por supuesto, puede copiar los 4 archivos compilados en el lugar deseado y luego agregar la ruta a la ruta de búsqueda de Matlab.

Segunda prueba

El paquete de software LIBSVM contiene sus propios datos de prueba, que son el archivo heart_scale en el directorio raíz del paquete de software, que se puede utilizar para probar si la instalación de LIBSVM es correcta. El archivo heart_scale aquí no se puede leer con la carga de Matlab, debe leerse con libsvmread.

Ingrese al directorio raíz de LIBSVM y ejecute el siguiente código (debido a que el archivo heart_scale no se agrega a la ruta de búsqueda, no se puede acceder a este archivo desde otras rutas):

[heart_scale_label, heart_scale_inst] = libsvmread('heart_scale');
model = libsvmtrain(heart_scale_label, heart_scale_inst, '-c 1 -g 0.07');
[predict_label, accuracy, dec_values] = libsvmpredict(heart_scale_label, heart_scale_inst, model);

如果LIBSVM安装正确的话,会出现以下的运行结果,显示正确率为86.6667%。

*
optimization finished, #iter = 134
nu = 0.433785
obj = -101.855060, rho = 0.426412
nSV = 130, nBSV = 107
Total nSV = 130
Accuracy = 86.6667% (234/270) (classification)

三 原理简介

使用SVM前首先得了解SVM的工作原理,简单介绍如下。

SVM(Support Vector Machine,支持向量机)是一种有监督的机器学习方法,可以学习不同类别的已知样本的特点,进而对未知的样本进行预测。

SVM本质上是一个二分类的算法,对于n维空间的输入样本,它寻找一个最优的分类超平面,使得两类样本在这个超平面下可以获得最好的分类效果。这个最优可以用两类样本中与这个超平面距离最近的点的距离来衡量,称为边缘距离,边缘距离越大,两类样本分得越开,SVM就是寻找最大边缘距离的超平面,这个可以通过求解一个以超平面参数为求解变量的优化问题获得解决。给定适当的约束条件,这是一个二次优化问题,可以通过用KKT条件求解对偶问题等方法进行求解。

对于不是线性可分的问题,就不能通过寻找最优分类超平面进行分类,SVM这时通过把n维空间的样本映射到更高维的空间中,使得在高维的空间上样本是线性可分的。在实际的算法中,SVM不需要真正地进行样本点的映射,因为算法中涉及到的高维空间的计算总是以内积的形式出现,而高维空间的内积可以通过在原本n维空间中求内积然后再进行一个变换得到,这里计算两个向量在隐式地映射到高维空间的内积的函数就叫做核函数。SVM根据问题性质和数据规模的不同可以选择不同的核函数。

虽然SVM本质上是二分类的分类器,但是可以扩展成多分类的分类器,常见的方法有一对多(one-versus-rest)和一对一(one-versus-one)。在一对多方法中,训练时依次把k类样本中的某个类别归为一类,其它剩下的归为另一类,使用二分类的SVM训练处一个二分类器,最后把得到的k个二分类器组成k分类器。对未知样本分类时,分别用这k个二分类器进行分类,将分类结果中出现最多的那个类别作为最终的分类结果。而一对一方法中,训练时对于任意两类样本都会训练一个二分类器,最终得到k*(k-1)/2个二分类器,共同组成k分类器。对未知样本分类时,使用所有的k*(k-1)/2个分类器进行分类,将出现最多的那个类别作为该样本最终的分类结果。

LIBSVM中的多分类就是根据一对一的方法实现的。

四 使用

关于LIBSVM在Matlab中的使用,可以参看软件包中matlab目录下的README文件,这里对里面内容做一个翻译和一些细节的讲解。

1. 训练

libsvm函数用于对训练集的数据进行训练,得到训练好的模型。

model = libsvmtrain(training_label_vector, training_instance_matrix [, 'libsvm_options']);

这个函数有三个参数,其中

  • -training_label_vector:训练样本的类标,如果有m个样本,就是m x 1的矩阵(类型必须为double)。这里可以是二分类和多分类,类标是(-1,1)、(1,2,3)或者其他任意用来表示不同的类别的数字,要转成double类型。
  • -training_instance_matrix:训练样本的特征,如果有m个样本,每个样本特征是n维,则为m x n的矩阵(类型必须为double)。
  • -libsvm_options:训练的参数,在第3点详细介绍。

2. 预测

libpredict函数用于对测试集的数据进行测试,还能对未知样本进行预测。

[predicted_label, accuracy, decision_values/prob_estimates] 
    = libsvmpredict(testing_label_vector, testing_instance_matrix, model [, 'libsvm_options']);

这个函数包括四个参数,其中

  • -testing_label_vector:测试样本的类标,如果有m个样本,就是m x 1的矩阵(类型必须为double)。如果类标未知,可以初始化为任意m x 1的double数组。
  • -testing_instance_matrix:测试样本的特征,如果有m个样本,每个样本特征是n维,则为m x n的矩阵(类型必须为double)。
  • -model:使用libsvmtrain返回的模型
  • -libsvm_options:预测的参数,与训练的参数形式一样。

3. 训练的参数

LIBSVM训练时可以选择的参数很多,包括:

  • -s svm类型:SVM设置类型(默认0)
        0 — C-SVC; 1 –v-SVC; 2 – 一类SVM; 3 — e-SVR; 4 — v-SVR
  • -t 核函数类型:核函数设置类型(默认2)
        0 – 线性核函数:u’v 
        1 – 多项式核函数:(r*u’v + coef0)^degree
        2 – RBF(径向基)核函数:exp(-r|u-v|^2)
        3 – sigmoid核函数:tanh(r*u’v + coef0)
  • -d degree:核函数中的degree设置(针对多项式核函数)(默认3)
  • -g r(gamma):核函数中的gamma函数设置(针对多项式/rbf/sigmoid核函数)(默认1/k,k为总类别数)
  • -r coef0:核函数中的coef0设置(针对多项式/sigmoid核函数)((默认0)
  • -c cost:设置C-SVC,e -SVR和v-SVR的参数(损失函数)(默认1)
  • -n nu:设置v-SVC,一类SVM和v- SVR的参数(默认0.5)
  • -p p:设置e -SVR 中损失函数p的值(默认0.1)
  • -m cachesize:设置cache内存大小,以MB为单位(默认40)
  • -e eps:设置允许的终止判据(默认0.001)
  • -h shrinking:是否使用启发式,0或1(默认1)
  • -wi weight:设置第几类的参数C为weight*C (C-SVC中的C) (默认1)
  • -v n: n-fold交互检验模式,n为fold的个数,必须大于等于2

以上这些参数设置可以按照SVM的类型和核函数所支持的参数进行任意组合,如果设置的参数在函数或SVM类型中没有也不会产生影响,程序不会接受该参数;如果应有的参数设置不正确,参数将采用默认值。

4. 训练返回的内容

libsvmtrain函数返回训练好的SVM分类器模型,可以用来对未知的样本进行预测。这个模型是一个结构体,包含以下成员:

  • -Parameters: 一个5 x 1的矩阵,从上到下依次表示:
        -s SVM类型(默认0);
        -t 核函数类型(默认2)
        -d 核函数中的degree设置(针对多项式核函数)(默认3);
        -g 核函数中的r(gamma)函数设置(针对多项式/rbf/sigmoid核函数) (默认类别数目的倒数);
        -r 核函数中的coef0设置(针对多项式/sigmoid核函数)((默认0)
  • -nr_class: 表示数据集中有多少类别,比如二分类时这个值即为2。
  • -totalSV: 表示支持向量的总数。
  • -rho: 决策函数wx+b中的常数项的相反数(-b)。
  • -Label: 表示数据集中类别的标签,比如二分类常见的1和-1。
  • -ProbA: 使用-b参数时用于概率估计的数值,否则为空。
  • -ProbB: 使用-b参数时用于概率估计的数值,否则为空。
  • -nSV: 表示每类样本的支持向量的数目,和Label的类别标签对应。如Label=[1; -1],nSV=[63; 67],则标签为1的样本有63个支持向量,标签为-1的有67个。
  • -sv_coef: 表示每个支持向量在决策函数中的系数。
  • -SVs: 表示所有的支持向量,如果特征是n维的,支持向量一共有m个,则为m x n的稀疏矩阵。

另外,如果在训练中使用了-v参数进行交叉验证时,返回的不是一个模型,而是交叉验证的分类的正确率或者回归的均方根误差。

5. 预测返回的内容

libsvmtrain函数有三个返回值,不需要的值在Matlab可以用~进行代替。

  • -predicted_label:第一个返回值,表示样本的预测类标号。
  • -accuracy:第二个返回值,一个3 x 1的数组,表示分类的正确率、回归的均方根误差、回归的平方相关系数。
  • -decision_values/prob_estimates:第三个返回值,一个矩阵包含决策的值或者概率估计。对于n个预测样本、k类的问题,如果指定“-b 1”参数,则n x k的矩阵,每一行表示这个样本分别属于每一个类别的概率;如果没有指定“-b 1”参数,则为n x k*(k-1)/2的矩阵,每一行表示k(k-1)/2个二分类SVM的预测结果。

6. 读取或保存

libsvmread函数可以读取以LIBSVM格式存储的数据文件。

[label_vector, instance_matrix] = libsvmread(‘data.txt’);

这个函数输入的是文件的名字,输出为样本的类标和对应的特征。

libsvmwrite函数可以把Matlab的矩阵存储称为LIBSVM格式的文件。

libsvmwrite(‘data.txt’, label_vector, instance_matrix]

这个函数有三个输入,分别为保存的文件名、样本的类标和对应的特征(必须为double类型的稀疏矩阵)。

五 更新:svdd扩展安装(2014.10)

libsvm官网下载svdd工具箱,目前使用libsvm3.18以及svdd3.18版本。

  1. svdd工具箱里面有一个matlab文件夹和3个文件svm.cpp、svm.h、svm-train.c。
  2. 将matlab文件夹中的文件svmtrain.c覆盖原libsvm的matlab文件夹中的文件。
  3. 将svm.cpp、svm.h、svm-train.c这3个文件覆盖libsvm文件夹下的相同文件。
  4. 按本文刚开始讲述的方法进行mex -setup、make等完成安装,根据需要进行改名以及添加Path。

Supongo que te gusta

Origin blog.csdn.net/lc547913923/article/details/52668059
Recomendado
Clasificación