Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在LIBSVM matlab中执行附加验证_Matlab_Machine Learning_Svm_Libsvm_Cross Validation - Fatal编程技术网

在LIBSVM matlab中执行附加验证

在LIBSVM matlab中执行附加验证,matlab,machine-learning,svm,libsvm,cross-validation,Matlab,Machine Learning,Svm,Libsvm,Cross Validation,我在MatlabLibSVM上工作了一段时间来做预测。我有一个数据集,其中75%用于培训,15%用于寻找最佳参数,其余用于测试。代码如下所示 trainX and trainY are the input and output training instances testValX and testValY are the validation dataset I use for j = 1:100 for jj = 1:10 model(j,jj) = svmtrain

我在MatlabLibSVM上工作了一段时间来做预测。我有一个数据集,其中75%用于培训,15%用于寻找最佳参数,其余用于测试。代码如下所示

trainX and trainY are the input and output training instances
testValX and testValY are the validation dataset I use
for j = 1:100
    for jj = 1:10
        model(j,jj) = svmtrain(trainY,trainX,...
        ['-s 3 -t 2 -c ' num2str(j) ' -p 0.001 -g ' num2str(jj) '-v 5']);
        [predicted_label, ~, ~]=svmpredict(testValY,...
        testValX,model(j,jj));
        MSE(j,jj) = sum(((predicted_label-testValY).^2)/2);
    end
end
[min_val,min_indi] = min(MSE(:));
best_predicted_model_rbf(i) = model(min_indi);

我的问题是这是否正确。我正在创建具有不同c和g值的模型矩阵。我使用-v选项,它在这里是一个键。根据预测模型,我使用验证数据集进行预测,并通过计算均方误差进行预测。使用这个MSE,我选择了最好的c和g。由于我使用的是返回交叉验证输出的-v,所以我遵循的过程正确吗?

首先,我认为显示的代码有一个小问题,即
num2str(jj)'-v5']在-v之前没有空格。这可能会导致无法读取该标志。在另一个问题中,您指出这“有时会返回一个模型”,如果不读取该标志,则会发生这种情况。如果读取了该标志,则在使用“-v”标志时,应该只获取一个数字,而不是一个模型

第二,看起来你在做两件不同的事情,其中任何一件都是合理的。使用'-v'调用svmtrain将在训练集上运行交叉验证。这不应该返回一个模型,它应该只返回一个mse估计值。您可以使用这些估计来确定哪个参数设置最好,然后在所有训练数据上使用该设置训练一个模型


无论如何,接下来您将在一个保持验证集testValX上调用svmpredict(y,x,model),但在使用'-v'调用svmtrain之后,model此时应该只是一个标量。为了正确运行此调用,您必须从svmtrain获取不带'-v'的模型,以便它是一个结构。对于这种情况,您正在做的其余工作是有意义的,在这种情况下,您正在使用testValX进行持久验证。

这是一个很好的问题@Dthal。我认为,如果-v之前没有空格,则不考虑标志。非常感谢。