hjr-BP神经元网络算法

BP算法

首先使用了ASP.NET的AForge.Neuro库
作用:输入一组参数,自动预测出结论
过程:构建网络->训练->预测

构建网络

构建网络需要三部分,输入节层点数,隐层节点数,输出层节点数,有了这三个数就可以构建一个BP神经网络了。
那么这三个数怎么确定呢?

输入层节数确定

等于传入参数的种类数,那么传入参数是什么呢?

这组参数应该为你要预测的东西的几个有代表性的属性,比如你要用神经网络预测一个人生了什么病,那么,这个人的,体温、脉搏频率、血液内某物质含量三个代表性参数就作为输入,然后他到底得了什么病就作为输出。

比如你要预测老师点不点名,那么今天气温、你今天的运势指数作为参数输入,点名与否作为输出(如果这两个个参数对老师有影响的话),总之就是对输出有影响的几个代表性的参数作为输入。

这两个例子的输入节点数分别为3个和2个

隐层节点数用公式确定

这是隐层节点数确定的三个公式

//yin_layout---隐层节点数,input_layout---输入层节点数,output_layout---输出层层节点数
Random ran=new Random();//例化随机数

yin_layout = Math.Sqrt(input_layout+output_layout)+ ran.Next(1,10);//第一个公式

yin_layout = Math.Log(input_layout, 2); //第二个公式 

yin_layout = Math.Sqrt(input_layout*output_layout);//第三个公式 

也就是说隐层节点数由输入层节点数与输出层节点数决定(输入层和输出层节点数是固定的)。

输出层节点数

这取决与你要预测什么,比如你要预测一个人生了什么病,你需要先确定有几个可能得的病,比如一共8种病那么就是8种输出,用三位二进制编码就足够了

【000,001,010,011,100,101,110,111】(学过二进制的应该都能看懂),所以输出节点数有3个,比如你要预测老师上课点不点名,那么只有两种可能输出。

【0,1】用一位二进制编码就足够了,所以输出节点是一个。
接下来只需要把这三个参数传入这个方法就行了

network = new ActivationNetwork(new SigmoidFunction(),input_layout,yin_layout, output_layout;//构建网络

这个是用sigmoid作为激活函数构建的,这样第一步构建网络就完成了,下面进行第二步

训练

训练就是用很多对正确的输入输出样本去训练你的网络,让他自己学习改进,然后使接下来的预测更准。

还拿之前的例子比如你输入了1000条人体三个参数与得病种类一一对应的样本(这个必须是已经发生的统计出的正确的样本),然后把他们都放到二维数组里。

Double[][] input_test = new Double[entries_num][species_num];
Double[][] output_test = new Double[entries_num][result_num];

test_entries为训练样本条数,如果是我们这个例子,那么他的值就为1000。

species_num为输入参数数种类数,如果是我们这个例子,那么他的值就为3。

result_num为输出结果种类数,如果是我们这个例子,那么他的值就为8。

如果是点名那个例子的话那么species_num为2,result_num为2。

归一化

然后把输入数据归一化,归一化就是把所有数据变成0–1之间的数,为什么要归一化呢?

其实就是为了去除单位,比如今天温度为10(度),你的运势指数为1000000000(运)(如果有“运”这种单位的话)那么这两个数据输入进去了明显不科学,所以都变成0–1之间没单位的数就科学了,这个是归一化方法。

private static double premnmx(double num, double min, double max)//num是你要归一化的数据,min是几种参数中最小的值,max是几种参数中最大的值
    {
        if (num > max)
            num = max;
        if (num < min)
            num = min;
        return (num - min) / (max - min);
    }

这样返回出的值就是已经把num归一化后的值,归一化后重新放到这个数组input_test[][],然后设定几个训练的参数

BackPropagationLearning teacher = new BackPropagationLearning(network);
teacher.LearningRate = 0.1;//学习率
teacher.Momentum = 0;//权重变化率
int iterations = 0;//训练次数
学习率是【0-1】之间的数
设定完几个主要训练参数后就可以吧输入数组与输出数组传入这个方法
while(iteration>iterations)
{
error = teacher.RunEpoch(input, output);
iteration++;
}

这样你所构建的神经网络就会根据你刚刚输入的样本数据和设定的训练参数进行训练。好了现在训练结束,进入第三步利用你训练出的阀值权值模型进行预测。

预测

预测就是可以拿出一组输入数据输入进去然后程序就会给你预测出一个结果,由于已经用了1000条正确的输入输出数据进行训练了,程序已经保存了一组阀值权值,输入后他就会使用那组阀值权值矩阵进行计算然后得出一个输出。

需要注意你的想要让程序预测的输入数据也需要先进行归一化
double[] result = network.Compute(inp);//inp[]是你输入的那几个参数的一维数组

如果用预测生病的例子那么长度为3,result[]数组的长度就是输出节点数长度为3,这里输出的结果都为【0–1】之间的数并且还是三位的,可以随便一个四舍五入就把数变为0和1,然后在反编码,就得出你之前把结果【000,001,010,011,100,101,110,111】编码后对应的反过来确定的真正生病的种类。如果想要的到权值阀值的矩阵可以这么做

ActivationLayer layer_iy = network[0];//输入-隐层
ActivationLayer layer_oy = network[1];//隐层-输出
layer_iy[x].Threshold//输入- 隐层阀值
layer_oy[z].Threshold//隐层-输出阀值
layer_iy[x][y]//输入- 隐层权值矩阵
layer_oy[y][z]//隐层-输出权值矩阵
//x输入层节点数,y为隐层节点数,z为输出层节点数

这样一个sigmoid作为激活函数的BP神经网络算法就完成了,可以利用训练好的阀值权值矩阵去预测输出了!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

架构师小侯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值