MATLAB支持向量机(SVM)交叉验证实现,以提高代码速度

时间:2016-02-21 10:25:27

标签: performance matlab svm

目前我正在使用此代码进行MATLAB R2015b支持向量机(SVM)10次交叉验证。

indices = crossvalind('Kfold',output,10);
cp = classperf(binary_output);

for i = 1:10
    test = (indices == i); train = ~test;

    SVMModel = fitcsvm(INPUT(train,:), output(train,:),'KernelFunction','RBF',...
        'KernelScale','auto');
    class = predict(SVMModel, INPUT(test,:));
    classperf(cp,class,test);
end

z = cp.ErrorRate;
sensitivity = cp.Sensitivity;
specificity = cp.Specificity;

我需要提取这种二元分类的敏感性和特异性。否则我在循环中运行此代码。

这种交叉验证结构非常慢。任何其他实现更快的执行?

1 个答案:

答案 0 :(得分:1)

一种简单的方法是使用crossval函数中的多线程。

tic

%data partition
order = unique(y); % Order of the group labels
cp = cvpartition(y,'k',10); %10-folds

%prediction function
f = @(xtr,ytr,xte,yte)confusionmat(yte,...
predict(fitcsvm(xtr, ytr,'KernelFunction','RBF',...
    'KernelScale','auto'),xte),'order',order);

% missclassification error 
cfMat = crossval(f,INPUT,output,'partition',cp);
cfMat = reshape(sum(cfMat),2,2)
toc

使用混淆矩阵,您可以轻松获得灵敏度和特异性。为了记录,脚本和Matlab提供的crossval函数之间的时间没有改善。

crossval函数的替代方法是使用parfor 分割不同核心之间每次迭代的计算。

Ps:对于任何并行计算,parpool必须在之前运行(或者可能由某些函数运行),并且设置它需要几秒钟。