void CrossValidation::k10folder(const char* folder_path) { //split samples to 10 folder std::vector<Matrix<float>> folder_10_samples(10); //sample matrix in every folder std::vector<Matrix<float>> folder_10_labels(10); //label matrix in every folder std::vector<int> folder_10_num(10); //sample number in every folder std::vector<std::vector<int>> folder_10_index(10); //sample index in every folder int samples_num = m_samples.rows(); //total sample number int samples_dim = m_samples.cols(); //sample dimension //finding sample index with different label std::map<int,std::vector<int>> labels_map; for (int i = 0; i < samples_num; ++i) { int label = int(m_labels(i,0)); labels_map[label].push_back(i); } //total labels number int total_labels_num = labels_map.size(); //disturb sample order in different label by using shuffling algorithm if (m_disturb_order_flag) { for (int label_index = 0; label_index < total_labels_num; ++label_index) { std::vector<int> order_index_vec = labels_map[label_index]; //shuffling shuffling(order_index_vec); //now,it's unordered labels_map[label_index] = order_index_vec; } } //finding sample index in every folder for (int label_index = 0; label_index < total_labels_num; ++label_index) { int num_in_label = labels_map[label_index].size(); std::vector<int> samples_index_in_label = labels_map[label_index]; //10 folder for (int i = 0; i < 10; ++i) { int select_index = i; while(select_index < num_in_label) { folder_10_index[i].push_back(samples_index_in_label[select_index]); select_index += 10; } } } //compute number in every folder for (int i = 0; i < 10; ++i) { folder_10_num[i] = folder_10_index[i].size(); } //copy data to folder for (int i = 0; i < 10; ++i) { int samples_num_in_folder = folder_10_index[i].size(); folder_10_samples[i] = Matrix<float>(samples_num_in_folder,samples_dim); folder_10_labels[i] = Matrix<float>(samples_num_in_folder,1); int count = 0; while(count < samples_num_in_folder) { int sample_index = folder_10_index[i][count]; folder_10_samples[i](Range(count,count + 1),Range(0,samples_dim)).copy(m_samples(Range(sample_index,sample_index + 1),Range(0,samples_dim))); folder_10_labels[i](count) = m_labels(sample_index,0); count++; } } //training for (int pick_index = 0; pick_index < 10; ++pick_index) { //finding samples number int num = 0; for (int i = 0; i < 10; ++i) if (i != pick_index) num += folder_10_num[i]; Matrix<float> training_samples(num,samples_dim); Matrix<float> training_labels(num,1); //using 9 folders to learn int count = 0; for (int i = 0; i < 10; ++i) { if (i != pick_index) { training_samples(Range(count,count + folder_10_num[i]),Range(0,samples_dim)).copy(folder_10_samples[i]); training_labels(Range(count,count + folder_10_num[i]),Range(0,1)).copy(folder_10_labels[i]); count += folder_10_num[i]; } } //check if (m_dummy_learner == NULL) { EAGLEEYE_ERROR("learner is NULL\n"); return; } //learning m_dummy_learner->learn(training_samples,training_labels); //evaluation float error = m_dummy_learner->evalution(folder_10_samples[pick_index],folder_10_labels[pick_index]); m_average_error += error; if (m_optimum_error > error) { m_optimum_error = error; m_optimum_index = pick_index; } if (m_maximum_error < error) m_maximum_error = error; if (folder_path) { char str[100]; std::string model_name = itoa(pick_index,str,10); m_dummy_learner->save((std::string(folder_path) + model_name).c_str()); } } m_average_error /= 10.0f; //write file FILE* fp = fopen((std::string(folder_path) + "cross_validation.dat").c_str(),"wt+"); print_info(fp," optimum error %f\n average error %f\n max error %f\n optimum model index %d",m_optimum_error,m_average_error,m_maximum_error,m_optimum_index); fclose(fp); }
int main() { printf("Welcome\n\n"); printf("是否開始遊戲?\n 1.是 開始遊戲\n 2.否 離開遊戲\n\n"); int choice, i, j; printf("選擇(請輸入1或2): "); while(EOF!=scanf("%d", &choice)) { printf("\n\n"); if(choice==2) { printf("\nSee you next time\n"); break; } else if(choice==1) { srand(time(NULL)); int round; for(round=0; round<5; round++) { printf("#round %d\n\n", (round+1)); printf("玩家手牌:\n"); shuffling(2); for(i=0; i<5; i++) { for(j=0; j<13; j++) { hand_player1[i][j]=temp_card[i][j]; } } for(i=0; i<5; i++) { for(j=0; j<13; j++) { temp_card[i][j]=0; } } printf("對手手牌:\n"); shuffling(2); for(i=0; i<5; i++) { for(j=0; j<13; j++) { hand_player2[i][j]=temp_card[i][j]; } } for(i=0; i<5; i++) { for(j=0; j<13; j++) { temp_card[i][j]=0; } } printf("公牌:\n"); shuffling(5); for(i=0; i<5; i++) { for(j=0; j<13; j++) { shared_card[i][j]=temp_card[i][j]; } } for(i=0; i<5; i++) { for(j=0; j<13; j++) { temp_card[i][j]=0; } } for(i=0; i<5; i++) { for(j=2; j<13; j++) { hand_player1[i][j]=shared_card[i][j-2]; } } for(i=0; i<5; i++) { for(j=2; j<13; j++) { hand_player2[i][j]=shared_card[i][j-2]; } } int hand_player1_temp[14],hand_player2_temp[14]; int k=0; for(i=0; i<13; i++) { for(j=0; j<5; j++) { if(hand_player1[j][i]!=0) { hand_player1_temp[k]=hand_player1[j][i]; k++; } } } k=0; for(i=0; i<13; i++) { for(j=0; j<5; j++) { if(hand_player2[j][i]!=0) { hand_player2_temp[k]=hand_player2[j][i]; k++; } } } bubblesort(hand_player1_temp); bubblesort(hand_player2_temp); printf("\n\n"); printf("玩家手牌加公牌(已排序):\n"); for(i=0; i<14; i++) { printf("%c",hand_player1_temp[i]); if(i!=0&&i%2==1) printf(" "); } printf("\n\n"); printf("對手手牌加公牌(已排序):\n"); for(i=0; i<14; i++) { printf("%c",hand_player2_temp[i]); if(i!=0&&i%2==1) printf(" "); } printf("\n\n"); int a,b; printf("玩家:"); a=deal_card(hand_player1_temp); printf("對手:"); b=deal_card(hand_player2_temp); if(a<b) { printf("對手 win!!\n"); } else if(a>b) { printf("玩家 win!!\n"); } else if(a==b) { printf("平手\n"); } system("pause"); printf("\n\n"); printf("***************************************"); printf("\n\n"); for(i=0; i<5; i++) { for(j=0; j<13; j++) { hand_player1[i][j]=0; } } for(i=0; i<5; i++) { for(j=0; j<13; j++) { hand_player2[i][j]=0; } } for(i=0; i<5; i++) { for(j=0; j<13; j++) { shared_card[i][j]=0; } } for(i=0; i<5; i++) { for(j=0; j<13; j++) { temp_card[i][j]=0; } } } } printf("==SEE YOU NEXT TIME==\n\n"); break; } }