⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 entropy.cpp

📁 此程序能够计算一个数据集的熵和基于某个属性的熵
💻 CPP
字号:
#include "iostream"
#include "cmath"

using namespace std;

//定义一个结构体来表示这个表的信息
enum pMajor{Arts,Science,English};
enum pStatu{Graduate,Undergraduate};
enum pAge{Old,Young};
enum pNationality{Europe,Asia};
enum pGpa{Excellent,Good,Mean};

typedef struct
{
	pMajor Major;
	pStatu Statu;
	pAge Age;
	pNationality Nationality;
	pGpa Gpa;
	int count;
}Info;

#define NUM 10

inline float Info_entropy(float p,float total);

void main()
{
	//建立数据集
	Info* pInfo;
	pInfo = new Info [NUM];

	pInfo->Major=Arts;
	pInfo->Statu=Graduate;
	pInfo->Age=Old;
	pInfo->Nationality=Europe;
	pInfo->Gpa=Good;
	pInfo->count=8;

	(pInfo+1)->Major=Arts;
	(pInfo+1)->Statu=Undergraduate;
	(pInfo+1)->Age=Young;
	(pInfo+1)->Nationality=Asia;
	(pInfo+1)->Gpa=Good;
	(pInfo+1)->count=32;

	(pInfo+2)->Major=Science;
	(pInfo+2)->Statu=Undergraduate;
	(pInfo+2)->Age=Young;
	(pInfo+2)->Nationality=Asia;
	(pInfo+2)->Gpa=Excellent;
	(pInfo+2)->count=16;

	(pInfo+3)->Major=English;
	(pInfo+3)->Statu=Undergraduate;
	(pInfo+3)->Age=Young;
	(pInfo+3)->Nationality=Asia;
	(pInfo+3)->Gpa=Good;
	(pInfo+3)->count=64;

	(pInfo+4)->Major=Arts;
	(pInfo+4)->Statu=Graduate;
	(pInfo+4)->Age=Old;
	(pInfo+4)->Nationality=Asia;
	(pInfo+4)->Gpa=Excellent;
	(pInfo+4)->count=16;

	(pInfo+5)->Major=Arts;
	(pInfo+5)->Statu=Undergraduate;
	(pInfo+5)->Age=Young;
	(pInfo+5)->Nationality=Asia;
	(pInfo+5)->Gpa=Mean;
	(pInfo+5)->count=8;

	(pInfo+6)->Major=Arts;
	(pInfo+6)->Statu=Undergraduate;
	(pInfo+6)->Age=Old;
	(pInfo+6)->Nationality=Asia;
	(pInfo+6)->Gpa=Mean;
	(pInfo+6)->count=8;

	(pInfo+7)->Major=Arts;
	(pInfo+7)->Statu=Graduate;
	(pInfo+7)->Age=Old;
	(pInfo+7)->Nationality=Asia;
	(pInfo+7)->Gpa=Good;
	(pInfo+7)->count=8;

	(pInfo+8)->Major=Arts;
	(pInfo+8)->Statu=Undergraduate;
	(pInfo+8)->Age=Young;
	(pInfo+8)->Nationality=Europe;
	(pInfo+8)->Gpa=Good;
	(pInfo+8)->count=64;

	(pInfo+9)->Major=Science;
	(pInfo+9)->Statu=Undergraduate;
	(pInfo+9)->Age=Young;
	(pInfo+9)->Nationality=Europe;
	(pInfo+9)->Gpa=Excellent;
	(pInfo+9)->count=32;
	
	//显示数据集的信息
	cout<<"Major\t Statu\t Age\t Nationality\t Gpa\t Count"<<endl;
	for (int i=0;i<10;i++)
	{
		cout<<(pInfo+i)->Major<<"\t "
			<<(pInfo+i)->Statu<<"\t "
			<<(pInfo+i)->Age<<"\t "
			<<(pInfo+i)->Nationality<<"\t\t "
			<<(pInfo+i)->Gpa<<"\t "
			<<(pInfo+i)->count<<endl;
	}

    //计算数据集的熵
	int total_count=0;
	for(int j=0;j<NUM;j++)
		total_count+=(pInfo+j)->count;
	cout<<"total_count:  "<<total_count<<endl;

	float Dataset_entropy=0;
	for (int ii=0;ii<NUM;ii++)
		Dataset_entropy+=Info_entropy((float)(pInfo+ii)->count/total_count,1);
	
	cout<<"Entropy(S) =  "<<Dataset_entropy<<endl;

	//计算基于数据集中属性的熵
	while(1)
	{

	cout<<"输入你想计算其熵的属性:\n Major(1),Statu(2),Age(3),Nationality(4),Gpa(5)! 退出输入 0 ."<<endl;
	int choice_p;
	cin>>choice_p;

	float p_1=0.0;
	float p_2=0.0;
	float p_3=0.0;
	float entropy = 0.0;
	float entropy1 = 0.0;
	float entropy2 = 0.0;
	float entropy3 = 0.0;

	switch(choice_p)
	{
		case 0: exit(0);
		case 1:	{
					for(int k1 = 0;k1 < NUM; k1++)
					{
						if((pInfo+k1)->Major==Arts)
							p_1 += (pInfo+k1)->count;
						else if ((pInfo+k1)->Major==Science)
							p_2 += (pInfo+k1)->count;
						else
							p_3 += (pInfo+k1)->count;
					}

					for(int k2 = 0;k2 < NUM; k2++)
					{
						if((pInfo+k2)->Major==Arts)
						{
							float c_p_1 = (pInfo+k2)->count;
							entropy1 += p_1/total_count*Info_entropy((float)(c_p_1/p_1),1);
						}
						else if ((pInfo+k2)->Major==Science)
						{
							float c_p_2 = (pInfo+k2)->count;
							entropy2 += p_2/total_count*Info_entropy((float)(c_p_2/p_2),1);
						}
						else
						{
							float c_p_3 = (pInfo+k2)->count;
							entropy3 += p_3/total_count*Info_entropy((float)(c_p_3/p_3),1);
						}
					}

					entropy = entropy1+entropy2+entropy3;

					cout<<"Entropy(S,Major) =  "<<entropy<<endl;
					break;
					
				}
		case 2: {
					for(int k1 = 0;k1 < NUM; k1++)
					{
						if((pInfo+k1)->Statu==Graduate)
							p_1 += (pInfo+k1)->count;
						else
							p_2 += (pInfo+k1)->count;
					}

					for(int k2 = 0;k2 < NUM; k2++)
					{
						if((pInfo+k2)->Statu==Graduate)
						{
							float c_p_1 = (pInfo+k2)->count;
							entropy1 += p_1/total_count*Info_entropy((float)(c_p_1/p_1),1);
						}
						else
						{
							float c_p_2 = (pInfo+k2)->count;
							entropy2 += p_2/total_count*Info_entropy((float)(c_p_2/p_2),1);
						}
					}

					entropy = entropy1+entropy2+entropy3;

					cout<<"Entropy(S,Status) =  "<<entropy<<endl;
					break;
				}

		case 3: {
					for(int k1 = 0;k1 < NUM; k1++)
					{
						if((pInfo+k1)->Age==Old)
							p_1 += (pInfo+k1)->count;
						else
							p_2 += (pInfo+k1)->count;
					}

					for(int k2 = 0;k2 < NUM; k2++)
					{
						if((pInfo+k2)->Age==Old)
						{
							float c_p_1 = (pInfo+k2)->count;
							entropy1 += p_1/total_count*Info_entropy((float)(c_p_1/p_1),1);
						}
						else
						{
							float c_p_2 = (pInfo+k2)->count;
							entropy2 += p_2/total_count*Info_entropy((float)(c_p_2/p_2),1);
						}
					}

					entropy = entropy1+entropy2+entropy3;

					cout<<"Entropy(S,Age) =  "<<entropy<<endl;
					break;
				}

		case 4: {
					for(int k1 = 0;k1 < NUM; k1++)
					{
						if((pInfo+k1)->Nationality==Europe)
							p_1 += (pInfo+k1)->count;
						else
							p_2 += (pInfo+k1)->count;
					}

					for(int k2 = 0;k2 < NUM; k2++)
					{
						if((pInfo+k2)->Nationality==Europe)
						{
							float c_p_1 = (pInfo+k2)->count;
							entropy1 += p_1/total_count*Info_entropy((float)(c_p_1/p_1),1);
						}
						else
						{
							float c_p_2 = (pInfo+k2)->count;
							entropy2 += p_2/total_count*Info_entropy((float)(c_p_2/p_2),1);
						}
					}

					entropy = entropy1+entropy2+entropy3;

					cout<<"Entropy(S,Nationality) =  "<<entropy<<endl;
					break;
				}

		case 5: {
					for(int k1 = 0;k1 < NUM; k1++)
					{
						if((pInfo+k1)->Gpa==Excellent)
							p_1 += (pInfo+k1)->count;
						else if((pInfo+k1)->Statu==Good)
							p_2 += (pInfo+k1)->count;
						else
							p_3 += (pInfo+k1)->count;
					}

					for(int k2 = 0;k2 < NUM; k2++)
					{
						if((pInfo+k2)->Gpa==Excellent)
						{
							float c_p_1 = (pInfo+k2)->count;
							entropy1 += p_1/total_count*Info_entropy((float)(c_p_1/p_1),1);
						}
						else if ((pInfo+k2)->Gpa==Good)
						{
							float c_p_2 = (pInfo+k2)->count;
							entropy2 += p_2/total_count*Info_entropy((float)(c_p_2/p_2),1);
						}
						else
						{
							float c_p_3 = (pInfo+k2)->count;
							entropy3 += p_3/total_count*Info_entropy((float)(c_p_3/p_3),1);
						}
					}

					entropy = entropy1+entropy2+entropy3;

					cout<<"Entropy(S,Gpa) =  "<<entropy<<endl;
					break;
				}

		default: cout<<"请重新输入!\n";
	}
					
	}
	
}


inline float Info_entropy(float p,float total)
{
	float i_entropy=0.0;

	if (p!=0)
		i_entropy -= (p/total)*log10f(p/total)/log10f(2);
	
	return i_entropy;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -