全部评论
信息增益直接计算两个类的概率,计算信息熵就可以了吧
概率统计题,但是我也只过了66.67%
KL也是一样的,计算每个类的概率,按照公式把每一类加起来就可以
我感觉没有ac是因为精度问题,对于题目我觉得我的理解应该是对的
膜拜中,已经慌得不行,感觉没理解题目。。
三道题都是把公式打一遍
不明白为什么KL散度一直是66.7%?大佬有知道为什么么的吗
第一题信息熵稳定0%,劝退,第二题66.7%,第三题90%,选择随便选233
第一题,信息增益代码 #include <bits/stdc++.h>
#include <map>
#include <math.h>
using namespace std;
typedef struct data{
int clas[2];
}data;
int n;
map<int,data> mp;
int classify[2] = {0};
double cpt_entroy(int m[]){
int nu = m[0] + m[1];
double first = 0;
double second = 0;
if(m[0] != 0){
double tmp = 1.0 * m[0] / nu;
first = -1 * tmp * log(tmp) / log(2);
}
if(m[1] != 0){
double tmp = 1.0 * m[1] / nu;
second = -1 * tmp * log(tmp) / log(2);
}
double entroy = 1.0 * nu / n * (first + second);
return entroy;
}
int main() {
int a, b;
char indep;
cin >> n;
for(int i=0; i<n; ++i){
cin>>a>>indep>>b;
classify[b]++;
if(mp.find(a) == mp.end())
mp[a].clas[b] = 0;
mp[a].clas[b] += 1;
}
double gain_all = cpt_entroy(classify);
double ans = gain_all;
map<int, data>::iterator it;
for(it = mp.begin(); it != mp.end(); ++it) {
double pro = cpt_entroy(it->second.clas);
ans -= pro;
}
int dans = (ans + 0.005) * 100;
double res = double(dans) / 100;
printf("%.2f\n",res);
return 0;
}
相关推荐