Example #1
0
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);
}
Example #2
0
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;
    }
}