看板 C_and_CPP 關於我們 聯絡資訊
開發平台(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): -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 218.164.193.76 ※ 文章網址: http://www.ptt.cc/bbs/C_and_CPP/M.1398174682.A.974.html ※ 編輯: celestialgod (36.238.89.226), 04/23/2014 02:14:33