测量值与实际值存放在一个TXT文件中,通过简单bp算法计算测量值以实际值的关系代码
时间: 2024-02-06 10:10:25 浏览: 122
以下是使用简单BP算法计算测量值与实际值之间关系的Python代码示例:
```python
import numpy as np
# 读取数据文件
data = np.loadtxt("data.txt")
# 分离测量值和实际值
x = data[:, 0]
y = data[:, 1]
# 归一化数据
x = (x - np.mean(x)) / np.std(x)
y = (y - np.mean(y)) / np.std(y)
# 初始化神经网络参数
input_size = 1 # 输入层大小
hidden_size = 5 # 隐藏层大小
output_size = 1 # 输出层大小
W1 = np.random.randn(input_size, hidden_size) # 输入层到隐藏层的权重
b1 = np.zeros((1, hidden_size)) # 隐藏层偏置
W2 = np.random.randn(hidden_size, output_size) # 隐藏层到输出层的权重
b2 = np.zeros((1, output_size)) # 输出层偏置
# 设置训练参数
learning_rate = 0.1 # 学习率
epochs = 1000 # 迭代次数
# 训练模型
for i in range(epochs):
# 前向传播
z1 = np.dot(x.reshape(-1, 1), W1) + b1 # 输入层到隐藏层的输出
a1 = np.tanh(z1) # 隐藏层的激活值
z2 = np.dot(a1, W2) + b2 # 隐藏层到输出层的输出
y_pred = z2 # 输出层的预测值
# 计算损失
loss = np.mean((y_pred - y.reshape(-1, 1)) ** 2)
# 反向传播
delta2 = y_pred - y.reshape(-1, 1) # 输出层误差
dW2 = np.dot(a1.T, delta2) # 隐藏层到输出层的权重更新量
db2 = np.sum(delta2, axis=0, keepdims=True) # 输出层偏置更新量
delta1 = np.dot(delta2, W2.T) * (1 - np.power(a1, 2)) # 隐藏层误差
dW1 = np.dot(x.reshape(-1, 1).T, delta1) # 输入层到隐藏层的权重更新量
db1 = np.sum(delta1, axis=0) # 隐藏层偏置更新量
# 更新参数
W2 -= learning_rate * dW2
b2 -= learning_rate * db2
W1 -= learning_rate * dW1
b1 -= learning_rate * db1
# 打印损失
if i % 100 == 0:
print("Epoch: {}, Loss: {}".format(i, loss))
# 测试模型
x_test = np.linspace(-2, 2, num=100)
y_test = np.dot(np.tanh(np.dot(x_test.reshape(-1, 1), W1) + b1), W2) + b2
# 可视化结果
import matplotlib.pyplot as plt
plt.scatter(x, y, label="Data")
plt.plot(x_test, y_test, label="Prediction", color="red", linewidth=2)
plt.legend()
plt.show()
```
在这个示例中,我们首先从文件中读取测量值和实际值的数据,然后将它们归一化到均值为0,标准差为1的范围内。接着,我们初始化一个具有一个输入层、一个隐藏层和一个输出层的神经网络,并使用随机权重进行初始化。然后,我们使用简单BP算法对模型进行训练,并在每个迭代周期打印损失。最后,我们使用训练好的模型对新的测量值进行预测,并将结果可视化出来。
阅读全文