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;
}


测试效果图如下:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值