#include "iostream.h"
#include "math.h"
/* 定义训练集 */
typedef double vector[4];
vector v[] = {{1,0,1,0},{0,0,1,1},{0,1,1,0},{1,1,1,1}};
double w[3][3] = {{0.2,-0.2,0},{0.1,0.3,-0.1},{0.3,-0.2,-0.1}}; //权重初始化
double f[3]; //sigmoid输出
double d[3]; //基数
double last[4] = {0.0,0.0,0.0,0.0}; //上一次的偏差
double curr[4] ; //最新的偏差
double sig(double s)
{
double f=1/(1+exp(-s));
return f;
}
double judge(double s)
{
if(s>=0)return 1.0;
else return 0.0;
}
int amod(int k)
{
k++;
if(k>=4)
k%=4;
return k;
}
void main()
{
int i=0,j=0,t,k,index=0;
bool flag = true;
while(flag)
{
for(t=0;t<4;t++)
{
for(i = 0;i<3;i++)
f[i] = 0;
for(i=0;i<3;i++)
{
f[0] += v[t][i]*w[0][i];
f[1] += v[t][i]*w[1][i];
}
f[0] = sig(f[0]);
f[1] = sig(f[1]);
f[2] =sig( f[0]*w[2][0]+f[1]*w[2][1]+w[2][2]);
curr[t] = fabs(f[2]-v[t][3]);
d[2] = (v[t][3]-f[2])*f[2]*(1-f[2]);
for(i=0;i<2;i++)
d[i] = f[i]*(1-f[i])*d[2]*w[2][i];
for(i=0;i<2;i++)
for(j =0;j<3;j++)
w[i][j] += d[i]*v[t][j];
w[2][0] += d[2] *f[0];
w[2][1] += d[2]*f[1];
w[2][2] += d[2];
}
for(k=0;k<4;k++)
{
if(fabs(curr[k]-last[k])>1.0e-5) //偏差控制
break;
}
if(k==4)
flag = false;
else
{
for(i =0;i<4;i++)
last[i] = curr[i];
}
}
for(i=0;i<3;i++)
{
cout<<"第"<<i<<"个TLU单元的权向量: ";
for(j =0;j<3;j++)
cout<<w[i][j]<<"\t\t";
cout<<endl;
}
for(t = 0;t<4;t++)
{
for(i = 0;i<3;i++)
f[i]=0;
for(i=0;i<3;i++)
{
f[0] += v[t][i]*w[0][i];
f[1] += v[t][i]*w[1][i];
}
f[0] = judge(f[0]);f[1] = judge(f[1]);
f[2] =judge( f[0]*w[2][0]+f[1]*w[2][1]+w[2][2]);
cout<<"第"<<++index<<"个样本的最终输出: ";
cout<<f[2]<<endl;
}
}
评论0