测试部分代码:
void test_lr() { srand(0); double learning_rate = 0.1; double n_epochs = 500; int train_N = 6; int test_N = 2; int n_in = 6; int n_out = 2; // int **train_X; // int **train_Y; // int **test_X; // double **test_Y; // train_X = new int*[train_N]; // train_Y = new int*[train_N]; // for(i=0; i<train_N; i++){ // train_X[i] = new int[n_in]; // train_Y[i] = new int[n_out]; // }; // test_X = new int*[test_N]; // test_Y = new double*[test_N]; // for(i=0; i<test_N; i++){ // test_X[i] = new int[n_in]; // test_Y[i] = new double[n_out]; // } // training data int train_X[6][6] = { {1, 1, 1, 0, 0, 0}, {1, 0, 1, 0, 0, 0}, {1, 1, 1, 0, 0, 0}, {0, 0, 1, 1, 1, 0}, {0, 0, 1, 1, 0, 0}, {0, 0, 1, 1, 1, 0} }; int train_Y[6][2] = { {1, 0}, {1, 0}, {1, 0}, {0, 1}, {0, 1}, {0, 1} }; // construct LogisticRegression LogisticRegression classifier(train_N, n_in, n_out); // i wonder that we should set the N value to 1 as training online //LogisticRegression classifier(1, n_in, n_out); // train online for(int epoch=0; epoch<n_epochs; epoch++) { for(int i=0; i<train_N; i++) { classifier.train(train_X[i], train_Y[i], learning_rate); } // learning_rate *= 0.95; } // test data int test_X[2][6] = { {1, 0, 1, 0, 0, 0}, {0, 0, 1, 1, 1, 0} }; double test_Y[2][2]; // test for(int i=0; i<test_N; i++) { classifier.predict(test_X[i], test_Y[i]); for(int j=0; j<n_out; j++) { cout << test_Y[i][j] << " "; } cout << endl; } } int main() { test_lr(); getchar(); return 0; }
测试数据实际上是在训练集合中的,分别是第二个和第四个训练数据,也就是说,这是“封闭测试”。测试结果如下所示:
不过总感觉这个调用
“
LogisticRegression classifier(train_N, n_in, n_out);
”
不对。在线训练,是单个样本为单位的训练,train_N的值应该设置为1。将这一句改成
“
LogisticRegression classifier(1, n_in, n_out);
”
运行结果如下:
与上面的结果差别不大。恐怕要到实际应用中检验了。