如何在matlab中使用`crossval`进行Leave one Out Validation方法

时间:2016-07-25 11:28:07

标签: matlab cross-validation

我一直在阅读文档:herehere但对我来说真的不清楚,我不知道如何使用p crossval做一个离开验证

vals = crossval(fun,X)
vals = crossval(fun,X,Y,...)
mse = crossval('mse',X,y,'Predfun',predfun)
mcr = crossval('mcr',X,y,'Predfun',predfun)
val = crossval(criterion,X1,X2,...,y,'Predfun',predfun)
vals = crossval(...,'name',value)

我真的不理解fun部分。

我估计了不同指数的叶绿素率。然后我在那些指数和采取叶绿素率的领域之间进行了线性回归。现在我想验证它们,我估计其中一个是22个条目的列,所以我想使用其中21个作为实习生,1个作为测试,并做22个循环,以便所有数据都被用作测试。 但我不应该把回归模型放在哪里?如果我的回归是Y = aX + b, 我是否重新使用之前为列车部件计算的a和b,或者我是否对列车部件进行了新的线性回归,然后看看测试的内容是什么? 我不确定我是否完全理解如何留出一个模型。

然后我想通过计算RMSE(也许是R²)来了解测试结果。

如何使用crossval进行编码?

我看到了here问题的答案,但我无法使用我的许可证访问crossvalind这个功能。

1 个答案:

答案 0 :(得分:1)

我最终弄清楚了:所以这是我的剧本:

首先我收取了我的数据和线性回归函数

X=indicesCha_without_Cloud(:,3);
y=Cha_g_m2t_without_Cloud(:,3);
testval=@(XTRAIN,ytrain,XTEST)Linear_regression_indices( XTRAIN,ytrain,XTEST);

在我的情况下,fun(在Mathwork help中)testvalLinear_regression_indices是一个非常简单的函数:

function [ Linear_regression_indices ] = Linear_regression_indices(XTRAIN,ytrain,XTEST )
         Linear_regression_indices=(polyval(polyfit(XTRAIN,ytrain,1),XTEST));
end

有两种方法可以做到,它们都给出相同的结果:

  • 只使用crossval功能

    cvMse = crossval('mse',X,y,'predfun',testval,'leaveout',1);

    这将与数据大小一样多,每次使用其中一个数据作为Xtest

  • 第二个使用cvpartition

    c = cvpartition(n,'LeaveOut')为n次观察创建一个随机分区,用于留一交叉验证。留一法是' KFold'的一个特例,其中折叠数等于观察数。 link

    c = cvpartition(y,'LeaveOut'); cvMse2=crossval('mse',X,y,'predfun',testval,'partition',c);

然后可以轻松计算RMSE

RMSE=sqrt(cvMse);
RMSE2=sqrt(cvMse2);

然后我只是得到了我的回答,在我的情况下RMSE=0,3548