簡體   English   中英

train_test_split function 在 C++

[英]train_test_split function in C++

我想創建一個 train_test_split function 將數據矩陣(向量向量)拆分為其他兩個矩陣,類似於 sklearn 的 function 所做的。 這是我這樣做的嘗試:

#include <iostream> 
#include <cstdlib>
#include <fstream> 
#include <time.h>
#include <vector>  
#include <string> 

using namespace std;

vector<vector<float>> train_test_split(vector<vector<float>> df, float train_size = 0.8){
  vector<vector<float>> train; 
  vector<vector<float>> test; 
  srand(time(NULL)); 
  for(int i = 0; i < df.size(); i++){
    int x = rand() % 10 + 1; 
    if(x <= train_size * 10){
      train.push_back(df[i]);
    } 
    else{
      test.push_back(df[i]);
    }
  }
  return train, test;
} 

int main(){
   vector<vector<float>> train;
   vector<vector<float>> test; 
   vector<vector<float>> df = {{1,2,3,4}, 
                               {5,6,7,8},
                               {9,10,11,12}};

   train, test = train_test_split(df); 
   cout << "training size: " << train.size() << ", test size: " << test.size() << endl; 
   return 0; 
}

這種方法僅在test矩陣中發送數據。 經過一番研究,我發現 C++ 不能 output 兩個值在同一個 function 中。 我是 C++ 的新手,我想知道解決這個問題的最佳方法是什么。 任何幫助將不勝感激。

function 只能返回一個值。 雖然看看你的 function 聲明:它被聲明返回一個vector<vector<float>> ,那是許多vector<float>的容器。 容器可以包含許多元素(相同類型),自定義類型可以包含許多成員:

 struct train_test_split_result {
      vector<vector<float>> train; 
      vector<vector<float>> test; 
 };

 train_test_split_result train_test_split(vector<vector<float>> df, int train_size = 0.8) {
      train_test_split_result result;
      // ...
      // result.train.push_back(...)
      // result.test.push_back(...)
      // ...
      return result;
}

int main(){
   vector<vector<float>> df = {{1,2,3,4}, 
                               {5,6,7,8},
                               {9,10,11,12}};

   train_test_split_result result = train_test_split(df); 
   cout << "training size: " << result.train.size() << ", test size: " << result.test.size() << endl; 
}

PS:您應該打開編譯器警告並閱讀它們:然后閱讀: 逗號運算符如何工作

PPS:嵌套向量對於矩陣來說是一種糟糕的數據結構。 std::vector從 memory 局部性中受益匪淺,但由於其元素是動態分配的,因此std::vector<std::vector<float>>中的float分散在 memory 中。 如果在編譯時知道大小並且不太大(需要動態分配),則可以使用嵌套數組。 或者使用平面std::vector<float>來存儲矩陣。

PPPS:還有“輸出參數”:function 可以通過非常量引用獲得 arguments,調用者傳遞它們,function 修改它們。 雖然通常不建議使用超出參數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM