[問題] 做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