• 简单感知器模型解决简单真值表问题


    实验四 简单感知器模型

    一、实验目的

    1. 掌握简单感知器模型的基本原理。

    2. 复习VBVC的基本概念、基本语法和编程方法,并熟练使用VBVC编写简单感知器模型程序。

    二、实验设备

    微机

    三、实验原理

    简单感知器模型的基本原理:将样本矢量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. 复习VBVC的基本概念、基本语法和编程方法。

    五、实验内容及步骤

    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

    2. 调试程序。

    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;
    }




  • 相关阅读:
    [ZJOI2010]count 数字计数
    小雄数
    简单筛法函数
    [Noip模拟题]lucky
    欧拉线筛
    Intern Day78
    CodeForces1360C
    CodeForces1373B
    Intern Day78
    Intern Day78
  • 原文地址:https://www.cnblogs.com/zhujinghui/p/3369244.html
Copyright © 2020-2023  润新知