文章目录

  • BP推导全过程
    • 一些变量的含义
    • 一些公式
    • 开始推导
  • 任意层BP网络代码实现
    • 运行结果如

BP推导全过程

最近老师布置了一个神经网络的作业,正好练习下LaTeX,顺便写了这个博客
BP的整个过程还是很严谨的、LaTeX写公式也很好用,建议一步步跟着公式走
另外还配上了代码供食用,代码配公式、效果更好

一些变量的含义

这里的的网络采用三层感知机结构

以简单的sigmod函数如为例:
f ( x ) = 1 1 + e − x f ( x ) ′ = f ( x ) ( 1 − f ( x ) ) f (x)=\frac {1}{1+e^{-x}}\\ f(x)'=f(x)(1-f(x)) f(x)=1+e−x1​f(x)′=f(x)(1−f(x))
下面定义一些变量
输 入 向 量 X = ( x 1 , x 2 , ⋯ x n ) T 隐 层 输 出 向 量 Y = ( y 1 , y 2 , ⋯ y m ) T 输 入 层 到 隐 层 的 权 重 V V = ( V 1 , V 2 , ⋯ , V m ) 这 里 的 V j , j ∈ ( 1 , ⋯ , m ) 是 下 面 矩 阵 的 列 向 量 表 达 式 为 : f ( V j ⋅ X ) = Y j V = [ v 11 v 12 ⋯ v 1 m v 21 v 22 ⋯ v 2 m v 31 v 32 ⋯ v 3 m ⋯ ⋯ ⋯ ⋯ v n 1 v n 2 ⋯ v n m ] 输 出 层 向 量 O = ( o 1 , o 2 , ⋯ , o l ) T 真 实 标 签 D = ( d 1 , d 2 , ⋯ , d l ) T 隐 含 层 到 输 出 层 的 权 重 W W = ( W 1 , W 2 , ⋯ , W l ) W k , k ∈ ( 1 , ⋯ , l ) 为 下 面 矩 阵 的 第 k 个 列 向 量 W = [ w 11 w 12 ⋯ w 1 l w 21 w 22 ⋯ w 2 l w 31 w 32 ⋯ w 3 l ⋯ ⋯ ⋯ ⋯ w m 1 w n 2 ⋯ w m l ] 下 面 公 式 表 示 的 是 隐 藏 层 到 输 出 层 的 过 程 f ( W k ⋅ Y ) = O k 输入向量X=(x_1,x_2,\cdots x_n)^T \\ 隐层输出向量Y=(y_1,y_2,\cdots y_m)^T\\ 输入层到隐层的权重V\\ V=(V_1,V_2,\cdots,V_m)\\ 这里的V_j,j\in (1,\cdots,m)是下面矩阵的列向量\\ 表达式为:f(V_j \cdot X)=Y_j\\ V=\left[ \begin{array}{ccc} v_{11} & v_{12} & \cdots & v_{1m}\\ v_{21} & v_{22} & \cdots & v_{2m}\\ v_{31} & v_{32} & \cdots & v_{3m}\\ \cdots & \cdots&\cdots & \cdots \\ v_{n1} & v_{n2} & \cdots & v_{nm}\\ \end{array} \right]\\ \\ 输出层向量O=(o_1,o_2,\cdots,o_l)^{T}\\ 真实标签D=(d_1,d_2,\cdots,d_l)^T\\ 隐含层到输出层的权重W\\ W=(W_1,W_2,\cdots,W_l)\\ W_k,k\in(1,\cdots,l)为下面矩阵的第k个列向量\\ W=\left[ \begin{array}{ccc} w_{11} & w_{12} & \cdots & w_{1l}\\ w_{21} & w_{22} & \cdots & w_{2l}\\ w_{31} & w_{32} & \cdots & w_{3l}\\ \cdots & \cdots&\cdots & \cdots \\ w_{m1} & w_{n2} & \cdots & w_{ml}\\ \end{array} \right]\\ 下面公式表示的是隐藏层到输出层的过程 f(W_k\cdot Y)=O_k 输入向量X=(x1​,x2​,⋯xn​)T隐层输出向量Y=(y1​,y2​,⋯ym​)T输入层到隐层的权重VV=(V1​,V2​,⋯,Vm​)这里的Vj​,j∈(1,⋯,m)是下面矩阵的列向量表达式为:f(Vj​⋅X)=Yj​V=⎣⎢⎢⎢⎢⎡​v11​v21​v31​⋯vn1​​v12​v22​v32​⋯vn2​​⋯⋯⋯⋯⋯​v1m​v2m​v3m​⋯vnm​​⎦⎥⎥⎥⎥⎤​输出层向量O=(o1​,o2​,⋯,ol​)T真实标签D=(d1​,d2​,⋯,dl​)T隐含层到输出层的权重WW=(W1​,W2​,⋯,Wl​)Wk​,k∈(1,⋯,l)为下面矩阵的第k个列向量W=⎣⎢⎢⎢⎢⎡​w11​w21​w31​⋯wm1​​w12​w22​w32​⋯wn2​​⋯⋯⋯⋯⋯​w1l​w2l​w3l​⋯wml​​⎦⎥⎥⎥⎥⎤​下面公式表示的是隐藏层到输出层的过程f(Wk​⋅Y)=Ok​

一些公式

对于输出层有(后面两个式子不过是展开了内积而已,本质一样):
o k = f ( n e t k ) = f ( ∑ j = 0 m w j k y j ) = f ( W k Y ) ( 1 ) o_k=f(net_k)=f(\sum_{j=0}^mw_{jk}y_j)=f(W_kY) \quad \quad \quad (1) ok​=f(netk​)=f(j=0∑m​wjk​yj​)=f(Wk​Y)(1)
对于隐含层
y j = f ( n e t j ) = f ( ∑ i = 0 n v i j x i ) = f ( V j X ) ( 2 ) y_j=f(net_j)=f(\sum_{i=0}^nv_{ij}x_i)=f(V_jX) \quad \quad \quad (2) yj​=f(netj​)=f(i=0∑n​vij​xi​)=f(Vj​X)(2)
对于输出层的梯度更新公式:
输 出 层 梯 度 更 新 量 Δ w j k = − η ∂ E ∂ w j k w j k = w j k + Δ w j k = w j k − η ∂ E ∂ w j k ( 3 ) 输出层梯度更新量\quad\quad\Delta w_{jk}=-\eta \frac{\partial E}{\partial w_{jk}} \\ w_{jk}=w_{jk}+\Delta w_{jk}=w_{jk}-\eta\frac{\partial E}{\partial w_{jk}} \quad \quad(3) 输出层梯度更新量Δwjk​=−η∂wjk​∂E​wjk​=wjk​+Δwjk​=wjk​−η∂wjk​∂E​(3)
对于隐藏层的更新公式
隐 藏 层 梯 度 更 新 量 Δ v i j = − η ∂ E ∂ v i j v i j = v i j + Δ v i j = v i j − η ∂ E ∂ v i j ( 4 ) 隐藏层梯度更新量\quad\quad\Delta v_{ij}=-\eta \frac{\partial E}{\partial v_{ij}} \\ v_{ij}=v_{ij}+\Delta v_{ij}=v_{ij}-\eta\frac{\partial E}{\partial v_{ij}} \quad\quad\quad(4) 隐藏层梯度更新量Δvij​=−η∂vij​∂E​vij​=vij​+Δvij​=vij​−η∂vij​∂E​(4)
最后的误差公式的展开如下
E = 1 2 ∑ k = 1 l ( d k − o k ) 2 把 公 式 ( 1 ) ( 2 ) 带 入 = 1 2 ∑ k = 1 l ( d k − f [ ∑ j = 0 m w j k f ( n e t j ) ] ) 2 = 1 2 ∑ k = 1 l ( d k − f [ ∑ j = 0 m w j k f ( ∑ i = 0 n v i j x i ) ] ) 2 ( 5 ) E=\frac{1}{2}\sum_{k=1}^l(d_k-o_k)^2 \quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\\ 把公式(1)(2)带入\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\\ =\frac{1}{2}\sum_{k=1}^l(d_k-f[\sum_{j=0}^m w_{jk}f(net_j)])^2 \quad\quad\quad\quad\quad\quad\\ =\frac{1}{2} \sum_{k=1}^l (d_k-f[\sum_{j=0}^m w_{jk}f(\sum_{i=0}^nv_{ij}x_i)])^2\quad\quad\quad(5) E=21​k=1∑l​(dk​−ok​)2把公式(1)(2)带入=21​k=1∑l​(dk​−f[j=0∑m​wjk​f(netj​)])2=21​k=1∑l​(dk​−f[j=0∑m​wjk​f(i=0∑n​vij​xi​)])2(5)

开始推导

由上面的公式(3)(4)可知我们只要求出那两个梯度更新量就行了

  • 对于输出层的梯度更新量,我们利用链式求导可以得到下面的公式
    Δ w j k = − η ∂ E ∂ w j k = − η ∂ E ∂ n e t k ∂ n e t k ∂ w j k 由 公 式 ( 1 ) 可 知 ∂ n e t k ∂ w j k = y j 即 Δ w j k = − η ∂ E ∂ n e t k y j ( 6 ) \Delta w_{jk}=-\eta \frac{\partial E}{\partial w_{jk}}=-\eta\frac{\partial E}{\partial net_k}\frac{\partial net_k}{\partial w_{jk}}\\ 由公式(1)可知 \frac{\partial net_k}{\partial w_{jk}}=y_j\\ 即\Delta w_{jk}=-\eta\frac{\partial E}{\partial net_k}y_j \quad\quad\quad(6)\\ Δwjk​=−η∂wjk​∂E​=−η∂netk​∂E​∂wjk​∂netk​​由公式(1)可知∂wjk​∂netk​​=yj​即Δwjk​=−η∂netk​∂E​yj​(6)
  • 对于隐藏层的梯度更新量,也是如此
  • Δ v i j = − η ∂ E ∂ v i j = − η ∂ E ∂ n e t j ∂ n e t j ∂ v i j 由 公 式 ( 2 ) 可 知 ∂ n e t j ∂ v i j = x i 即 Δ v i j = − η ∂ E ∂ n e t j x i ( 7 ) 实 际 代 码 中 我 们 求 x i 和 y j 轻 轻 松 松 , 只 要 保 存 网 络 每 层 的 输 出 即 可 而 且 我 们 都 是 批 量 更 新 , 批 量 更 新 效 率 更 高 \Delta v_{ij}=-\eta \frac{\partial E}{\partial v_{ij}}=-\eta\frac{\partial E}{\partial net_j}\frac{\partial net_j}{\partial v_{ij}}\\ 由公式(2)可知 \frac{\partial net_j}{\partial v_{ij}}=x_i\\ 即\Delta v_{ij}=-\eta\frac{\partial E}{\partial net_j}x_i\quad\quad\quad(7)\\ 实际代码中我们求x_i 和y_j轻轻松松,只要保存网络每层的输出即可\\ 而且我们都是批量更新,批量更新效率更高 Δvij​=−η∂vij​∂E​=−η∂netj​∂E​∂vij​∂netj​​由公式(2)可知∂vij​∂netj​​=xi​即Δvij​=−η∂netj​∂E​xi​(7)实际代码中我们求xi​和yj​轻轻松松,只要保存网络每层的输出即可而且我们都是批量更新,批量更新效率更高
  • 所以我们只要求出下面两个公式即可求出对于每一层的梯度更新量
    我 们 把 − ∂ E ∂ n e t k 设 为 e r r o 意 思 为 输 出 层 的 误 差 信 号 再 把 − ∂ E ∂ n e t j 设 为 e r r y 意 思 为 隐 含 层 层 的 误 差 信 号 e r r o 和 e r r y 展 开 可 得 : e r r o = − ∂ E ∂ n e t k = − ∂ E ∂ o k ∂ o k ∂ n e t k 把 公 式 ( 1 ) ( 5 ) 代 入 上 公 式 可 得 e r r o = − ∂ E ∂ o k f ( n e t k ) ′ = ∑ k = 1 l ( d k − o k ) o k ( 1 − o k ) ( 8 ) 可 以 看 出 来 输 出 层 的 误 差 信 号 还 是 非 常 好 求 的 e r r y 稍 微 复 杂 点 , 我 们 还 是 先 把 他 展 开 e r r y = − ∂ E ∂ n e t j = − ∂ E ∂ y j ∂ y j ∂ n e t j = − ∂ E ∂ o k ∂ o k ∂ y j ∂ y j ∂ n e t j = − ∂ E ∂ o k ∂ o k ∂ n e t k ∂ n e t k ∂ y j ∂ y j ∂ n e t j 上 面 这 几 个 求 偏 导 的 公 式 都 有 我 们 只 需 要 带 入 公 式 ( 1 ) ( 2 ) ( 5 ) 可 得 e r r y = ∑ k = 0 l ( d k − o k ) ⋅ o k ( 1 − o k ) ⋅ w j k ⋅ y j ( 1 − y j ) ( 9 ) 我 们 观 察 可 以 发 现 e r r y 的 一 部 分 和 e r r o 一 模 一 样 , 所 以 把 公 式 ( 8 ) 带 入 ( 9 ) 得 e r r y = e r r o w j k y j ( 1 − y j ) ( 10 ) 对 于 写 代 码 来 说 , 我 们 只 要 求 出 e r r o 后 , 后 面 一 系 列 的 隐 藏 层 都 非 常 好 求 只 要 用 从 后 向 前 计 算 每 一 层 的 误 差 信 号 即 可 我们把-\frac{\partial E}{\partial net_k}设为err_o\quad意思为输出层的误差信号\\ 再把-\frac{\partial E}{\partial net_j}设为err_y\quad意思为隐含层层的误差信号\\ err_o和err_y展开可得:\\ err_o=-\frac{\partial E}{\partial net_k}=-\frac{\partial E}{\partial o_k}\frac{\partial o_k}{\partial net_k}\\把公式(1)(5)代入上公式可得 \\ err_o=-\frac{\partial E}{\partial o_k}f(net_k)'=\sum_{k=1}^l(d_k-o_k)o_k(1-o_k)\quad\quad(8)\\ 可以看出来输出层的误差信号还是非常好求的\\ err_y稍微复杂点,我们还是先把他展开\\ err_y=-\frac{\partial E}{\partial net_j}\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\\ =-\frac{\partial E}{\partial y_j}\frac{\partial y_j}{\partial net_j}\quad\quad\quad\quad\quad\quad\\ =-\frac{\partial E}{\partial o_k}\frac{\partial o_k}{\partial y_j}\frac{\partial y_j}{\partial net_j}\quad\quad\quad\quad\\ =-\frac{\partial E}{\partial o_k}\frac{\partial o_k}{\partial net_k}\frac{\partial net_k}{\partial y_j}\frac{\partial y_j}{\partial net_j}\quad\\ 上面这几个求偏导的公式都有我们只需要带入公式(1)(2)(5)可得\\ err_y=\sum_{k=0}^l(d_k-o_k)\cdot o_k(1-o_k)\cdot w_{jk} \cdot y_j(1-y_j)\quad(9)\\ 我们观察可以发现err_y的一部分和err_o一模一样,所以把公式(8)带入(9)\\ 得err_y=err_ow_{jk}y_j(1-y_j)\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad(10)\\ 对于写代码来说,我们只要求出err_o后,后面一系列的隐藏层都非常好求\\ 只要用从后向前计算每一层的误差信号即可\\ 我们把−∂netk​∂E​设为erro​意思为输出层的误差信号再把−∂netj​∂E​设为erry​意思为隐含层层的误差信号erro​和erry​展开可得:erro​=−∂netk​∂E​=−∂ok​∂E​∂netk​∂ok​​把公式(1)(5)代入上公式可得erro​=−∂ok​∂E​f(netk​)′=k=1∑l​(dk​−ok​)ok​(1−ok​)(8)可以看出来输出层的误差信号还是非常好求的erry​稍微复杂点,我们还是先把他展开erry​=−∂netj​∂E​=−∂yj​∂E​∂netj​∂yj​​=−∂ok​∂E​∂yj​∂ok​​∂netj​∂yj​​=−∂ok​∂E​∂netk​∂ok​​∂yj​∂netk​​∂netj​∂yj​​上面这几个求偏导的公式都有我们只需要带入公式(1)(2)(5)可得erry​=k=0∑l​(dk​−ok​)⋅ok​(1−ok​)⋅wjk​⋅yj​(1−yj​)(9)我们观察可以发现erry​的一部分和erro​一模一样,所以把公式(8)带入(9)得erry​=erro​wjk​yj​(1−yj​)(10)对于写代码来说,我们只要求出erro​后,后面一系列的隐藏层都非常好求只要用从后向前计算每一层的误差信号即可
  • 那么我们最终的结果就是如下公式
    Δ w j k = η ⋅ e r r o ⋅ y j Δ v i j = η ⋅ e r r o w j k y j ( 1 − y j ) ⋅ x i 写 成 代 码 用 向 量 批 量 计 算 的 话 就 是 如 下 所 示 Δ w = η ⋅ ( s u m ( D − O ) ⋅ O ( 1 − O ) ) ⋅ Y Δ v = η ⋅ ( s u m ( D − O ) ⋅ O ( 1 − O ) ) W ⋅ Y ⋅ X \Delta w_{jk}=\eta\cdot err_o \cdot y_j\\ \Delta v_{ij}=\eta\cdot err_o w_{jk} y_j (1-y_j)\cdot x_i \\ 写成代码用向量批量计算的话就是如下所示\\ \Delta w=\eta\cdot (sum(D-O)\cdot O(1-O)) \cdot Y\\ \Delta v=\eta\cdot (sum(D-O)\cdot O(1-O)) W\cdot Y\cdot X \\ Δwjk​=η⋅erro​⋅yj​Δvij​=η⋅erro​wjk​yj​(1−yj​)⋅xi​写成代码用向量批量计算的话就是如下所示Δw=η⋅(sum(D−O)⋅O(1−O))⋅YΔv=η⋅(sum(D−O)⋅O(1−O))W⋅Y⋅X

任意层BP网络代码实现

参考这位老哥的代码: https://www.k2zone.cn/?p=1047

import numpy as np
def logistic(x):return 1/(1+np.exp(-x))
def logistic_derivative(x):return logistic(x) * (1 - logistic(x))def tanh(x):return np.tanh(x)def tanh_deriv(x):return 1.0 - np.tanh(x) * np.tanh(x)class NeuralNetwork:#构造函数def __init__(self, layers, activation='tanh'):''':param layers: list类型,比如[2,2.1]代表输入层有两个神经元,隐藏层有两个,输出层有一个:param activation: 激活函数'''self.layers = layers#选择后面用到的激活函数if activation == 'logistic':self.activation = logisticself.activation_deriv = logistic_derivativeelif activation == 'tanh':self.activation = tanhself.activation_deriv = tanh_deriv#定义网络的层数self.num_layers = len(layers)'''生成除输入层外的每层中神经元的biase值,在(-1,1)之间,每一层都是一行一维数组数据randn函数执行一次生成x行y列的数据'''self.biases = [np.random.randn(x) for x in layers[1:]]print("初始偏向:",self.biases)'''随机生成每条连接线的权重,在(-1,1)之间weights[i-1]代表第i层和第i-1层之间的权重,元素个数等于i层神经元个数weights[i-1][0]表示第i层中第一个神经单元和第i-1层每个神经元的权重,元素个数等于i-1层神经元个数'''self.weights = [np.random.randn(y, x)for x, y in zip(layers[:-1], layers[1:])]print("初始权重:",self.weights)#训练模型,进行建模def fit(self, X, y, learning_rate=0.2, epochs=1):''':param self: 当前对象指针:param X: 训练集:param y: 训练标记:param learning_rate: 学习率:param epochs: 训练次数:return: void'''for k in range(epochs):#每次迭代都循环一次训练集for i in range(len(X)):#存储本次的输入和后几层的输出activations = [X[i]]#向前一层一层的走for b, w in zip(self.biases, self.weights):# print "w:",w# print "activations[-1]:",activations[-1]# print "b:", b#计算激活函数的参数,计算公式:权重.dot(输入)+偏向z = np.dot(w, activations[-1])+b#计算输出值output = self.activation(z)#将本次输出放进输入列表,后面更新权重的时候备用activations.append(output)# print "计算结果",activations#计算误差值"""下面这行代码参考公式8"""error = y[i]-activations[-1]"""计算输出层误差率参考公式9"""deltas = [error * self.activation_deriv(activations[-1])]#循环计算隐藏层的误差率,从倒数第2层开始for l in range(self.num_layers-2, 0, -1):# print "第l层的权重",self.weights[l]# print "l+1层的误差率",deltas[-1]deltas.append(self.activation_deriv(activations[l]) * np.dot( deltas[-1],self.weights[l]))#将各层误差率顺序颠倒,准备逐层更新权重和偏向deltas.reverse()"""更新权重和偏向参考公式3、4"""for j in range(self.num_layers-1):#本层结点的输出值layers = np.array(activations[j])# print "本层输出:",layers# print "错误率:",deltas[j]# 权重的增长量,计算公式,增长量 = 学习率 * (错误率.dot(输出值))delta = learning_rate * ((np.atleast_2d(deltas[j]).T).dot(np.atleast_2d(layers)))#更新权重self.weights[j] += delta#print "本层偏向:",self.biases[j]#偏向增加量,计算公式:学习率 * 错误率delta = learning_rate * deltas[j]#print np.atleast_2d(delta).T#更新偏向self.biases[j] += delta#print self.weightsdef predict(self, x):''':param x: 测试集:return: 各类型的预测值'''for b, w in zip(self.biases, self.weights):# 计算权重相加再加上偏向的结果z = np.dot(w, x) + b# 计算输出值x = self.activation(z)return xnn = NeuralNetwork([2,4,3,1], 'tanh')
#训练集
X = np.array([[0, 0], [0, 1], [1, 0],[1, 1]])
#lanbel标记
y = np.array([0, 1, 1, 0])
#建模
nn.fit(X, y, epochs=2000)
#预测
for i in [[0, 0], [0, 1], [1, 0], [1,1]]:print(i, nn.predict(i))

运行结果如

BP神经网络的详细推导 与 完整代码相关推荐

  1. 【深度学习】感知器、线性神经网络案例应用、BP神经网络算法详细推导

    感知器.线性神经网络.BP神经网络及手写数字识别 1. 单层感知器 1.1 感知器的介绍 1.2 感知器的学习规则 1.3 感知器单输入输出示例 1.4 学习率 η\etaη 1.5 模型训练收敛条件 ...

  2. BP神经网络的详细推导

    文章目录 概述 一.神经元模型 二.感知机与多层网络 三.误差逆传播算法 四.全局最小与局部最小 五.BP算法的改进 1.引入动量法 2.尺度变换法 3.自适应学习率调整法 六.BP神经网络的训练 1 ...

  3. ACO蚁群算法优化BP神经网络(ACO-BPNN)回归预测MATLAB代码(有优化前后的对比)

    ACO蚁群算法优化BP神经网络(ACO-BPNN)回归预测MATLAB代码(有优化前后的对比) 代码注释清楚. main为运行主程序,可以读取本地EXCEL数据. 很方便,容易上手. (以电厂运行数据 ...

  4. PSO粒子群算法优化BP神经网络(PSO-BPNN)回归预测MATLAB代码

    PSO粒子群算法优化BP神经网络(PSO-BPNN)回归预测MATLAB代码(有优化前后的对比) 代码注释清楚. main为运行主程序,可以读取本地EXCEL数据,也可以加载本地数据.mat,使用换自 ...

  5. 基于头脑风暴优化的BP神经网络(预测应用) - 附代码

    基于头脑风暴优化的BP神经网络(预测应用) - 附代码 文章目录 基于头脑风暴优化的BP神经网络(预测应用) - 附代码 1.数据介绍 3.BSO优化BP神经网络 3.1 BP神经网络参数设置 3.2 ...

  6. 基于布谷鸟优化的BP神经网络(预测应用) - 附代码

    基于布谷鸟优化的BP神经网络(预测应用) - 附代码 文章目录 基于布谷鸟优化的BP神经网络(预测应用) - 附代码 1.数据介绍 3.CS优化BP神经网络 3.1 BP神经网络参数设置 3.2 布谷 ...

  7. 黑马旅游网项目详细思路和完整代码整理 -附源码

    黑马旅游网项目详细思路和完整代码整理 前言 由于新冠病毒的原因,无法上学.百无聊赖下自己开始看视频学习,跟着视频做完了这个项目来检验学习成果,顺便写篇博客来记录一下. 话不多说,开始正题. 文档及其源 ...

  8. SSA麻雀算法优化BP神经网络(SSA-BPNN)回归预测MATLAB代码(有优化前后的对比

    SSA麻雀算法优化BP神经网络(SSA-BPNN)回归预测MATLAB代码(有优化前后的对比) 代码注释清楚. main为运行主程序,可以读取本地EXCEL数据. 很方便,容易上手. (以电厂运行数据 ...

  9. 基于鸟群优化的BP神经网络(预测应用) - 附代码

    基于鸟群优化的BP神经网络(预测应用) - 附代码 文章目录 基于鸟群优化的BP神经网络(预测应用) - 附代码 1.数据介绍 3.BSA优化BP神经网络 3.1 BP神经网络参数设置 3.2 鸟群算 ...

最新文章

  1. 路过的朋友们,最后一天投票,感谢
  2. php数组的奇数_用php输出一个数组中的偶数或奇数的方法
  3. 一个PHP程序的“怪问题”
  4. 什么是标准输入,标准输出(stdin,stdout)
  5. 论文被拒稿后怎么办?这些事情你要知道
  6. 51nod 1096 距离之和最小 思维题,求中位数
  7. chrome gwt1.7_快速提示:使用Chrome开发工具调试GWT应用程序
  8. python idle使用anaconda中库怎么用_如何使用Anaconda学习Python
  9. onenote快捷键_高效飞快地使用onenote快捷键:快捷键功能架构解析
  10. GenseeSDK DocView(OpenGL)引起的TextView显示黑块
  11. 仿芒果TV微信小程序
  12. Oracle性能调优之--Buffer cache 的调整与优化
  13. 使用正则表达式获取连接字符串某项的值
  14. [转]如果说中国程序员技术偏低,原因可能在这里
  15. opencv人脸关键点生成掩膜并替换
  16. 大学c语言怎么应付考试,二级c语言考试应对技巧
  17. urule规则引擎使用(2022详细)
  18. 历史 微信开发者工具_微信开发者工具历史记录
  19. java根号n元素的合并排序算法_根号N段合并排序
  20. 2021年IT互联网高薪职位大盘点

热门文章

  1. html网站底部导航栏怎么做,如何设计一个页面的底部导航?
  2. 单片机——点阵2(Proteus和KeilC51)
  3. react强制页面刷新
  4. JMeter—录制脚本
  5. MySql 指定某一字段排在前面
  6. html2pdf vue,VUE项目中利用html2canvas和JsPdf实现页面转PDF并保证图片不会被切断
  7. 区块链溯源相比传统追溯有什么优点?
  8. 深入理解机器学习——机器学习概览
  9. 使用Godaddy续费我的域名时遇到支付问题
  10. ROS1云课→29如何借助导航实现走迷宫机器人