用numpy构造的一个简单BP

本文介绍了一个基于BP神经网络的简单回归模型实现过程。模型使用MaxMin归一化和Sigmod激活函数,通过随机初始化权重和阈值进行训练。文章详细展示了数据预处理、模型构建、训练及评估步骤,并提供了完整的Python代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

# -*- coding: utf-8 -*-
"""
Created on Thu Oct  4 08:28:15 2018

@author: 37989
"""

import numpy as np
import pandas as pd
from matplotlib import pyplot


# 标准化
def Standard(X):
    X_mean = X.mean(axis=0)
    X_std = (((X - X_mean) ** 2).sum(axis=0) / len(X)) ** 0.5
    return (X - X_mean) / X_std

# 归一化
def MaxMin(X):
    X_min = X.min(axis=0)
    X_max = X.max(axis=0)
    return (X - X_min) / (X_max - X_min)

# 激活函数
def sigmod(X):
    return 1 / (1 + np.power(np.e, -X))

# 正切函数
def tanh(X):
    return 1 - 2 / (np.power(np.e, 2 * X) + 1)


# 建立模型
# 默认随机[-1,1]初始化权值阈值
def build(netNum):
    W, Q= [],[]
    for i in range(len(netNum) - 1):
        W.append((np.random.rand(netNum[i], netNum[i+1]) - 0.5) * 2)
        Q.append((np.random.rand(1, netNum[i+1]) - 0.5) * 2)
    return W, Q

# 预测模型
def predict(W, Q, X):
    for i in range(len(W)):
        X = np.dot(X, W[i]) - Q[i]
        X = sigmod(X)
    return X

# 训练集,测试集划分
def dataSplit(X, Y, testPer):
    testNum = int(len(X) * testPer)
    rand = np.random.permutation(len(X))
    x_test = X[rand[:testNum]]
    y_test = Y[rand[:testNum]]
    x_train = X[rand[testNum:]]
    y_train = Y[rand[testNum:]]
    return x_train, y_train, x_test, y_test



if __name__ == '__main__':

    # maxmin 归一化
    # sigmod 激活函数
    #

    # 载入数据
    data = pd.read_csv(r'F:\Temp\Python\scrapy\myspider\myspider\tensorflow\DataBase\data_continuous.csv')
    X_label = ['F1', 'F2', 'F3', 'F4']
    Y_label = ['R']
    X = data[X_label].values
    Y = data[Y_label].values
    netNum = [len(X_label)]

    # 相关参数设置
    learnRate = 0.05 # 学习率
    echos = 100     # 迭代次数
    netNum += [10]  # 隐层节点
    testPer = 0.3   # 测试集比例

    # 标准化
    X = MaxMin(X)
    Y = MaxMin(Y)

    # 建立模型
    netNum.append(len(Y_label))
    W, Q = build(netNum)

    x_train, y_train, x_test, y_test = dataSplit(X, Y, testPer)

    # 训练
    for num in range(echos):
        for position in range(len(x_train)):
            x = x_train[position].reshape(1,netNum[0])
            y = y_train[position]

            out_x = [x]
            for i in range(len(W)):
                # 隐层结果
                temp = np.dot(x, W[i]) - Q[i]
                x = sigmod(temp)
                out_x.append(x)

            # 最终输出
            output_y = out_x[-1]

            # 更新
            e = output_y * (1 - output_y) * (y - output_y)
            for i in range(len(W)-1,-1,-1):
                x = out_x[i]
                n = netNum[i]
                W[i] += learnRate * np.dot(x.reshape(n, 1), e)
                Q[i] -= learnRate * e
                e = (W[i] * e).sum(axis=1) * x * (1 - x)

        # 验证网络模型
        predict_y = predict(W, Q, x_train)
        mse = ((y_train - predict_y) ** 2).sum() / len(x_train)
        print("第 %d 次训练,均方误差为:%f" % (num+1, mse))

    # 模型评估
    predict_y = predict(W, Q, x_test)
    mse = ((y_test - predict_y) ** 2).sum() / len(y_test)
    print("测试集均方误差为:%f" % mse)
    pyplot.scatter(predict_y, y_test)
    pyplot.show()

 

一个简单的BP回归模型,

数据格式:

    F1     F2     F3     F4  .......    R1    R2     R3

    21.5  4.5     5       6  .......     2        5       4

可以构造多层神经网络,隐层结构和参数netNum中设置:

     比如netNum = [8,6,9],那么网络结构为  inputnum -> 8 -> 6 -> 9 -> outputnum

可以设置迭代次数 echos 、学习率learnrate、测试集比重testPer

训练效果一般,仅供练习代码。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值