GINI系数的计算
题目![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/1311afcc1967633031f27b274b1b3b0a.png)
1、计算整个训练集的基尼指数
2、计算训练集按照“性别”进行两路分割后的基尼指数
3、计算训练集按照“车型”进行三路分割后的基尼指数
4、(5) 计算训练集按照“衬衣尺码”进行四路分割后的基尼指数
思路
利用结构体和函数求解
代码
// A code block
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
struct people //建立结构体存放每一元组的数据
{
int id;
char sex;
string car_type;
string shirt_size;
int pclass;
};
int main()
{
int n;
people *p;
cin>>n;
people person[n]; //
p=person;
void whole(int n,people *p); //计算整个训练集的GINI指数
void ssex(int n,people *p); //计算性别的GINI指数
void car_typefunc(int n,people *p); //计算车型的GINI指数
void shirt_sizefunc(int n,people *p); //计算衬衣尺码的GINI指数
for(int i=0;i<n;i++)
{
person[i].id=i+1;
cin>>person[i].sex>>person[i].car_type>>person[i].shirt_size>>person[i].pclass;
}
whole(n,p);
ssex(n,p);
car_typefunc(n,p);
shirt_sizefunc(n,p);
return 0;
}
void whole(int n,people *p)
{
float a,b;
a=b=0;
for(int i=0;i<n;i++)
{
if((p+i)->sex=='M'||(p+i)->sex=='m') a++; //统计性别为男的个数
else b++; //统计性别为女的个数
}
a/=(float)n;b/=(float)n;a*=a;b*=b; //代入公式计算
cout<<"整个训练集的基尼指数为:"<<1-a-b<<endl;
}
int c0_count(int n,people *p) //计算c0类个数
{
int c0=0;
for(int i=0;i<n;i++)
{
if((p+i)->pclass==0) c0++;
}
return c0;
}
void ssex(int n,people *p)
{
float a1,a2,b1,b2,m,f,mg,fg,g; //a1、a2存放性别为男的在c0、c1中的个数,之后同理
int c0_count(int n,people *p);
int c0=c0_count(n,p);
int c1=n-c0;
a1=a2=b1=b2=0;
for(int i=0;i<c0;i++)
{
if((p+i)->sex=='m'||(p+i)->sex=='M') a1++;
else b1++;
}
for(int i=0;i<c1;i++)
{
if((p+c0+i)->sex=='m'||(p+c0+i)->sex=='M') a2++; //这边要注意c1在c0之后所以要记得加上一个c0的个数
else b2++;
}
m=a1+a2;f=b1+b2;
a1/=(float)m;b1/=(float)n;a2/=(float)m;b2/=(float)n;a1*=a1;a2*=a2;b1*=b1;b2*=b2;
m/=(float)n;f/=(float)n;
mg=1-a1-a2;
fg=1-b1-b2;
cout<<"Male GINI is "<<mg<<endl;
cout<<"Female GINI is "<<fg<<endl;
g=m*mg+(f*fg);
cout<<"Gender GINI is "<<g<<endl;
}
void car_typefunc(int n,people *p)
{
int c0_count(int n,people *p);
int c0=c0_count(n,p);
int c1=n-c0;
float a1,b1,d1,a2,b2,d2,f,s,l,fg,sg,lg,g;
a1=b1=d1=a2=b2=d2=0;
for(int i=0;i<c0;i++)
{
if((p+i)->car_type=="family") a1++;
else if((p+i)->car_type=="sports") b1++;
else d1++;
}
for(int i=0;i<c1;i++)
{
if((p+c0+i)->car_type=="family") a2++;
else if((p+c0+i)->car_type=="sports") b2++;
else d2++;
}
f=a1+a2;s=b1+b2;l=d1+d2;
a1/=(float)f;b1/=(float)s;d1/=(float)l;a2/=(float)f;b2/=(float)s;d2/=(float)l;a1*=a1;b1*=b1;d1*=d1;a2*=a2;b2*=b2;d2*=d2;
f/=(float)n;s/=(float)n;l/=(float)n;
fg=1-a1-a2;
sg=1-b1-b2;
lg=1-d1-d2;
cout<<"Family GINI is "<<fg<<endl;
cout<<"Sports GINI is "<<sg<<endl;
cout<<"Luxury GINI is "<<lg<<endl;
g=f*fg+(s*sg)+(l*lg);
cout<<"Car Type GINI is "<<g<<endl;
}
void shirt_sizefunc(int n,people *p)
{
int c0_count(int n,people *p);
int c0=c0_count(n,p);
int c1=n-c0;
float a1,b1,d1,e1,a2,b2,d2,e2,s,m,l,e,sg,mg,lg,eg,g;
a1=b1=d1=e1=a2=b2=d2=e2=0;
for(int i=0;i<c0;i++)
{
if((p+i)->shirt_size=="small") a1++;
else if((p+i)->shirt_size=="medium") b1++;
else if((p+i)->shirt_size=="large") d1++;
else e1++;
}
for(int i=0;i<c1;i++)
{
if((p+c0+i)->shirt_size=="small") a2++;
else if((p+c0+i)->shirt_size=="medium") b2++;
else if((p+c0+i)->shirt_size=="large") d2++;
else e2++;
}
s=a1+a2;m=b1+b2;l=d1+d2;e=e1+e2;
a1/=(float)s;b1/=(float)m;d1/=(float)l;e1/=(float)e;a2/=(float)s;b2/=(float)m;d2/=(float)l;e2/=(float)e;a1*=a1;b1*=b1;d1*=d1;e1*=e1;a2*=a2;b2*=b2;d2*=d2;e2*=e2;
s/=(float)n;m/=(float)n;l/=(float)n;e/=(float)n;
sg=1-a1-a2;
mg=1-b1-b2;
lg=1-d1-d2;
eg=1-e1-e2;
cout<<"Small GINI is "<<sg<<endl;
cout<<"Medium GINI is "<<mg<<endl;
cout<<"Large GINI is "<<lg<<endl;
cout<<"Extra Large GINI is "<<eg<<endl;
g=s*sg+(m*mg)+(l*lg)+(e*eg);
cout<<"Shirt Size GINI is "<<g<<endl;
}