C语言实现单层感知器

根据perceptron 学习规则(Rosenblatt 提出 )用C语言实现单层感知器。代码如下。
#include<stdio.h>
#include<stdlib.h>

int nTrain=7;  //训练样本数量
int nInput=3; //训练样本维度
double delta=0.1;  //学习速率
int nTest=1; //测试样本数量
int maxItre =100;
typedef struct slp {
	int input[3];
	int output;
} slp_testData;

double com_output( int *input,double *weight)
{
	double sum=0.0;
	for(int i=0;i <nInput;i++)
	{
		sum= sum + (input[i] * weight[i]);
	}
	sum=sum - weight[nInput]*1.0;
	return sum;
}


//分类函数
int classOutPerceptron(double output)
{
	if (output >= 0)
		return 1 ;
	if (output < 0 )
		return -1;
}

//计算误差
int com_err(slp_testData *trainData,double *weight)
{
	int err=0,i;
	for(i=0;i<nTrain;i++)
	{
		err = err+ trainData[i].output - classOutPerceptron(com_output(trainData[i].input,weight));
	}
	return err;
}

int main(void)
{
	int i ,j,k,tempResu ;
	slp_testData trainData[7]=
	{
		{{1,0,0},-1},
		{{1,0,1},1},
		{{1,1,0},1},
		{{1,1,1},1},
		{{0,0,1},-1},
		{{0,1,0},-1},
		{{0,1,1},1},
	};
	slp_testData testData[1]=
	{
		{{0,0,0},-1},
	};
	double weights[4]={0.0,0.0,0.0,0.4};  //赋值权重,最后一位是偏移
	for(k=0;k<maxItre;k++)
	{
	for(i=0;i<nTrain;i++)
	{
		tempResu = classOutPerceptron(com_output(trainData[i].input,weights));

		for (j=0;j<nInput;j++)
		{
			weights[j] = weights[j] + ( delta*(trainData[i].output - tempResu)*trainData[i].input[j]);
		}
		weights[nInput] = weights[nInput] + delta*(trainData[i].output - tempResu);
	}
	}

	for (i=0;i<nTrain;i++)
        {
                printf("train[%d] .. %d\n",i,classOutPerceptron(com_output(trainData[i].input,weights)));
        }

	for (i=0;i<nTest;i++)
	{
		printf("test[%d] .. %d\n",i,classOutPerceptron(com_output(testData[i].input,weights)));
	}
	return 0;
}


测试效果图如下:


猜你喜欢

转载自blog.csdn.net/u013000139/article/details/52732798