如何在 Matlab 中使用 libsvm?

Posted

技术标签:

【中文标题】如何在 Matlab 中使用 libsvm?【英文标题】:How to use libsvm in Matlab? 【发布时间】:2012-01-23 07:01:39 【问题描述】:

我是 matlab 新手,不知道如何使用 libsvm。是否有任何示例代码用于使用 SVM 对某些数据(具有 2 个特征)进行分类,然后将结果可视化?内核(RBF、多项式和 Sigmoid)怎么样? 我在 libsvm 包中看到了该自述文件,但我无法确定它的开头或结尾,请您举一个在 matlab 中使用支持向量机 (SVM) 对 2 个类进行分类的示例,例如:

Attribute_1    Attribute_2   Class
170            66            -1
160            50            -1
170            63            -1
173            61            -1
168            58            -1
184            88            +1
189            94            +1
185            88            +1

任何帮助将不胜感激。

【问题讨论】:

你是否从这里使用 libsvm:csie.ntu.edu.tw/~cjlin/libsvm? 是的,我也看过那里的指南,但无法使用 【参考方案1】:

在 libsvm 包的 matlab/README 文件中,您可以找到以下示例:

Examples
========

Train and test on the provided data heart_scale:

matlab> [heart_scale_label, heart_scale_inst] = libsvmread('../heart_scale');
matlab> model = svmtrain(heart_scale_label, heart_scale_inst, '-c 1 -g 0.07');
matlab> [predict_label, accuracy, dec_values] = svmpredict(heart_scale_label, heart_scale_inst, model); % test the training data

For probability estimates, you need '-b 1' for training and testing:

matlab> [heart_scale_label, heart_scale_inst] = libsvmread('../heart_scale');
matlab> model = svmtrain(heart_scale_label, heart_scale_inst, '-c 1 -g 0.07 -b 1');
matlab> [heart_scale_label, heart_scale_inst] = libsvmread('../heart_scale');
matlab> [predict_label, accuracy, prob_estimates] = svmpredict(heart_scale_label, heart_scale_inst, model, '-b 1');

To use precomputed kernel, you must include sample serial number as
the first column of the training and testing data (assume your kernel
matrix is K, # of instances is n):

matlab> K1 = [(1:n)', K]; % include sample serial number as first column
matlab> model = svmtrain(label_vector, K1, '-t 4');
matlab> [predict_label, accuracy, dec_values] = svmpredict(label_vector, K1, model); % test the training data

We give the following detailed example by splitting heart_scale into
150 training and 120 testing data.  Constructing a linear kernel
matrix and then using the precomputed kernel gives exactly the same
testing error as using the LIBSVM built-in linear kernel.

matlab> [heart_scale_label, heart_scale_inst] = libsvmread('../heart_scale');
matlab>
matlab> % Split Data
matlab> train_data = heart_scale_inst(1:150,:);
matlab> train_label = heart_scale_label(1:150,:);
matlab> test_data = heart_scale_inst(151:270,:);
matlab> test_label = heart_scale_label(151:270,:);
matlab>
matlab> % Linear Kernel
matlab> model_linear = svmtrain(train_label, train_data, '-t 0');
matlab> [predict_label_L, accuracy_L, dec_values_L] = svmpredict(test_label, test_data, model_linear);
matlab>
matlab> % Precomputed Kernel
matlab> model_precomputed = svmtrain(train_label, [(1:150)', train_data*train_data'], '-t 4');
matlab> [predict_label_P, accuracy_P, dec_values_P] = svmpredict(test_label, [(1:120)', test_data*train_data'], model_precomputed);
matlab>
matlab> accuracy_L % Display the accuracy using linear kernel
matlab> accuracy_P % Display the accuracy using precomputed kernel

Note that for testing, you can put anything in the
testing_label_vector.  For more details of precomputed kernels, please
read the section ``Precomputed Kernels'' in the README of the LIBSVM
package.

【讨论】:

我知道这个线程很旧,但是关于预计算内核的“示例序列号”是什么意思? 他们指的是(1:n)'。基本上,您可以按照与样本不同的顺序提供内核。否则,只需使用(1:n)'

以上是关于如何在 Matlab 中使用 libsvm?的主要内容,如果未能解决你的问题,请参考以下文章

如何设置 LIBSVM Matlab 接口?

如何在matlab里安装libsvm包

如何在 C++ 中移植 MATLAB libSVM 参数

如何使用 libsvm 库(Matlab)实现 1 对 1 多类分类?

Matlab Libsvm 中的拉普拉斯内核

如何在 Matlab 中为 libSVM 的 nu-SVM 使用变量而不是 nu 参数的数量?