訓練隨機森林,每次結果都不同?

我在用opencv里的隨機森林訓練膚色分類器,程序包括訓練和預測,手動運行每次結果都一樣,但若將整個程序放在while(1)循環里每次結果都不同,會是什麼原因呢?

乾脆把程序放上來。這個是網上下的常式,比較短,遇到的問題是一樣的。有評論說是因為random seed每次都不一樣,所以我在循環開始加了srand(0),但每次結果還是不同。

#include &
#include &

using namespace cv;

void buildRandomForestClassifier(const char* _dataFileName);

void main(void)
{
printf("
This is letter recognition sample.
"
"classifier is Random Trees
" );

const char* dataFileName = "letter-recognition.data";

while(1) buildRandomForestClassifier(dataFileName);
}

void buildRandomForestClassifier(const char* _dataFileName)
{
srand(0); // 設置random seed
// 讀取數據
const int MAX_FEATURE = 100;
const int VAR_COUNT = 16;
const int NSAMPLES_ALL = 20000;

FILE* f = fopen(_dataFileName, "rt");

char buf[MAX_FEATURE+2];
float* el_ptr;

Mat data(NSAMPLES_ALL, 16, CV_32F);
Mat responses(NSAMPLES_ALL, 1, CV_32F);

el_ptr = new float[VAR_COUNT+1];

for(int i=0; i&(i,0) = el_ptr[0];
char* ptr;
ptr = buf+2;
for (int j=1; j&<=VAR_COUNT; j++) { int n = 0; sscanf(ptr, "%f%n", el_ptr + j, n); ptr += n + 1; data.at&(i, j-1) = el_ptr[j];
}
}
fclose(f);
delete el_ptr;

// 訓練隨機森林
int ntrain_samples = (int)(NSAMPLES_ALL * 0.8);
int i = 0;
CvRTrees forest;

forest.train(data, CV_ROW_SAMPLE, responses, Mat(), Mat(), Mat(), Mat(),
CvRTParams(10,10,0,false,15,0,true,4,10,0.01f,CV_TERMCRIT_ITER));

// 預測誤差
double train_hr = 0;
double test_hr = 0;

for (int i=0; i&(i,0)) &<= FLT_EPSILON ? 1 : 0; if (i &< ntrain_samples) train_hr += r; else test_hr += r; } test_hr /= (double)(NSAMPLES_ALL - ntrain_samples); train_hr /= (double)ntrain_samples; printf( "Recognition rate: train = %f%%, test = %f%% ", train_hr*100., test_hr*100. ); printf( "Number of trees: %d ", forest.get_tree_count() ); }


random forest結果是有隨機性的,因為每次訓練單個數都是通過Bootstrap隨機取樣,所以每次結果不同是正常的。手動運行每次結果一樣,我猜測原因是它給了相同的random seed


同上 每次運行結果都是隨機初始值的

所以你在運行前加一個代碼:

set.seed(100)

括弧裡面的數字是可以自己設定的,相當於固定下來那個隨機值,每次運行都設定相同的值結果就會一樣了


推薦閱讀:

C++怎樣讀取文件才有最快的速度?
C++中if(a!=b)和if(a^b)哪個效率更高?
string和char數組的區別是什麼以及map可否設置key為char數組?
如何delete數組?
有什麼很好的軟體是用 Qt 編寫的?

TAG:機器學習 | C | OpenCV |