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

Posted

技术标签:

【中文标题】MATLAB 支持向量机 (SVM) 交叉验证实现以提高代码速度【英文标题】:MATLAB support vector machine(SVM) cross validation implementations to improve code speed 【发布时间】:2016-06-02 18:36:11 【问题描述】:

目前我正在将此代码用于 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;

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

这种交叉验证的结构太慢了。还有其他更快执行的实现吗?

【问题讨论】:

我认为有一个名为cvpartition 的函数,可能会有所帮助。 【参考方案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 必须在之前运行(或者可能由某些函数运行)并且设置它需要几秒钟。

【讨论】:

以上是关于MATLAB 支持向量机 (SVM) 交叉验证实现以提高代码速度的主要内容,如果未能解决你的问题,请参考以下文章

支持向量机(SVM)算法的matlab的实现

R语言使用e1071包中的svm函数构建支持向量机SVM模型使用tune.svm函数基于网格搜索(10折交叉验证)对RBF核函数的gamma参数和cost参数进行参数寻优使用最优参数构建最终模型

R语言使用e1071包中的svm函数构建支持向量机SVM模型使用tune.svm函数基于网格搜索(10折交叉验证)对RBF核函数的gamma参数和cost参数进行参数寻优使用最优参数构建最终模型

请问在matlab中如何实现支持向量机(SVM)算法?

语音识别基于支持向量机SVM实现脑电信号分期睡眠监测matlab 源码

Matlab:使用 SVM 对多类分类问题进行预测