import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler,StandardScaler
from sklearn.metrics import r2_score
from sklearn.neural_network import MLPRegressor
import matplotlib as mpl
mpl.rcParams['font.sans-serif'] = ['KaiTi']
mpl.rcParams['font.serif'] = ['KaiTi'] #解决matplotlib无法显示中文的问题
plt.rcParams['axes.unicode_minus']=False #解决负数坐标显示问题
# In[]
def split_data(data,n):
# 前n时刻的值为输入
# 预测n+1个时刻的值
in_=[]
out_=[]
N=data.shape[0]-n
for i in range(N):
in_.append(data[i:i+n,])
out_.append(data[i+n,])
in_=np.array(in_).reshape(-1,n)
out_=np.array(out_).reshape(-1,1)
return in_,out_
fname='7day'# 7day 30day 60day
y=np.load('result/'+fname+'.npz')['data_imfs']
test_pred_each_mode,test_real_each_mode=[],[]
imf=y
train_again=0#是否重新训练测试
if train_again:
for mode in range(imf.shape[0]):
print('对第',mode+1,'个分量进行bp回归建模')
in_,out_=split_data(imf[mode,:],n=10)
m=-144#最后一天做测试集
pt=in_[:m,:]
tt=out_[:m,:]
pe=in_[m:,:]
te=out_[m:,:]
# 归一化
#ss_X=MinMaxScaler().fit(pt)
#ss_y=MinMaxScaler().fit(tt)
ss_X=StandardScaler().fit(pt)
ss_y=StandardScaler().fit(tt)
pt = ss_X.transform(pt)
train_y = ss_y.transform(tt)
pe = ss_X.transform(pe)
test_y = ss_y.transform(te)
model = MLPRegressor(
hidden_layer_sizes=(6), activation='relu', solver='adam', alpha=0.0001, batch_size='auto',
learning_rate='constant', learning_rate_init=0.001, power_t=0.5, max_iter=50,random_state=1)
model.fit (pt,train_y)
yhat=model.predict(pe).reshape(-1,1)
test_pred = ss_y.inverse_transform(yhat)
test_label = ss_y.inverse_transform(test_y)
test_pred_each_mode.append(test_pred)
test_real_each_mode.append(test_label)
print('-----------')