# 第五章 神经网络
2017-10-17 10:01
162 查看
标准BP
# coding: utf-8 # 标准的BP 我们没运行一条数据改变更新一次参数,在一次数据集的遍历只把误差累计起来,各参数的导数只用每次求得的导数更新,不用累计! import pandas as pd from pandas import * import numpy as np from numpy import * x = pd.read_csv(r"C:\Users\zmy\Desktop\titanic\xigua4.csv",header=None,nrows=8) x = x.transpose() x = array(x) result = pd.read_csv(r"C:\Users\zmy\Desktop\titanic\xigua4.csv",header=None,skiprows=8,nrows=1) result = result.transpose() result = array(result) result = result - 1 #bp算法 m,n = shape(x) t = 1 v = np.random.rand(n,n+1) # 输入层与隐含层的权值 w = np.random.rand(n+1, t)# 隐含层和输出层的权值 thy = np.random.rand(n+1)# 隐含层的阈值 tho = np.random.rand(t)# 输出层的阈值 out = np.zeros((m,t))# 输出层的输出值 bn = np.zeros(n+1)#隐含层的输出值 gj = np.zeros(t) eh = np.zeros(n+1) xk = 1 kn = 0 # 迭代次数 sn = 0 # old_ey = 0 ii = 5 while(1): ii -= 1 kn = kn + 1 ey = 0 for i in range(0,m): #计算隐含层输出 for j in range(0, n+1): ca = 0 for h in range(0, n): ca = ca + v[h][j] * x[i][h] bn[j] = 1/(1+exp(-ca+thy[j])) # 计算输出层输出 for h1 in range(0,t): ba = 0 for h2 in range(0,n+1): ba = ba + w[h2][h1] * bn[h2] out[i][h1] = 1 / (1+ exp(-ba + tho[h1])) # 计算累积误差 for h1 in range(0,t): ey = ey + pow((out[i][h1] - result[i]), 2)/2 # print 'ey', ey # 计算gj for h1 in range(0,t): gj[h1] = out[i][h1]*(1-out[i][h1])*(result[i] - out[i][h1]) # print out[i][h1],result[i] # 计算eh for h1 in range(0,n+1): for h2 in range(0, t): eh[h1] = bn[h1] * (1 - bn[h1]) * w[h1][h2]*gj[h2] # 更新w for h2 in range(0, t): for h1 in range(0,n+1): w[h1][h2] = w[h1][h2] + xk * gj[h2] * bn[h1] #更新输出阈值 for h1 in range(0,t): tho[h1] = tho[h1] - xk * gj[h1] # 更新输入层与隐含层的权值 for h2 in range(0, n + 1): for h1 in range(0, n): v[h1][h2] = v[h1][h2] + xk * eh[h2] * x[i][h1] #更新隐含层阈值 for h1 in range(0,n+1): thy[h1] = thy[h1] - xk * eh[h1] if(abs(ey-old_ey) < 0.0001): # print abs(ey-old_ey) sn = sn + 1 if(sn == 100): break else: old_ey = ey # ey = 0 sn = 0 for i in range(0,m): for j in range(0,t): print i,out[i][j], result[i]
结果为: (行标,预测值,实际值)
0 0.00433807645401 [0]1 0.00532600009637 [0]
2 0.00427358256359 [0]
3 0.0208781402544 [0]
4 0.0189059379881 [0]
5 0.989732982598 [1]
6 0.990855525385 [1]
7 0.968537961141 [1]
8 0.998602511829 [1]
9 0.998036011905 [1]
10 0.015951504667 [0]
11 0.0151684814171 [0]
12 0.0116095552438 [0]
13 0.998160689389 [1]
14 0.998935912 [1]
15 0.990103694861 [1]
16 0.988335990994 [1]
累计BP
# coding: utf-8 # 累计BP 相对于标准BP是每次把所有的数据都运行完,把所有的误差都累计起来在更新参数 import pandas as pd import numpy as np from pandas import * from numpy import * x = pd.read_csv(r'C:\Users\zmy\Desktop\titanic\xigua4.csv', header=None, nrows=8) y = pd.read_csv(r'C:\Users\zmy\Desktop\titanic\xigua4.csv', header= None, skiprows=8,nrows=1) y = y-1 x = x.transpose() x = array(x) y = array(y) y = y.transpose() Eta = 1 # 学习率 t = 1 # 输出 m, n = shape(x) # 数据集的行与列 w = np.random.rand(n+1, n) # 隐含层与输出层的权重 v = np.random.rand(n, n+1) # 输入层与隐含层的权重 Zta = np.random.rand(t) # 输出层阈值 Gamma = np.random.rand(n+1) # 隐含层阈值 bn = zeros((m,n+1)) # 隐含层输出 yk = zeros((m,t)) # 输出层输出 Alpha = zeros(n) gj = zeros(m) eh = zeros((m,n+1)) k = 0 sn = 0 old_ey = 0 while(1): k += 1 ey = 0 for i in range(0, m): for h1 in range(0, n+1): temp = 0 for h2 in range(0, n): temp = temp + v[h2][h1] * x[i][h2] bn[i][h1] = 1 / (1+ exp(-temp+ Gamma[h1])) for h1 in range(0, t): temp = 0 for h2 in range(0, n+1): temp += w[h2][h1] * bn[i][h2] yk[i][h1] = 1 / (1 + exp(-temp + Zta[h1])) # 计算累计误差 for h1 in range(0,t): ey += pow(yk[i][h1] - y[i], 2) / 2 for h1 in range(0, m): gj[h1] = yk[h1][0] * (1 - yk[h1][0]) * (y[h1] - yk[h1][0]) for i in range(0, m): for h1 in range(n+1): temp = 0 for h2 in range(0, t): temp += w[h1][h2] * gj[i] eh[i][h1] = bn[i][h1] * (1 - bn[i][h1]) * temp w1 = zeros((n+1, t)) v1 = zeros((n,n+1)) Zta1 = zeros(t) Gamma1 = zeros(n+1) # 计算四个参数的导数 for i in range(0, m): for h1 in range(0, t): Zta1[h1] += (-1) * gj[i] * Eta for h2 in range(0, n+1): w1[h2][h1] += Eta * gj[i] * bn[i][h2] for h1 in range(0, n+1): Gamma1[h1] += Eta * (-1) * eh[i][h1] for h2 in range(0, n): v1[h2][h1] += Eta * eh[i][h1] * x[i][h2] # 更新参数 v = v + v1 w = w + w1 Gamma = Gamma + Gamma1 Zta = Zta + Zta1 if (abs(old_ey-ey) < 0.0001) : sn += 1 if sn == 100: break else: old_ey = ey sn = 0 for i in range(0,m): for j in range(0,t): print i,yk[i][j], y[i]
结果输出
0 9.28395603439e-05 [0]1 0.00408553765608 [0]
2 0.00750763695368 [0]
3 0.0285684849738 [0]
4 0.00591863864577 [0]
5 0.985047169485 [1]
6 0.991935228407 [1]
7 0.968524769653 [1]
8 0.996291194651 [1]
9 0.996365288109 [1]
10 0.00064978194805 [0]
11 0.0158218829283 [0]
12 0.0127356648444 [0]
13 0.996965938838 [1]
14 0.999528551401 [1]
15 0.999273125275 [1]
16 0.991180793173 [1]
相关文章推荐
- 小白学习机器学习---第五章:神经网络简单模型python实现
- 周志华 《机器学习》之 第五章(神经网络)概念总结
- 机器学习(周志华) 参考答案 第五章 神经网络 5.5
- 第五章(1.6)深度学习——常用的八种神经网络性能调优方案
- 第五章(1.4)深度学习——神经网络架构和原理
- PRML读书会第五章 Neural Networks(神经网络、BP误差后向传播链式求导法则、正则化、卷积网络)
- 第五章 采用SVM和神经网络的车牌识别
- 机器学习(周志华) 参考答案 第五章 神经网络 5.7
- 第五章 神经网络
- 第五章(1.1)深度学习——神经网络相关名词解释
- 学习笔记--第五章神经网络
- 第五章 采用SVM和神经网络的车牌识别(流程图及详细解释)
- <机器学习>(周志华)读书笔记 -- 第五章 神经网络
- 第五章 采用SVM和神经网络的车牌识别
- 机器学习+周志华+第五章习题+解决异或问题的单层RBF神经网络
- 译文 | 与TensorFlow的第一次接触 第五章:多层神经网络
- 第五章 采用SVM和神经网络的车牌识别(流程图及详细解释)
- 第五章 神经网络
- 【机器学习实战】——第五章 神经网络
- 机器学习(周志华)_第五章神经网络