R:K-fold CV简化了代码

时间:2018-03-19 01:48:21

标签: r machine-learning cross-validation

我从头开始做3倍的CV回归。我写了一个非常简单的代码,但就像"硬编码"。我想简化代码,以便我可以将它用于更大的矩阵,并且具有更多的折叠。这是我实施的想法。

我有一个矩阵 X [6x10] ,我生成了依赖矩阵 Y [6x1] 。我将X分成3部分,Y:Matrix divided into 3 folds

然后我将X1连接到X2并创建 X1,2 [4x10] ,我对X1,X3执行相同操作并创建 X1,3 并使用X2 ,X3我创建了一个 X2,3 。这些X-es用于生成 Y1,2 [4x1] Y1,2 Y1,2 。并生成β系数, [10×],

我使用估计的贝塔来生成 Y_est -estimate(或y hat)。

然后我找到每个Y集的平方误差,所以:

然后我计算这些平方误差的平均值:

以下是执行此操作的代码:

library(dplyr)
library(tidyr)
require(stats)
require(caret)
set.seed(1)
mat=matrix(sample.int(10, 9*100, TRUE), 6, 10)
#Randomly shuffle the data 
mat=mat[sample(nrow(mat)),]
folds=cut(seq(1, nrow(mat)), breaks = 3, labels = FALSE)
#Perform 10 fold cross validation 
for(i in 1:3){
  #segment your data by folds using the which() function 
  testIndexes=which(folds==i, arr.ind = TRUE)
  testData=mat[testIndexes,]
  trainData=mat[-testIndexes,]
}
#getting the 3 folds
X1=trainData[1:2,]
X2=trainData[3:4,]
X3=testData
#generating y from the folds
Y1=as.matrix(apply(X1[, 1:10], 1, sum) + rnorm(2))
Y2=as.matrix(apply(X2[, 1:10], 1, sum) + rnorm(2))
Y3=as.matrix(apply(X3[, 1:10], 1, sum) + rnorm(2))
#concatenating the rows together for X
X12=rbind(X1,X2)
X13=rbind(X1,X3)
X23=rbind(X2,X3)
#concatenating the rows together for Y
Y12=rbind(Y1, Y2)
Y13=rbind(Y1, Y3)
Y23=rbind(Y2, Y3)
#computing beta
beta12=(t(X12)%*%X12)%*%t(X12)%*%Y12 
beta13=(t(X12)%*%X12)%*%t(X12)%*%Y12 
beta23=(t(X12)%*%X12)%*%t(X12)%*%Y12 
#Y hat estimate
Y1_hat=X1%*%beta23
Y2_hat=X2%*%beta13
Y3_hat=X3%*%beta12
#calculating the error 
err_Y1=(Y1-Y1_hat)^2
err_Y2=(Y2-Y2_hat)^2
err_Y3=(Y3-Y3_hat)^2
#computing the mean of the errors
mse=(err_Y1+err_Y2+err_Y3)/3

有没有办法简化这段代码,以便我可以将它用于更大的矩阵和更多的折叠?我非常感谢你的意见。

0 个答案:

没有答案