# 第五章 神经网络

来源:互联网 发布:江南大学网络教育2017 编辑:程序博客网 时间:2024/05/28 16:04

标准BP

# coding: utf-8# 标准的BP 我们没运行一条数据改变更新一次参数,在一次数据集的遍历只把误差累计起来,各参数的导数只用每次求得的导数更新,不用累计!import pandas as pdfrom pandas import *import numpy as npfrom 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 = 1v = 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 = 1kn = 0 # 迭代次数sn = 0 #old_ey = 0ii = 5while(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 = 0for 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]

原创粉丝点击