如何在 matlab 中使用 `crossval` 进行留一法验证

How to use `crossval` in matlab for a Leave one Out Validation method

我一直在阅读文档:here and here 但我真的不清楚,我不知道如何实际使用 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 进行编码?

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

好吧,我终于弄明白了:所以这是我的脚本:

首先我对我的数据和线性回归函数进行了充电

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