最近在MATLAB中使用libsvm跑别人的程序,该程序在大部分数据集上可以正常运行,但在有一个数据集上运行时MATLAB会报“MATLAB has encountered an internal problem and needs to close”的错误:
凭直觉猜应该是数据集有啥问题,但又很奇怪为什么数据集有问题会导致MATLAB本身出错。查了一下程序,感觉应该是调用的libsvm所致。于是仔细排查了一下,发现错误是因为某些训练集是空集所致。为了验证我的猜想,我写了个程序复现了一下这个错误:
%demo_libsvm_error
clear;clc;close all;
X = rand(10,3);
y = (rand(10,1)>0.5)*2-1;
%normal case
svmmodel = svmtrain(y, X, '-q');
y_predict = svmpredict(ones(10,1), X, svmmodel);
%error case
idx = (y==0);%nonexist case
X_s = X(idx,:);
y_s = y(idx);
svmmodel_s = svmtrain(y_s, X_s, '-q');
y_predict = svmpredict(ones(10,1), X, svmmodel_s);
代码开头是生成了一个二分类数据集,X是特征矩阵(每行是一个示例),y是标记向量(+1和-1两个类别);然后是正常使用libsvm训练分类模型并进行预测,这里要保证将libsvm软件包中windows文件夹下的svmtrain.mexw64和svmpredict.mexw64与上面代码文件放在同一个目录下;最后是复现出错的场景,“idx = (y==0)”是为了产生一个空集,然后基于它从生成的训练集中选样本,肯定选出来的X_s和y_s也是空集,然后再使用libsvm基于X_s和y_s进行训练,这里也是不报错的,最后一行是使用训练所得模型做预测,然后就会产生本文开头所说的error。
本错误与libsvm版本无关,错误是在我一直用的libsvm上发现的(记不清是哪个版本了),我使用最新版的libsvm (Version 3.34, August 2024)进行了测试,也会出现一样的错误。