感知机C语言实现

随手更新一下,给女朋友写的感知机作业,实现最简单的异或运算,别人的代码公式打错了,外加有语法错误,在其基础上改了改

#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这个库,

猜你喜欢

转载自blog.csdn.net/w372845589/article/details/80299490