随手更新一下,给女朋友写的感知机作业,实现最简单的异或运算,别人的代码公式打错了,外加有语法错误,在其基础上改了改
#include<stdio.h>
#include<stdlib.h>int nTrain=4; //训练样本数量,你的就4个,
int nInput=2; //训练样本维度 维度,你的就是二维 e.g [1,0]
double delta=0.1; //学习速率
int nTest=1; //测试样本数量
int maxItre =100;
typedef struct slp
{
int input[2];//二维数组
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.5)
return 1 ;
if (output < 0.5 )
return 0;
}
//计算误差
int main(void)
{
int i,j,k,tempResu ;
slp_testData trainData[4]=
{
{{0,0},0}, //{0,0}时,输出0
{{1,0},1},
{{0,1},1},
{{1,1},1},
}; //这是你的训练样本,4个,二维
slp_testData testData[1]=
{
{{0,0},0}, //这是用来测试的,你可以改成自己输入测试
};
double weights[3]={0.0,0.0,0.0}; //赋值权重,最后一位是偏移 偏移就是书上的b
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循环是更新权重,不用管
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)));
}
for(i=0; i<3; i++)
printf("%f ",weights[i]);
return 0;
return 0;
}
ps:写这个代码想起来,接下来应该抽时间学学scikit-learn这个库,