BP神经网络

1.先导入测试文件和训练问价

# 1.读取样本
    data_tr = pd.read_csv("F:\Python程序\新建文件夹\python.chapter13\data_te.txt")
    data_te = pd.read_csv("F:\Python程序\新建文件夹\python.chapter13\data_tr.txt")

2.将BP神经网络方法设置

有三个参数,一个训练文件,一个测试文件,一个训练次数

def BP(data_tr, data_te, maxiter=3000):

3.先将调用的数据转为数组

 data_tr, data_te = np.array(data_tr), np.array(data_te)

方便后序处理

4.先对变量进行定义

        

    # --隐层输入
    # -1: 代表的是隐层的阈值
    net_in = np.array([0.0, 0, -1])
    w_mid = np.random.rand(3, 4)          # 隐层权值阈值(-1x其中一个值:阈值)
 
    # 输出层输入
    # -1:代表输出层阈值
    out_in = np.array([0.0, 0, 0, 0, -1])
    w_out = np.random.rand(5)             # 输出层权值阈值(-1x其中一个值:阈值)
    delta_w_out = np.zeros([5])           # 存放输出层权值阈值的逆向计算误差
    delta_w_mid = np.zeros([3, 4])        # 存放因此能权值阈值的逆向计算误差
    yita = 1.75                           # η: 学习速率
    Err = np.zeros([maxiter])             # 记录总体样本每迭代一次的错误率

进行训练


import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

def sigmoid(x):
    """
    隐含层和输出层对应的函数法则
    """
    return 1/(1+np.exp(-x))

def BP(data_tr, data_te, maxiter=3000):
 
    # --pandas是基于numpy设计的,效率略低
    # 为提高处理效率,转换为数组
    data_tr, data_te = np.array(data_tr), np.array(data_te)
 
    # --隐层输入
    # -1: 代表的是隐层的阈值
    net_in = np.array([0.0, 0, -1])
    w_mid = np.random.rand(3, 4)          # 隐层权值阈值(-1x其中一个值:阈值)
 
    # 输出层输入
    # -1:代表输出层阈值
    out_in = np.array([0.0, 0, 0, 0, -1])
    w_out = np.random.rand(5)             # 输出层权值阈值(-1x其中一个值:阈值)
    delta_w_out = np.zeros([5])           # 存放输出层权值阈值的逆向计算误差
    delta_w_mid = np.zeros([3, 4])        # 存放因此能权值阈值的逆向计算误差
    yita = 1.75                           # η: 学习速率
    Err = np.zeros([maxiter])             # 记录总体样本每迭代一次的错误率
 
    # 1.样本总体训练的次数
    for it in range(maxiter):
 
        # 衡量每一个样本的误差
        err = np.zeros([len(data_tr)])
 
        # 2.训练集训练一遍
        for j in range(len(data_tr)):
            net_in[:2] = data_tr[j, :2]                       # 存储当前对象前两个属性值
            real = data_tr[j, 2]
 
            # 3.当前对象进行训练
            for i in range(4):
                out_in[i] = sigmoid(sum(net_in*w_mid[:, i]))  # 计算输出层输入
            res = sigmoid(sum(out_in * w_out))                # 获得训练结果
 
            err[j] = abs(real - res)
 
            # --先调节输出层的权值与阈值
            delta_w_out = yita*res*(1-res)*(real-res)*out_in  # 权值调整
            delta_w_out[4] = -yita*res*(1-res)*(real-res)     # 阈值调整
            w_out = w_out + delta_w_out
 
            # --隐层权值和阈值的调节
            for i in range(4):
                # 权值调整
                delta_w_mid[:, i] = yita * out_in[i] * (1 - out_in[i]) * w_out[i] * res * (1 - res) * (real - res) * net_in
                # 阈值调整
                delta_w_mid[2, i] = -yita * out_in[i] * (1 - out_in[i]) * w_out[i] * res * (1 - res) * (real - res)
            w_mid = w_mid + delta_w_mid
        Err[it] = err.mean()
    plt.plot(Err)
    plt.show()
 
    # 存储预测误差
    err_te = np.zeros([100])
 
    # 预测样本100个
    for j in range(100):
        net_in[:2] = data_te[j, :2]                         # 存储数据
        real = data_te[j, 2]                                # 真实结果
 
        # net_in和w_mid的相乘过程
        for i in range(4):
            # 输入层到隐层的传输过程
            out_in[i] = sigmoid(sum(net_in*w_mid[:, i]))
        res = sigmoid(sum(out_in*w_out))                    # 网络预测结果输出
        err_te[j] = abs(real-res)                           # 预测误差
        print('res:', res, ' real:', real)
    
    plt.plot(err_te)
    plt.show()
 
if "__main__" == __name__:
 
    # 1.读取样本
    data_tr = pd.read_csv("F:\Python程序\新建文件夹\python.chapter13\data_te.txt")
    data_te = pd.read_csv("F:\Python程序\新建文件夹\python.chapter13\data_tr.txt")
    BP(data_tr, data_te, maxiter=3000)

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值