简单感知器模型解决简单真值表问题
2012-11-04 10:59
274 查看
实验四 简单感知器模型
一、实验目的
1. 掌握简单感知器模型的基本原理。
2. 复习VB、VC的基本概念、基本语法和编程方法,并熟练使用VB、VC编写简单感知器模型程序。
二、实验设备
微机
三、实验原理
简单感知器模型的基本原理:将样本矢量X输入到感知器中,得到实际输出y,再用y与期望输出d的差来修正下一步的权值。
感知器中神经元定义如下:
感知器的连接权定义为可变化的,感知器的训练(学习)是通过监督学习过程来实现的。简单感知器引入的学习算法称为误差学习算法,该算法步骤如下:
①选择一组初始权值wi(0);
②计算输入样本Xj所对应的实际输出y(t)与期望输出dj的误差dj=|dj-y(t)|;
③如果dj小于阈值T1,转第⑤步;否则继续;
④更新权值:
。式中,wi(t)是第t步时神经元间的连接权,阈值可视为输入恒为-1的一个权值;η称为学习步长,是区间(0, 1)上的一个数,它的取值与训练速度和w收敛的稳定性有关,η可以是常数,但为了改进收敛速度,也可以采用变步长。
式中,a是一个正的常数。
⑤若所有样本都学习完成,计算所有样本误差之和
,如果E小于阈值T2,学习结束;否则,转到第②步。
四、预习要求
1. 认真阅读教材中简单感知器模型的基本原理。
2. 复习VB、VC的基本概念、基本语法和编程方法。
五、实验内容及步骤
1. 上机编写程序,在简单感知器上,,用误差学习算法实现真值表。
2. 调试程序。
3. 根据实验结果,写实验报告。
实验代码::::::::::::::
一、实验目的
1. 掌握简单感知器模型的基本原理。
2. 复习VB、VC的基本概念、基本语法和编程方法,并熟练使用VB、VC编写简单感知器模型程序。
二、实验设备
微机
三、实验原理
简单感知器模型的基本原理:将样本矢量X输入到感知器中,得到实际输出y,再用y与期望输出d的差来修正下一步的权值。
感知器中神经元定义如下:
感知器的连接权定义为可变化的,感知器的训练(学习)是通过监督学习过程来实现的。简单感知器引入的学习算法称为误差学习算法,该算法步骤如下:
①选择一组初始权值wi(0);
②计算输入样本Xj所对应的实际输出y(t)与期望输出dj的误差dj=|dj-y(t)|;
③如果dj小于阈值T1,转第⑤步;否则继续;
④更新权值:
。式中,wi(t)是第t步时神经元间的连接权,阈值可视为输入恒为-1的一个权值;η称为学习步长,是区间(0, 1)上的一个数,它的取值与训练速度和w收敛的稳定性有关,η可以是常数,但为了改进收敛速度,也可以采用变步长。
式中,a是一个正的常数。
⑤若所有样本都学习完成,计算所有样本误差之和
,如果E小于阈值T2,学习结束;否则,转到第②步。
四、预习要求
1. 认真阅读教材中简单感知器模型的基本原理。
2. 复习VB、VC的基本概念、基本语法和编程方法。
五、实验内容及步骤
1. 上机编写程序,在简单感知器上,,用误差学习算法实现真值表。
x1 | x2 | y=x1Ùx2 | y=x1Úx2 | y=Øx1 |
0 | 0 | 0 | 0 | 1 |
0 | 1 | 0 | 1 | 1 |
1 | 0 | 0 | 1 | 0 |
1 | 1 | 1 | 1 | 0 |
3. 根据实验结果,写实验报告。
实验代码::::::::::::::
#include <stdio.h> int x[5][3]; //输入数组 int y[5]; //期望输出 double w[5][3]; //权值 double n_la = 0.1 ;//步长 const int a_la = 1;//固定正常数 const double DELTA_T1 = 0.0;//总误差阀值 const double DELTA_T2 = 0.0;//小计算阀值 void intit() {//初始化真值表输入 int i; for(i=0; i<4; i++) x[i][0] = -1;//第一项都为-1 x[0][1] = 0; x[0][2] = 0; x[1][1] = 0; x[1][2] = 1; x[2][1] = 1; x[2][2] = 0; x[3][1] = 1; x[3][2] = 1; //输入期望值 printf("请输入4个期望输入\n"); for(i=0; i<4; i++) scanf("%d", &y[i]); //初始化权值 w[0][0]=0.5; w[0][1]=0; w[0][2]=0; } double my_fabs(double temp) {//取绝对值函数 if(temp < 0) return -temp; return temp; } int sgn(double temp) {//f函数 if(temp >= 0) return 1; return 0; } void sa() {//主要实现函数 double sum, delta_sum, yk, yk_temp; int i, k; while(1) { delta_sum=0; //记录总误差 for(k=0; k<4; k++) { for(i=0, sum=0; i<3; i++) sum += w[k][i]*x[k][i]; n_la = 0.5*(my_fabs(sum) + a_la);//计算变步长 yk = sgn(sum); if(my_fabs(y[k]- yk)<DELTA_T2) {//期望和实际相等 yk_temp = 0; } else {//期望和实际不相等 delta_sum+=my_fabs(y[k]-yk); yk_temp = n_la * (y[k]-yk); } if(k < 3) {//向后更新 for(i=0; i<3; i++) { w[k+1][i] = yk_temp*x[k][i] + w[k][i]; } } else {//轮到最后向第一个更新 for(i=0; i<3; i++) { w[0][i] = yk_temp*x[k][i] + w[k][i]; } } } if(delta_sum <= DELTA_T1) break; } } void output() {//输出权值 int i; printf("输出一下权值先\n"); for(i=0; i<3; i++) printf("w[%d]=%.2lf ",i,w[0][i]); printf("\n"); } void test() {//测试一下权值 int i; int a[3]; printf("测试输入x1,x2 "); a[0] = -1; double ys=0; scanf("%d%d", &a[1], &a[2]); for(i=0; i<3; i++) ys += w[0][i]*a[i]; ys = sgn(ys); printf("测试出y=%0.lf\n", ys); } int main() { int i, j; for(i=0; i<3; i++) {//三种总情况 intit(); sa(); output(); for(j=0; j<4; j++)//四种输入情况 test(); } return 0; }
相关文章推荐
- 简单感知器模型解决简单真值表问题
- ubuntu 14.04 glade 联编,(超简单的模型),哪些问题,怎么解决?
- 几个简单的mysql命令就可以解决的问题
- 《解决问题1000.1》又是I2C驱动问题,产品应用上一个问题,非常简单,也比较典型,记录一下
- 完美简单的解决Android Studio导入项目的Gradle问题(超简单)
- CSS兼容性解决方法(盒模型)- !important的IE7,Firefox问题 最终解决方法
- ztree的简单使用及常见问题解决 递归所有节点
- 今天在使用iscroll4 做一个简单触屏滚动demo,发现上下拖动的时候总是会回弹,不能看到下面的内容.这个问题苦恼了很久,终于解决
- 简单解决返回上一个Activity中的adapter数据刷新问题
- Struts分页问题之简单解决
- 简单的解决引导页Viewpager卡顿问题
- 解决列表框更新数据的时候的闪烁问题(VC防止窗口及其控件(如CListCtrl)闪烁的简单方法(一组有用的宏) )
- 五大Linux简单命令解决系统性能问题
- 最简单方法解决RCP程序UTF-8编码问题
- 编写xorg.conf,简单三行解决ubuntu分辩率不可调的问题
- 这个女人不简单,解决了大数据重大问题
- 五大Linux简单命令 帮你解决性能问题
- onMeasure简单方法 完美解决ListView与ScollView冲突问题!
- 关于笔记本电脑网卡出问题的简单解决
- 解决问题是从简单到复杂再回归简单的过程