单层感知器神经网络

来源:互联网 发布:苹果mac解压rar 编辑:程序博客网 时间:2024/09/21 08:58


/***********************************************************************/  /*  文件:MC_Neuron.h                                                  *//*  版权: 转载请注明来自mni2005的博客[http://blog.csdn.net/mni2005]    *//*  作者: 莫问                                                         */ /*  日期: 2014-06-04                                                   *//*  描述:单层感知器神经网络头文件                                      *//***********************************************************************/  #ifndef _AFX_MC_NEURON_INCLUDE_H_#define _AFX_MC_NEURON_INCLUDE_H_ class Neuron{public:Neuron();public:bool  Train(float expect, float mX1, float mX2);float Compute(float mX1, float mX2);void  GetWeight(float &mX1, float &mX2);private:float ActivateFunc(float fSum);private:float m_Weight[2];  //权值向量float m_Bias;       //偏差float m_alpha;      //学习速率 };#endif //_AFX_MC_NEURON_INCLUDE_H_ 

/***********************************************************************/  /*  文件:MC_Neuron.cpp                                                *//*  版权: 转载请注明来自mni2005的博客[http://blog.csdn.net/mni2005]    *//*  作者: 莫问                                                         */ /*  日期: 2014-06-04                                                   *//*  描述: 单层感知器神经网络实现                                       *//***********************************************************************/   #include "MC_Neuron.h"Neuron::Neuron(){m_Weight[0] = 0.01f;m_Weight[1] = 0.01f;m_Bias = 0.01f;m_alpha  = 0.01f;}//激活函数float Neuron::ActivateFunc(float Yn){if(Yn >=0.0f) { return 1.0f;  }else{return 0.0f;}}float Neuron::Compute(float mX0, float mX1){float Yn = m_Bias*1.0f + m_Weight[0]*mX0 + m_Weight[1]* mX1;return ActivateFunc(Yn);}void  Neuron::GetWeight(float &mX1, float &mX2){mX1 = m_Weight[0];mX2 = m_Weight[1];}bool Neuron::Train(float expect, float mX0, float mX1){float  Yn = Compute(mX0, mX1);//调整权值感知器向量if( Yn != expect ){m_Weight[0] += ( m_alpha * (expect - Yn) * mX0 );m_Weight[1] += ( m_alpha * (expect - Yn) * mX1 ); m_Bias      += ( m_alpha * (expect - Yn) * 1.0f ); return false;}return true;}



/***********************************************************************/  /*  文件:NeuronTest.cpp                                               *//*  版权: 转载请注明来自mni2005的博客[http://blog.csdn.net/mni2005]    *//*  作者: 莫问                                                         */ /*  日期: 2014-06-04                                                   *//*  描述: 用逻辑与或运算,完成单层感知器神经网络测试                   *//***********************************************************************/     #include <stdio.h>#include <stdlib.h>#include "MC_Neuron.h"int main(int argc, char* argv[]){ /*//逻辑与 训练样本 float slps[][3] = { {1.0, 1.0, 1.0}, {0.0, 1.0, 0.0},  {1.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, }; *///逻辑或 训练样本 float slps[][3] = { {1.0, 1.0, 1.0}, {0.0, 1.0, 1.0},  {1.0, 0.0, 1.0}, {0.0, 0.0, 0.0}, }; Neuron neuron;bool   bOK;//开始训练do{bOK = true;for (int i=0; i<4; i++){     float* pSlp = slps[i];   if(!neuron.Train(pSlp[2], pSlp[0], pSlp[1]))   {   bOK = false;   }}}while(!bOK);//训练结束,输出权值float weight1, weight2;neuron.GetWeight(weight1, weight2);printf("weight1=%f, weight2=%f\n", weight1, weight2);//验证感知器训练结果for (int i=0; i<4; i++){  float* pSlp = slps[i];float  fvalue = neuron.Compute(pSlp[0], pSlp[1]);printf("value=%f, expect=%f\n", fvalue, pSlp[2]);}system("pause");return 0;} 


0 0
原创粉丝点击