目录:
介绍
安装
使用
返回的模型结构
结果的预测
其它用法
示例
一、介绍
这个工具提供了一个简单的界面,用于使用LIBSVM,它易于使用,因为其用法和参数指定方式与LIBSVM相同。
二、安装
这段文本提供了关于在Windows系统上使用MATLAB或OCTAVE编译LIBSVM工具的说明。以下是对文本的解释:
-
预编译的 mex 文件:
- 在Windows系统上,预先构建的 mex 文件已经存在于目录’…\windows’中。用户只需将它们复制到MATLAB目录中。
-
建议的编译方法:
- 推荐在MATLAB和OCTAVE上都使用 make.m。只需键入 ‘make’ 命令,即可构建 ‘libsvmread.mex’、‘libsvmwrite.mex’、‘svmtrain.mex’ 和 ‘svmpredict.mex’。
-
MATLAB 或 OCTAVE 上的编译命令示例:
- 在MATLAB或OCTAVE中,执行以下命令:
>> make
- 在MATLAB或OCTAVE中,执行以下命令:
-
处理编译问题:
- 如果在MATLAB上 make.m 不起作用(特别是在Windows上),可以尝试使用 ‘mex -setup’ 命令选择合适的编译器。确保您的编译器是可访问和可用的。然后再次执行 ‘make’ 完成安装。
-
编译器选择示例:
- 示例中演示了如何使用 ‘mex -setup’ 来配置编译器。MATLAB会选择默认的编译器。如果有多个编译器,MATLAB会列出一个列表供您选择。更多详情可以查看提供的链接。
-
Windows 平台测试:
- 文本中指出,在Windows上通过使用Visual C++已经测试过 make.m。
综合起来,这些说明提供了在Windows系统上通过MATLAB或OCTAVE编译LIBSVM工具的步骤和建议。用户可以根据需要选择使用预编译的 mex 文件或者按照说明重新构建工具。
三、使用
提供了在MATLAB中使用LIBSVM工具的示例用法,以下是对每个命令的详细解释:
svmtrain 命令:
- 用法:
model = svmtrain(training_label_vector, training_instance_matrix [, 'libsvm_options']);
- 参数:
training_label_vector
:一个 m 行 1 列的训练标签向量(类型必须为 double)training_instance_matrix
:一个 m 行 n 列的训练实例矩阵,包含 n 个特征,可以是密集或稀疏矩阵(类型必须为 double)。libsvm_options
:一个字符串,包含与 LIBSVM 相同格式的训练选项。
- 说明:该命令用于训练支持向量机模型,并返回训练好的模型。
svmpredict 命令:
- 用法1:
[predicted_label, accuracy, decision_values/prob_estimates] = svmpredict(testing_label_vector, testing_instance_matrix, model [, 'libsvm_options']);
- 用法2:
[predicted_label] = svmpredict(testing_label_vector, testing_instance_matrix, model [, 'libsvm_options']);
- 参数:
testing_label_vector
:一个 m 行 1 列的预测标签向量。如果测试数据的标签未知,可以使用任意随机值(类型必须为 double)。testing_instance_matrix
:一个 m 行 n 列的测试实例矩阵,包含 n 个特征,可以是密集或稀疏矩阵(类型必须为 double)。model
:svmtrain 命令的输出模型。libsvm_options
:一个字符串,包含与 LIBSVM 相同格式的测试选项。
- 说明:该命令用于使用训练好的模型进行预测,返回预测标签、准确度和决策值/概率估计。
这些命令提供了在MATLAB中使用LIBSVM进行训练和预测的基本用法,并解释了每个命令的参数和返回值。
四、返回的模型结构
这部分描述了在使用 ‘svmtrain’ 函数训练支持向量机后返回的模型结构
-
Parameters(参数):
- 类型:结构体
- 描述:包含模型的参数信息。
-
nr_class(类别数):
- 类型:整数
- 描述:类别的数量;对于回归/单类别支持向量机,该值为2。
-
totalSV(支持向量总数):
- 类型:整数
- 描述:支持向量的总数。
-
rho(决策函数中的-b):
- 类型:实数
- 描述:决策函数 wx+b 中的参数 -b。
-
Label(类别标签):
- 类型:向量
- 描述:每个类别的标签;对于回归/单类别支持向量机,此项为空。
-
sv_indices(支持向量的索引):
- 类型:向量
- 描述:值在 [1,…,num_traning_data] 范围内,指示训练集中的支持向量。
-
ProbA 和 ProbB(概率信息):
- 类型:矩阵
- 描述:成对的概率信息;如果 -b 选项为 0 或者是单类别支持向量机,这两项为空。
-
Prob_density_marks(概率密度标记):
- 类型:矩阵
- 描述:用于单类别支持向量机的概率信息;如果 -b 为 0 或者不是单类别支持向量机,这项为空。
-
nSV(每个类别的支持向量数量):
- 类型:向量
- 描述:每个类别的支持向量数量;对于回归/单类别支持向量机,此项为空。
-
sv_coef(决策函数中的支持向量系数):
- 类型:矩阵
- 描述:决策函数中支持向量的系数。
-
SVs(支持向量):
- 类型:矩阵
- 描述:支持向量的数据。
如果不使用 ‘-b 1’ 选项,ProbA 和 ProbB 将是空矩阵。如果指定了 ‘-v’ 选项,将进行交叉验证,并返回的模型只是一个标量:用于分类的交叉验证准确度和用于回归的均方误差。
有关该模型的更多细节可以在 LIBSVM FAQ(http://www.csie.ntu.edu.tw/~cjlin/libsvm/faq.html) 和 LIBSVM 实现文档(http://www.csie.ntu.edu.tw/~cjlin/papers/libsvm.pdf) 中找到。
五、结果的预测
这段代码描述了 ‘svmpredict’ 函数的三个输出,以下是对每个输出的详细解释:
-
predicted_label(预测标签):
- 类型:向量
- 描述:包含预测标签的向量。每个元素表示相应测试实例的预测标签。
-
accuracy(准确度):
- 类型:向量
- 描述:包含准确度的向量,用于分类问题。对于回归问题,其中包含均方误差和平方相关系数。如果使用了 ‘-b 1’ 选项,则第二个元素包含平均精度。
-
decision_values/prob_estimates(决策值/概率估计):
-
类型:矩阵
-
描述:包含决策值或概率估计的矩阵。如果使用了 ‘-b 1’ 选项,则这个矩阵包含概率估计。对于二元分类问题,每一行都包括预测 k(k-1)/2 个二元分类支持向量机的结果。对于多类别分类问题,每一行表示测试实例属于每个类别的概率。注意,这里类别的顺序与模型结构中的 ‘Label’ 字段相同。
-
对于二元分类问题(k=2),决策值表示正类别的概率;对于多类别问题(k>2),决策值表示每个类别的概率。
-
对于一类别支持向量机,每行包含两个元素,分别表示正常实例和异常实例的概率。
-
这三个输出提供了对测试数据进行预测后的不同信息,包括预测标签、准确度和决策值/概率估计。用户可以根据任务类型选择关注的输出。
六、其它用法
这部分介绍了两个MATLAB函数,用于读取和写入LIBSVM格式的文件:
-
libsvmread函数:
- 功能:该函数用于读取LIBSVM格式的文件
- 调用方式:
[label_vector, instance_matrix] = libsvmread('data.txt');
- 输出:
label_vector
:标签向量,包含文件中的标签信息。instance_matrix
:实例矩阵,包含文件中的实例数据。
- 用途:这两个输出可以作为svmtrain或svmpredict函数的输入,用于支持向量机的训练和预测。
-
libsvmwrite函数:
- 功能:该函数用于将MATLAB矩阵写入LIBSVM格式的文件。
- 调用方式:
libsvmwrite('data.txt', label_vector, instance_matrix);
- 输入:
data.txt
:输出文件的名称。label_vector
:标签向量,包含要写入文件的标签信息。instance_matrix
:实例矩阵,包含要写入文件的实例数据。
- 要求:
instance_matrix
必须是一个稀疏矩阵,且其数据类型必须为double。 - 注意:对于32位和64位Windows上的MATLAB,预先构建的二进制文件已经准备好,存储在
..\windows
目录下。然而,在将来的发布版本中,将只包含64位MATLAB的二进制文件。
七、示例
1. 在提供的数据集文件 heart_scale 上进行训练模型和预测结果:
2.概率的评估,需要在训练和测试过程中添加参数 '-b 1' :
3.演示了如何在MATLAB中使用LIBSVM进行支持向量机的训练和测试,比较了线性核和预先计算的核在测试集上的准确度
1. 数据读取和拆分:
- 通过
libsvmread
函数读取心脏数据集(heart_scale) - 将数据集分为150个训练数据和120个测试数据
[heart_scale_label, heart_scale_inst] = libsvmread('../heart_scale');
train_data = heart_scale_inst(1:150,:);
train_label = heart_scale_label(1:150,:);
test_data = heart_scale_inst(151:270,:);
test_label = heart_scale_label(151:270,:);
2. 线性核训练和测试:
- 使用
svmtrain
函数采用线性核训练模型 - 使用
svmpredict
函数进行测试,得到预测标签、准确度和决策值
model_linear = svmtrain(train_label, train_data, '-t 0');
[predict_label_L, accuracy_L, dec_values_L] = svmpredict(test_label,
test_data, model_linear);
3. 预先计算的核训练和测试:
- 使用
svmtrain
函数,指定'-t 4'
以使用预先计算的核,其中训练数据的核矩阵由[(1:150)', train_data*train_data']
给出 - 使用
svmpredict
函数进行测试,得到预测标签、准确度和决策值
model_precomputed = svmtrain(train_label,
[(1:150)',train_data*train_data'], '-t 4');
[predict_label_P, accuracy_P, dec_values_P] = svmpredict(test_label,
[(1:120)', test_data*train_data'], model_precomputed);
4. 准确度显示:
- 显示使用线性核和预先计算的核进行测试的准确度
disp('Accuracy using linear kernel:');
disp(accuracy_L);
disp('Accuracy using precomputed kernel:');
disp(accuracy_P);