c语言实现3层bp神经网络
2016-03-04 12:31
459 查看
#include <iostream>
using namespace std;
#include "math.h"
//#define e 2.718281828;
#define step 0.5
int W1[3][3] = { { 1, 2, 3 }, { 1, 0, 3 }, { 1, 2, -3 } };
int W2[3][2] = { { 1, 0 }, { -1, 1 }, { 1, 1 } };
int X[3] = { 1, -1, 1 };
int Y[2] = { 1, 1 };
double getf(float x)
{
double e = 2.718;
return (2 / (1 + pow(e, -x))) - 1;
}
double getJ(double *p1,int *p2,int i)
{
return p1[i] * (1 - p1[i])*(p1[i] - p2[i]);
}
void rukou()
{
double sum[3];
double sum1[2];
for (int i = 0; i < 3; i++)
{
float nsum = 0;
for (int j = 0; j < 3; j++)
{
nsum += W1[j][i]*X[j];
}
sum[i] = getf(nsum);
printf("%f\n",sum[i]);
}
for (int i = 0; i < 2; i++)
{
double nsum = 0;
for (int j = 0; j < 3; j++)
{
nsum += W2[j][i] * sum[j];
}
sum1[i] = getf(nsum);
printf("%f\n", sum[i]);
} //刚刚计算出了这些东西,需要进行回馈参数的修改。
//首先修改隐含层和输出之间的参数?。
//这时候需要存放di
double dik[2];
for (int i = 0; i < 2; i++)
{
double di = getJ(sum1,Y,i);
dik[i] = di;
for (int j = 0; j < 3; j++)
{
double cha = -step*di*sum[j];
W2[j][i] += cha;
}
}
for (int i = 0; i < 3; i++)
{
double yi = sum[i];
double he = 0;
for (int k = 0; k < 2; k++)
{
he += W2[i][k] * dik[k];
}
double di = yi*(1 - yi)*he;
for (int j = 0; j < 3; j++)
{
double cha=-step*X[j]*di;
W1[j][i] += cha;
}
} //现在输出调整后的参数
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
cout << i << " and " << j << "的参数为:" << W1[i][j] << endl;
}
}
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 2; j++)
{
cout << i << " and " << j << "的参数为:" << W1[i][j] << endl;
}
}
//现在修改输入与隐含层的参数关系。
int i;
cin >> i;
}
void he()
{
rukou();
}
using namespace std;
#include "math.h"
//#define e 2.718281828;
#define step 0.5
int W1[3][3] = { { 1, 2, 3 }, { 1, 0, 3 }, { 1, 2, -3 } };
int W2[3][2] = { { 1, 0 }, { -1, 1 }, { 1, 1 } };
int X[3] = { 1, -1, 1 };
int Y[2] = { 1, 1 };
double getf(float x)
{
double e = 2.718;
return (2 / (1 + pow(e, -x))) - 1;
}
double getJ(double *p1,int *p2,int i)
{
return p1[i] * (1 - p1[i])*(p1[i] - p2[i]);
}
void rukou()
{
double sum[3];
double sum1[2];
for (int i = 0; i < 3; i++)
{
float nsum = 0;
for (int j = 0; j < 3; j++)
{
nsum += W1[j][i]*X[j];
}
sum[i] = getf(nsum);
printf("%f\n",sum[i]);
}
for (int i = 0; i < 2; i++)
{
double nsum = 0;
for (int j = 0; j < 3; j++)
{
nsum += W2[j][i] * sum[j];
}
sum1[i] = getf(nsum);
printf("%f\n", sum[i]);
} //刚刚计算出了这些东西,需要进行回馈参数的修改。
//首先修改隐含层和输出之间的参数?。
//这时候需要存放di
double dik[2];
for (int i = 0; i < 2; i++)
{
double di = getJ(sum1,Y,i);
dik[i] = di;
for (int j = 0; j < 3; j++)
{
double cha = -step*di*sum[j];
W2[j][i] += cha;
}
}
for (int i = 0; i < 3; i++)
{
double yi = sum[i];
double he = 0;
for (int k = 0; k < 2; k++)
{
he += W2[i][k] * dik[k];
}
double di = yi*(1 - yi)*he;
for (int j = 0; j < 3; j++)
{
double cha=-step*X[j]*di;
W1[j][i] += cha;
}
} //现在输出调整后的参数
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
cout << i << " and " << j << "的参数为:" << W1[i][j] << endl;
}
}
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 2; j++)
{
cout << i << " and " << j << "的参数为:" << W1[i][j] << endl;
}
}
//现在修改输入与隐含层的参数关系。
int i;
cin >> i;
}
void he()
{
rukou();
}
相关文章推荐
- http协议的状态码——400,401,403,404,500,502,503,301,302等常见网页错误代码
- 最有效教程 eclipse下启动tomcat 访问http://localhost:8080时的404错误
- 《计算机网络》知识要点一
- 2016-3-4 linux虚拟机网络
- [BZOJ1834]网络扩容 做题笔记
- iOS开发之网络检测
- http状态码的含义
- HTTP权威指南 第四章 连接管理
- VMware虚拟机网络详解
- TCP协议中的三次握手和四次挥手
- Universal-Image-Loader,android-Volley,Picasso、Fresco和Glide五大Android开源组件加载网络图片比较
- Java https服务器证书认证问题解决方案
- TCP序列号和确认号详解
- IOS 快速将网络数据转化为所需的对象
- android tcp server
- iOS9 HTTP 不能正常使用的解决办法
- Distribution download cancelled. Using distribution from 'https://services.gradle.org/distributions/
- IP头、TCP头、UDP头详解以及定义
- java实现http多线程下载,断点回复
- xcode7.1 网路问题http/https NSAppTransportSecurity