粒子群算法优化bp神经网络预测番茄产量python代码案例
时间: 2023-07-05 10:24:01 浏览: 87
以下是使用粒子群算法优化BP神经网络预测番茄产量的Python代码案例:
```python
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import mean_squared_error
from pyswarm import pso
from sklearn.neural_network import MLPRegressor
# 读取数据
data = pd.read_csv('tomato.csv', usecols=[1])
dataset = data.values
dataset = dataset.astype('float32')
# 数据归一化
scaler = MinMaxScaler(feature_range=(0, 1))
dataset = scaler.fit_transform(dataset)
# 划分训练集和测试集
train_size = int(len(dataset) * 0.8)
test_size = len(dataset) - train_size
train, test = dataset[0:train_size,:], dataset[train_size:len(dataset),:]
# 创建输入输出数据
def create_dataset(dataset, look_back=1):
dataX, dataY = [], []
for i in range(len(dataset)-look_back-1):
a = dataset[i:(i+look_back), 0]
dataX.append(a)
dataY.append(dataset[i + look_back, 0])
return np.array(dataX), np.array(dataY)
look_back = 1
trainX, trainY = create_dataset(train, look_back=look_back)
testX, testY = create_dataset(test, look_back=look_back)
# 定义目标函数
def objective_function(params):
hidden_layer_sizes = (int(params[0]), int(params[1]))
learning_rate_init = 10 ** int(params[2])
momentum = params[3]
max_iter = int(params[4])
solver = 'lbfgs'
# 训练模型
model = MLPRegressor(hidden_layer_sizes=hidden_layer_sizes, learning_rate_init=learning_rate_init, momentum=momentum, max_iter=max_iter, solver=solver)
model.fit(trainX, trainY)
# 预测
trainPredict = model.predict(trainX)
testPredict = model.predict(testX)
# 反归一化
trainPredict = scaler.inverse_transform(trainPredict.reshape(-1, 1))
trainY = scaler.inverse_transform(trainY.reshape(-1, 1))
testPredict = scaler.inverse_transform(testPredict.reshape(-1, 1))
testY = scaler.inverse_transform(testY.reshape(-1, 1))
# 计算误差
trainScore = mean_squared_error(trainY, trainPredict)
testScore = mean_squared_error(testY, testPredict)
return testScore
# 定义变量范围
lb = [1, 1, -5, 0, 100]
ub = [10, 10, -1, 1, 10000]
# 调用粒子群算法求解最优参数
xopt, fopt = pso(objective_function, lb, ub)
# 输出最优参数
print('Optimal parameters:')
print('hidden_layer_sizes:', (int(xopt[0]), int(xopt[1])))
print('learning_rate_init:', 10 ** int(xopt[2]))
print('momentum:', xopt[3])
print('max_iter:', int(xopt[4]))
# 使用最优参数重新训练模型并预测
hidden_layer_sizes = (int(xopt[0]), int(xopt[1]))
learning_rate_init = 10 ** int(xopt[2])
momentum = xopt[3]
max_iter = int(xopt[4])
solver = 'lbfgs'
model = MLPRegressor(hidden_layer_sizes=hidden_layer_sizes, learning_rate_init=learning_rate_init, momentum=momentum, max_iter=max_iter, solver=solver)
model.fit(trainX, trainY)
trainPredict = model.predict(trainX)
testPredict = model.predict(testX)
# 反归一化
trainPredict = scaler.inverse_transform(trainPredict.reshape(-1, 1))
trainY = scaler.inverse_transform(trainY.reshape(-1, 1))
testPredict = scaler.inverse_transform(testPredict.reshape(-1, 1))
testY = scaler.inverse_transform(testY.reshape(-1, 1))
# 画图
plt.plot(trainY)
plt.plot(trainPredict)
plt.plot(testY)
plt.plot(testPredict)
plt.show()
```
其中,tomato.csv是包含番茄生产数据的CSV文件,共有1列数据。整个流程分为以下几步:
1. 读取数据,并对数据进行归一化处理;
2. 划分训练集和测试集,并创建输入输出数据;
3. 定义目标函数,目标函数中的参数是BP神经网络的参数,使用粒子群算法对该参数进行优化;
4. 使用粒子群算法求解出最优参数,并使用该参数重新训练模型并预测;
5. 反归一化预测结果,并画出预测结果图。