由于最近在学习数学建模,在解决预测性问题的时候接触了这个算法。学习了一点基础知识,本文就当作是我的一点心得体会吧,还望前面的你不要见笑。
一个系统有多个输入,假设他只能输出0或者1。当所有输入都是1,那么输出结果也是1,假设输入都是0,那么输出结果也是0。那么问题来了,当输入不全为0或为1的时候呢?
此时,需要将输入的每个值附一个权重,我们约定当系统到达某一阈值时,便输出1。而阈值和权重的选取就是关键了,
系统用数学公式简单的描述为:
$net_i=\sum(x_i)w_i$
$y_i=f(net_i)$
f称为激活函数,常见的激活函数分为两类:线性与非线性。而线性激活函数使用范围较窄。下面简单介绍一下:
表达式 | matlab函数 | |
---|---|---|
线性函数 | $f(x)=k*x+c$ | purelin |
阈值函数 | $f(x)= \begin{cases} 1 &\mbox{x>c}\ 0 &\mbox{x<c}\end{cases}$ | ddencmp、thselect、wbmpen、wwdcbm |
s形函数 | $f(x)=\frac{1}{1+e^{-ax}}$ | logsig |
双极s形函数 | $f(x)=\frac{2}{1+e^{-ax}} -1$ | tansig |
目前为止,这权重和阈值都是主观给出的,但现实中很难估计它们的值,必需有一种方法,可以找出答案。
这种方法就是试错法。其他参数都不变,w
(或b
)的微小变动,记作Δw
(或Δb
),然后观察输出有什么变化。不断重复这个过程,直至得到对应最精确输出的那组w
和b
,就是我们要的值。这个过程称为模型的训练。
1.数据预处理
一般是将数据归一化处理,处理公式为:
1).$y_{ij}= \frac{x_{ij}-min(x_j)}{max(x_j)-min(x_j)}$, ps:$x_j$代表该数据对应的列(当激活函数为s形函数时适用)
2).$y_{ij}= \frac{2*(x_{ij}-minx_j)}{max(x_j)-min(x_j)}$,(当激活函数为双极s形函数时适用)
3).采用matlab预处理数据:一般采用这三个函数:premnmx , postmnmx , tramnmx
语法 | 作用 | |
---|---|---|
premnmx | [pn,minp,maxp,tn,mint,maxt] $^{[1]}$=premnmx(p,t) | 将网络的输入和输出数据进行归一化,归一化后的数据将分布在[-1,1]间 |
postmnmx | [p,t]=postmnmx(pn,minp,maxp,tn,mint,maxt)$^{[2]}$ | 将数据反归一化得到真实数据 |
tramnmx | [pn]=tramnmx(p,minp,maxp)$^{[3]}$ | 用于归一化处理待分类的输入数据 |
参数及其含义:
[1]:
pn:p矩阵按行归一化后的矩阵
minp,maxp:p矩阵每一行的最小值,最大值
tn:t矩阵按行归一化后的矩阵
mint,maxt:t矩阵每一行的最小值,最大值
[2]:
minp,maxp:p矩阵每行的最小值,最大值
mint,maxt:t矩阵每行的最小值,最大值
[3]:
minp,maxp:矩阵的最小,最大值
pn:归一化后的矩阵
2.matlab编程实现
1).首先介绍3个必要的函数:
名称 | 语法 | |
---|---|---|
newff | 前馈网络创建函数 | net=newff(A,B,{C},’trainFun’)$^{[1]}$ |
train | 网络训练学习函数。 | [net,tr,Y1,E]=train(net,x,y) $^{[2]}$ |
sim | 仿真函数 | Y=sim(net,x)$^{[3]}$ |
参数及其含义:
[1]
A:N*2的矩阵,第i行元素为输入信号xi的最小值和最大值
B:一个k维行向量,包含网络中各层节点数
C:一个k维字符串行向量,每一分量为对应层神经元的激活函数
trainFun:训练算法,
[2]:
X:网络实际输入
Y:网络应有输出
tr:训练跟踪信息
Y1:网络实际输出
E:误差矩阵
[3]:
net:网络
X:输入给网络的K*N矩阵,其中K为网络输入个数,N为数据样本数
Y:输出矩阵Q*N,其中Q为网络输出个数
2).网络配置参数
net.trainparam.goal:目标误差
net.trainparam.show:中间结果的周期
net.trainparam.epochs:最大迭代次数
net.trainparam.lr:学习率
3).实例
本文选取了桂林市发生火灾的7个样本的平均气温,日均相对湿度,日均风速,日均降水量,森林燃烧面积来预测样本8的森林燃烧面积。下面上代码:
1 | P=[20.5 19.5 24.5 19.1 18.9 22.4 22.3 |