📄 entropy.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 + -