INFINITY -数学とかプログラミングとか-

統計とプログラムを使って役に立たせたい

TeX用コマンド入力を支援するための辞書をご利用ください。
sanctuary's blogは,適当なことが書いてあります。

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$