machine learning 11
//compile:gcc 012.c -o 012 -lm #include <stdio.h> #include <math.h> #define N 3 double info(int c1,int c2){ int i; double list[2]; double pr_c1=(double)c1/(c1+c2),pr_c2=(double)c2/(c1+c2),result_info; if(c1==0||c2==0) result_info=0; else{ list[0]=pr_c1,list[1]=pr_c2; for (i=0;i<2;i++){ result_info += list[i]*log2(list[i]); //printf("list[i]=%f , result_info = %f\n", list[i], result_info); } } return (-1)*result_info; } double gain(int bunkatu){ //bunkatu:分割属性の種類の数 int i,c1,c2,sumnum[2]={0,0},beforec1,beforec2,num[bunkatu][2];//sumnum[0]:c1のすべての和,sumnum[1]:c2のすべての和,num[bunkatu][2]行をbunkatu数に対するc,列はc1,c2 //初期化 for(i=0;i<=bunkatu;++i){ num[i][0]=0; num[i][1]=0; } //bunkatuに対するc1,c2を入力し、配列num,sumnumに記憶。 for(i=bunkatu-1;i>=0;--i){ c1=0,c2=0; printf("c1:"); scanf("%d",&c1); //printf("c1:%d\n",c1); num[bunkatu-i-1][0]=c1; //printf("num[%d][0]=%d\n",bunkatu-i-1,num[bunkatu-i-1][0]); sumnum[0]+=c1;//○(第1列)の和 //printf("sumnum[0]:%d\n",sumnum[0]); printf("c2:"); scanf("%d",&c2); num[bunkatu-i-1][1]=c2; //printf("num[%d][1]=%d\n",bunkatu-i-1,num[bunkatu-i-1][1]); sumnum[1]+=c2;//×(第2列)の和 //printf("sumnum[1]:%d\n",sumnum[1]); //printf("i:%d\n",i); } double entropy=0.0,result_gain; int allsumnum; allsumnum=sumnum[0]+sumnum[1];//bunkatu数に対するc1,c2のすべての和 printf("allsumnum:%d\n",allsumnum); /////////////////////////////// for(i=0;i<bunkatu;++i){ //printf("(num[i][0]+num[i][1])/allsumnum:%f\n",(num[i][0]+num[i][1])/(double)allsumnum); sum+=((num[i][0]+num[i][1])/(double)allsumnum)*info(num[i][0],num[i][1]); //printf("num[%d][0]=%d\n",i,num[i][0]); //printf("num[%d][1]=%d\n",i,num[i][1]); //printf("sum:%f\n",sum); } printf("entropy:%f\n",entropy); //printf("gain=info(%d,%d)-sum:%f - %f\n",sumnum[0],sumnum[1],info(sumnum[0],sumnum[1]),sum); printf("gain=info(%d,%d)-sum=",sumnum[0],sumnum[1]); //printf("before c1,before c2:%d,%d\n",sumnum[0],sumnum[1]); result_gain = info(sumnum[0],sumnum[1])-sum; return result_gain; } int main(void) { int bunkatu; printf("bunkatu:",bunkatu); scanf("%d",&bunkatu); printf("%f\n",gain(bunkatu)); return 0; }
th4@th4-virtual-machine:~/ml11$ gcc 012.c -o 012 -lm
th4@th4-virtual-machine:~/ml11$ ./012
bunkatu:3
c1:2
c2:3
c1:4
c2:0
c1:3
c2:2
allsumnum:14
gain=info(9,5)-sum=0.246750
th4@th4-virtual-machine:~/ml11$