感知机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这个库,

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值