続1層のニューラルネットワーク

ソースを整理。
今夜あたり2層にしてバックプロパゲーションをやってみよう

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>

const float alpha=0.02;
enum { inputs=3 };
float w[inputs];

float sigmoid(float x)
{
	return 1.0/(1.0+exp(-x));
} 
float dsigmoid(float x)
{
	float z=sigmoid(x);
	return z*(1.0-z);
}
float nn(int x[],int teach)
{
	for(int i=0;i<inputs-1;i++) if(x[i]==0) x[i]=-1;

	//出力計算
	float z0 = 0;
	for(int i=0;i<inputs;i++) z0 += w[i]*x[i];
	float z=sigmoid(z0);

	//誤差計算
	float err0 = (teach - z);
	float err = err0*err0;

	//誤差をパラメーターw毎に微分計算
	float derr_dw[inputs];
	for(int i=0;i<inputs;i++) derr_dw[i] = err0 * dsigmoid(z0)*x[i];

	//パラメーターw更新
	for(int i=0;i<inputs;i++) w[i] += alpha * derr_dw[i];

	printf("x=");
	for(int i=0;i<inputs;i++) printf("%+2d,",x[i] );
	printf("w=");
	for(int i=0;i<inputs;i++) printf("%5.2f,",w[i] );
	printf("\n teach=%d z0=%5.2f z=%5.2f err0=%5.2f err=%5.4f \n", teach, z0,z ,err0,err );

	return z;
}

void main()
{
	srand((unsigned) time(NULL));

	int x[inputs];

	for(int step=0;;step++)
	{
		for(int i=0;i<inputs-1;i++) x[i]=rand()%2;
		x[inputs-1]=1;

		int teach=x[0]&x[1];

		printf("%d:",step);
		float z = nn(x,teach);
	}
}