归一化
什么是归一化?
——将数据映射到[0, 1]或[-1, 1]区间或其他的区间。
为什么要归一化?
– ?输入数据的单位不一样,有些数据的范围可能特别大,导致的结果是神经网络收敛慢、训练时间长。
– ?数据范围大的输入在模式分类中的作用可能会偏大,而数据范围小的输入作用就可能会偏小。(防止数据湮灭等现象)
– ?由于神经网络输出层的激活函数的值域是有限制的,因此需要将网络训练的目标数据映射到激活函数的值域。例如神经网络的输出层若采用S形激活 函数,由于S形函数的值域限制在(0,1),也就是说神经网络的输出只能限制在(0,1),所以训练数据的输出就要归一化到[0,1]区间。
– ?S形激活函数在(0,1)区间以外区域很平缓,区分度太小。例如S形函数f(X)在参数a=1时,f(100)与f(5)只相差0.0067。这样数据的差异就会失去意义!
归一化的算法:
y = ( x - min )/( max - min )? —— 【0,1】
– ?y = 2 * ( x - min ) / ( max - min ) - 1 —— 【-1,1】
训练集、验证集、测试集,什么关系?
在有监督(supervise)的机器学习中,数据集常被分成2~3个,即:训练集(train set) 验证集(validation set) 测试集(test set)。
一般需要将样本分成独立的三部分训练集(train set),验证集(validation set)和测试集(test set)。其中训练集用来估计模型,验证集用来确定网络结构或者控制模型复杂程度的参数,而测试集则检验最终选择最优的模型的性能如何。一个典型的划分是训练集占总样本的50%,而其它各占25%,三部分都是从样本中随机抽取。
样本少的时候,上面的划分就不合适了。常用的是留少部分做测试集。然后对其余N个样本采用K折交叉验证法。就是将样本打乱,然后均匀分成K份,轮流选择其中K-1份训练,剩余的一份做验证,计算预测误差平方和,最后把K次的预测误差平方和再做平均作为选择最优模型结构的依据。特别的K取N,就是留一法(leave one out)。
BP网络的MATLAB实践
重点函数解读:
mapminmax
– ?Process matrices by mapping row minimum and maximum values to [-1 1]
– ?[Y, PS] = mapminmax(X, YMIN, YMAX)? 归一化的信息保存到结构体PS中(自定义MIN,MAX范围)
– ?Y = mapminmax('apply', X, PS)? 已知的归一化规则PS用于归一化其他信息
– ?X = mapminmax('reverse', Y, PS)? 反归一化
newff
– ?Create feed-forward backpropagation network? 创建前向型神经网络
– ?net = newff(P, T, [S1 S2...S(N-l)], {TF1 TF2...TFNl}, BTF, BLF, PF, IPF, OPF, DDF)? 输入样本、输出样本、传递函数……等其他参数。
train
– ?Train neural network? 训练神经网络
– ?[net, tr, Y, E, Pf, Af] = train(net, P, T, Pi, Ai)
sim??
– Simulate neural network 模拟预测
– [Y, Pf, Af, E, perf] = sim(net, P, Pi, Ai, T)? Y即最终预测的输出
参数对BP神经网络性能的影响:
1、隐含层神经元节点个数??
可以手动调整为其他个数,查看预测结果。
2、激活函数类型的选择 ?
newff里会默认设计好(tansig,双S型),还可以是其他函数。
3、学习率?——参考网络资料。
4、初始权值与阈值:
今后可以利用遗传算法对权值和阈值进行优化。
手动操作推荐方法:
1、交叉验证(cross validation):训练集(training set)+验证集(validation set)+测试集(testing set)。保证足够的样本,可以分到这三波里。
2、留一法(Leave one out, LOO):如果样本数据较少时使用。每一次都留一个样本做预测,其他用于训练。