[问题] 做cross-validatoin (已解决)

楼主: celestialgod (天)   2014-04-22 21:51:19
开发平台(Platform): (Ex: VC++, GCC, Linux, ...)
intel C++ (icl)
额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
armadillo, intel mkl
问题(Question):
我的资料存在一个二维矩阵 X(sample_size, dimension)
我要进行K-fold cross-validation
现在做法如下:
1. 随机排列向量:1~sample_size => random_index
2.
1st-fold 取random_index 前K个值做为列号,取出X的submatrix
为testing set,剩下为 training set => 最后存在struc 回传到main函数
2nd-fold 取random_index 第K+1个到2*K个值做列号,取出X的submatrix
做testing set,剩下为training set => 最后存在struc 回传到main函数
main函数 => training set做model,testing set计算我需要的criterion
我问题是如何取training set比较快
因为我现在每一个fold都要把资料复制一次 这样非常花时间...
我现在想到比较快的方法是随机排列每一个列之后 (这样只要复制一次...)
利用submat这个函数 取特定几列(EX: 1st-fold: 1~K, 2nd-fold: (K+1)~2*K)出来
training就要再利用到 join_horiz合并两个不相邻的submatrix
想问有没有更省时间的方法?
另外,armadillo有没有办法这样做:
index 是 重复1~K,长度为sample_size的rowvec
X(find(index==fold),:) # fold = 1, ..., K
喂入的资料(Input):
预期的正确结果(Expected Output):
错误结果(Wrong Output):
程式码(Code):(请善用置底文网页, 记得排版)
补上现在做法的code
http://pastebin.com/C3hSuLp2
说明最后解决方式:
先算出每一组的个数之后,假设叫做folds_size
以下列方式进行计算,速度比上面的两种方法都快很多
X = shuffle(X); // 先把row进行乱排
for (int fold_run = 0; fold_run < K; fold_run++)
{
mat X_test = X.rows(0, folds_size_p(fold_run)); // testing
X.shed_rows(0, folds_size_n(fold_run)); // training
/* do something */
X.insert_rows(X.n_rows, X_test);
}
补充说明(Supplement):

Links booklink

Contact Us: admin [ a t ] ucptt.com