#库的导入
import numpy as np
import pandas as pd
#激活函数tanh
def tanh(x):
return (np.exp(x)-np.exp(-x))/(np.exp(x)+np.exp(-x))
#反激活函数
def de_tanh(x):
return (1-x**2)
#输入数据的导入
df = pd.read_csv("train.csv")
df.columns = ["Co", "Cr", "Mg", "Pb", "Ti"]
Co = df["Co"]
Co = np.array(Co)
Cr = df["Cr"]
Cr = np.array(Cr)
Mg=df["Mg"]
Mg=np.array(Mg)
Pb = df["Pb"]
Pb =np.array(Pb)
Ti = df["Ti"]
Ti = np.array(Ti)
samplein = np.mat([Co,Cr,Mg,Pb])
#数据归一化,将输入数据压缩至0到1之间,便于计算,后续通过反归一化恢复原始值
sampleinminmax = np.array([samplein.min(axis=1).T.tolist()[0],samplein.max(axis=1).T.tolist()[0]]).transpose()
sampleout = np.mat([Ti])
sampleoutminmax = np.array([sampleout.min(axis=1).T.tolist()[0],sampleout.max(axis=1).T.tolist()[0]]).transpose()
sampleinnorm = (2*(np.array(samplein.T)-sampleinminmax.transpose()[0])/(sampleinminmax.transpose()[1]-sampleinminmax.transpose()[0])-1).transpose()
sampleoutnorm = (2*(np.array(sampleout.T)-sampleoutminmax.transpose()[0])/(sampleoutminmax.transpose()[1]-sampleoutminmax.transpose()[0])-1).transpose()
noise = 0.03*np.random.rand(sampleoutnorm.shape[0],sampleoutnorm.shape[1])
sampleoutnorm += noise
maxepochs = 5000 #训练次数
learnrate = 0.001 #学习率
errorfinal = 0.65*10**(-3) #停止训练误差阈值
samnum = 72 #输入数据数量
indim = 4 #输入层节点数
outdim = 1 #输出层节点数
hiddenunitnum = 8 #隐含层节点数
#随机生成隐含层与输出层的权值w和阈值b
scale = np.sqrt(3/((indim+outdim)*0.5)) #最大值最小值范围为-1.44~1.44
w1 = np.random.uniform(low=-scale, high=scale, size=[hiddenunitnum,indim])
b1 = np.random.uniform(low=-scale, high=scale, size=[hiddenunitnum,1])
w2 = np.random.uniform(low=-scale, high=scale, size=[outdim,hiddenunitnum])
b2 = np.random.uniform(low=-scale, high=scale, size=[outdim,1])
#errhistory存储误差
errhistory = np.mat(np.zeros((1,maxepochs)))
#开始训练
for i in range(maxepochs):
print("The iteration is : ", i)
#前向传播,计算隐含层、输出层输出
hiddenout = tanh((np.dot(w1,sampleinnorm).transpose()+b1.transpose())).transpose()
networkout = tanh((np.dot(w2,hiddenout).transpose()+b2.transpose())).transpose()
#计算误差值
err = sampleoutnorm - networkout
loss = np.sum(err**2)/2
print("the loss is :",loss)
errhistory[:,i] = loss
#判断是否停止训练
if loss < errorfinal:
break
#反向传播,利用结果误差进行误差项的计算
delta2 = err*de_tanh(networkout)
delta1 = np.dot(w2.transpose(),delta2)*de_tanh(hiddenout)
#计算输出层的误差项
dw2 = np.dot(delta2,hiddenout.transpose())
dw2 = dw2 / samnum
db2 = np.dot(delta2,np.ones((samnum,1)))
db2 = db2 / samnum
#计算隐含层的误差项
dw1 = np.dot(delta1,sampleinnorm.transpose())
dw1 = dw1 / samnum
db1 = np.dot(delta1,np.ones((samnum,1)))
db1 = db1/samnum
#对权值、阈值进行更新
w2 += learnrate*dw2
b2 += learnrate*db2
w1 += learnrate*dw1
b1 += learnrate*db1
print('更新的权重w1:',w1)
print('更新的偏置b1:',b1)
print('更新的权重w2:',w2)
print('更新的偏置b2:',b2)
print("The loss after iteration is :",loss)
#保持训练结束后的权值、阈值,用于测试
np.save("w1.npy",w1)
np.save("b1.npy",b1)
np.save("w2.npy",w2)
np.save("b2.npy",b2)
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
实现基于Python的BP神经网络数据预测模型,压缩包中包含文件如下:源码BPNN.py主要用于使用训练数据集进行模型训练,生成对应的训练后模型参数;test.py主要用于利用训练好的模型对测试数据集进行预测,输出结果包括MAE、MAPE等误差值以及预测差值的分布情况等;train.csv为训练数据集,test.csv为测试数据集,.npy文件为训练后生成的权值、阈值。
资源推荐
资源详情
资源评论
收起资源包目录
BPNN.zip (8个子文件)
BPNN
b1.npy 192B
b2.npy 136B
w1.npy 384B
w2.npy 192B
BPNN.py 3KB
train.csv 2KB
test.py 3KB
test.csv 649B
共 8 条
- 1
资源评论
- 郭逗2023-07-26这个文件提供了一个简洁易懂的BP神经网络的Python源码,对于初学者来说非常友好。
- 高中化学孙环宇2023-07-26这份文件的编写风格朴实无华,说明了BP神经网络的原理和实现方式,便于理解和学习。
- 老光私享2023-07-26包含了实际的数据集,使得读者可以立即将理论应用到实际问题中,非常实用。
- 叫我叔叔就行2023-07-26通过这份文件,我学到了如何使用Python实现BP神经网络进行数据预测,非常感激作者的分享。
- 俞林鑫2023-07-26简明扼要地介绍了BP神经网络的实现步骤和应用场景,让人对其原理有了更深入的了解。
七层楼的疯子
- 粉丝: 1w+
- 资源: 45
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功