您的位置:首页 > 理论基础 > 计算机网络

单层感知器神经网络

2014-06-05 11:40 323 查看
/***********************************************************************/
/*  文件: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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息