最近在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);
本错误与libsvm版本无关,错误是在我一直用的libsvm上发现的(记不清是哪个版本了),我使用最新版的libsvm (Version 3.34, August 2024)进行了测试,也会出现一样的错误。