基于Tensorflow2.0的EMD-COA-LSTM的降水量预测

EMD分解代码,这里比较简单,直接用PyEMD库就可以实现。

import pandas as pd
from PyEMD import EMD
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号

data = pd.read_excel('data.xls',header=0,index_col=0)
data = data.fillna(method='bfill')
df = data.iloc[:,:-1]
df1 = df.T

data_new = pd.DataFrame()
for i in range(df1.shape[1]):
    data_new = pd.concat([data_new,pd.DataFrame(df1.iloc[:,i:i+1].values)],axis=0)

new_index = pd.date_range(start='1960-01-01', periods=len(data_new), freq='MS')
data_new.index = new_index

signal = data_new.iloc[:,0:].values.reshape(-1)

# 应用EMD方法
emd = EMD()

IMFs = emd(signal)

num_imfs = IMFs.shape[0]
print(f"共有 {num_imfs} 个分解后的子信号:")
for i, imf in enumerate(IMFs):
    plt.figure(dpi=300)
    plt.plot(imf)
    plt.xlabel('累计月数')
    plt.ylabel(f'子序列{i}')
    plt.grid(ls='--', alpha=0.5)
    plt.savefig(f'figure/子序列{i}.png', format = 'png', bbox_inches='tight',dpi=300)
    plt.show()

ims = pd.DataFrame(IMFs,columns=None)
imst = ims.T
imst.index = new_index

ddd = pd.concat([data_new,imst],axis=1)
ddd.to_csv('data_split.csv',encoding='gbk')

 分解后的子序列图片。

 

LSTM模型

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import tensorflow as tf
from OA import COA
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from tensorflow.keras.models import Sequential
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.layers import LSTM, Dense
from sklearn.metrics import r2_score,mean_squared_error,mean_absolute_error
import os, random
os.environ['CUDA_VISIBLE_DEVICES'] = '-1'
# 设置中文字体
plt.rcParams['font.family'] = 'SimHei'
# 设置正常显示符号
plt.rcParams['axes.unicode_minus'] = False


data = pd.read_csv('data_split.csv', encoding='gbk', index_col=0)

X = data.iloc[:,0:].values
Y = data.iloc[:,0:1].values

X_SS = StandardScaler()
Y_SS = StandardScaler()

x = X_SS.fit_transform(X)
y = Y_SS.fit_transform(Y)
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=42, test_size=0.2, shuffle=False)

#定义时间滑窗函数
def create_time_windows(x, y, window_size, stride):
    '''
    :param x: 特征值
    :param y: 目标值
    :param window_size:时间窗格大小
    :param stride: 时间步长
    :return: 返回增加了时间滑窗的x和y
    '''
    x_windows = []
    y_windows = []
    for i in range(0, len(x) - window_size, stride):
        x_window = x[i:i+window_size+1]
        y_window = y[i+window_size]
        x_windows.append(x_window)
        y_windows.append(y_window)
    return np.array(x_windows), np.array(y_windows)

window_size = 7 #时间窗格大小
stride = 1       #时间步长

#划分训练集和测试集
x_train, y_train = create_time_windows(x_train, y_train, window_size, stride)
x_test, y_test = create_time_windows(x_test, y_test, window_size, stride)

def lstm(units,lr,epoch,batch_size):
    model = Sequential()
    model.add(LSTM(units,input_shape=(x_train.shape[1],x_train.shape[2])))
    model.add(Dense(1))
    model.compile(loss='mse',optimizer=Adam(lr))
    history = model.fit(x_train,y_train,epochs=epoch,batch_size=batch_size,verbose=0,validation_data=(x_test,y_test))

    pre = model.predict(x_test)
    pre_invers = Y_SS.inverse_transform(pre)
    y_test_invers = Y_SS.inverse_transform(y_test)
    return model,history,pre_invers,y_test_invers

def fun_fitness(x):
    # 设置随机数种子
    tf.random.set_seed(666)
    np.random.seed(666)
    random.seed(666)

    units = int(x[0]) #神经元个数
    lr = x[1]         #初始学习率
    epoch = int(x[2]) #迭代次数
    batch_size = int(x[3]) #batch_size

    model, history, pre_invers, y_test_invers = lstm(units,lr,epoch,batch_size)

    fitness = mean_squared_error(y_test_invers,pre_invers)

    return fitness

 预测结果。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
基于EMD-PCA-LSTM的光伏功率预测模型是一种利用EMD-PCA-LSTM算法进行光伏输出功率预测的模型。该模型首先使用经验模态分解(EMD)方法对光伏功率数据进行分解,将其分解为多个固有模态函数(IMF)和一个趋势函数。然后,利用主成分分析(PCA)方法对得到的IMF进行降维处理,选取其中的主要成分作为输入特征。最后,使用长短期记忆(LSTM)神经网络对选取的特征进行训练和预测,得到光伏功率的预测结果。该模型在考虑了光伏发电功率的主要环境因素的基础上,能够有效地预测光伏输出功率的不稳定性和间歇波动特点。\[1\]\[3\] #### 引用[.reference_title] - *1* *3* [基于EMD-PCA-LSTM的光伏功率回归预测模型论文复现——附代码](https://blog.csdn.net/widhdbjf/article/details/129176044)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [【光伏功率预测】基于EMD-PCA-LSTM的光伏功率预测模型(Matlab代码实现)](https://blog.csdn.net/weixin_46039719/article/details/128880698)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值