神经网络感知器的C语言实现

2019-07-21 04:14发布

感知器是人工神经网络中的一种典型结构, 它的主要的特点是结构简单,对所能解决的问题 存在着收敛算法,并能从数学上严格证明,从而对神经网络研究起了重要的推动作用。
感知器使用特征向量来表示的前馈式人工神经网络,它是一种二元分类器,把矩阵上的输入(实数值向量)映射到输出值
上(一个二元的值)。

数学表达式

是实数的表式权重的向量,
点积
是偏置,一个不依赖于任何输入值的常数。偏置可以认为是激励函数的偏移量,或者给神经元一个基础活跃等级。


(0 或 1)用于对进行分类,看它是肯定的还是否定的,这属于二元分类问题。如果
是负的,那么加权后的输入必须产生一个肯定的值并且大于
,这样才能令分类神经元大于阈值0。从空间上看,偏置改变了决策边界的位置(虽然不是定向的)。

由于输入直接经过权重关系转换为输出,所以感知机可以被视为最简单形式的前馈式人工神经网络。

本文使用C语言编写神经元网络算法,实现与或模式的识别。神经网络层只有一层,且只有一个神经元,算法比较简单,非常适合理解与学习。关于多层感知器,实现更复杂的功能,本人会在接下来的时间里慢慢实现。一下为单个神经元的学习与训练。为监督学习模式
// perceptron.cpp : Defines the entry point for the console application.
//神经元算法(简单感知器)




#include "stdio.h"


//单个神经元定义
typedef struct per_Cell_one
{
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
2条回答
周亚龙
1楼-- · 2019-07-21 05:26
// perceptron.cpp : Defines the entry point for the console application. //神经元算法(简单感知器)   #include "stdio.h"  //单个神经元定义 typedef struct per_Cell_one  {         float wq[2];                    //输入权值         float intput[2];                //输入信号         float threshold;                //神经元阈值         float output;                        //神经元输出         float g;                                //神经元的训练速度 }per_Cell_one;  int per_init(per_Cell_one *cell)    //神经元初始化 {         cell->threshold = 1;                //设计阈值为1         cell->wq[0] = 0;         cell->wq[1] = 0;                        //设计两个输入权值         cell->g = 0.5;                                //学习速率         return 1; } float per_Calculation(float intput[2],per_Cell_one *cell)                                //神经元输出推导 {         float net;         //输出公式 out = 求和(wq[i] * x[i] - threshold)         if(cell->wq[0] * intput[0] + cell->wq[1] * intput[1] >= cell->threshold)         net = 1;         else net = 0;                  return net; } //双输入训练感知机 int train_pre(float intput[4][2],float outtput[4],per_Cell_one *cell)   //训练感知机 {         int i = 0;         float ss[2];         float err = 0;         for(i = 0;i < 4;i++)         {                 ss[0] = intput[i][0];                 ss[1] = intput[i][1];             err = outtput[i] - per_Calculation(ss,cell);           //训练 求误差                 //权值修正                 cell -> wq[0] = cell -> wq[0] + err * intput[i][0] * cell->g;                   cell -> wq[1] = cell -> wq[1] + err * intput[i][1] * cell->g;                 //阈值修正                 cell->threshold = cell->threshold - err * cell->g;         }         //学习完毕         return 1; } //简单感知器参数输出 void Output_parameter(per_Cell_one *cell) {         printf("/****这是一个简单感知器****/ ");         printf("/****仅有一个神经元构成****/ ");         printf("权值 1 2 %f %f ",cell->wq[0],cell->wq[1]);         printf("神经元阈值 %f ",cell->threshold);         printf("学习速度 %f ",cell->g);  } int main() {     per_Cell_one cell;   //定义一个神经元         //设计训练数组         float And_intput[4][2] = {{0,0},{0,1},{1,0},{1,1}};         float And_output[4] = {0,0,0,1};          float Or_intput[4][2] = {{0,0},{0,1},{1,0},{1,1}};         float Or_output[4] = {0,1,1,1};          float aa[2] = {1,1};         int i = 0;         float out = 0;            per_init(&cell);   //初始化神经元          Output_parameter(&cell);           out = per_Calculation(aa,&cell); //没训练之前的输出          printf("/****没训练之前的输出****/ ");          printf("%f ",out);                    for(i = 0;i < 20;i++)          train_pre(And_intput,And_output,&cell);                //训练神经元           out = per_Calculation(aa,&cell); //训练之后的输出          printf("/****训练之后的输出****/ ");          printf("%f ",out);          Output_parameter(&cell);          return 0;  }
周亚龙
2楼-- · 2019-07-21 07:13
我去,文字长度有限制