[开源] 基于CEEMDAN算法的python代码

本文分享了如何使用Python实现CEEMDAN算法对电力负荷数据进行分解,包括模态分量和残差分量的计算,并展示了如何将该算法应用于时间序列预测。同时,文中提到了结合其他模型的组合方法和数据可视化过程。
摘要由CSDN通过智能技术生成

整理了基于CEEMDAN算法的python代码,免费分享给大家,记得点赞哦~~~~

该算法主要对处理完的数据进行CEEMDAN分解,分解为K个模态分量和1个残差分量。

废话不多说直接上图和代码。

#!/usr/bin/env python
# coding: utf-8




import matplotlib.pyplot as plt
# 导入matplotlib的pyplot模块,用于数据可视化。
import tensorflow as tf
# 导入tensorflow库,用于深度学习模型的构建和训练
from PyEMD import EMD, EEMD, CEEMDAN
# 从PyEMD库导入EMD, EEMD, CEEMDAN,用于模态分解
import pandas as pd
# 导入pandas库,用于数据处理和分析
import warnings
# 导入warnings库,用于控制警告消息
warnings.filterwarnings("ignore")
# 设置忽略警告消息,通常用于减少输出中的不必要警告




# 调用GPU加速
gpus = tf.config.experimental.list_physical_devices(device_type='GPU')
for gpu in gpus:
    tf.config.experimental.set_memory_growth(gpu, True)




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


df_raw_data = pd.read_csv('电力负荷预测数据2.csv', encoding='gbk')
# 使用pandas的read_csv函数读取CSV文件。
# '股票预测.csv'是文件名。
# usecols=[0,-1]指定只读取CSV文件的第一列和最后一列。
# encoding='gbk'指定文件编码格式为GBK,GBK常用于中文字符编码。
series_close = pd.Series(df_raw_data['power'].values, index=df_raw_data['time'])
# 创建一个pandas的Series对象。
# df_raw_data['power'].values提取'power'列的值作为Series的数据。
# index=df_raw_data['time']设置Series的索引为'time'列的值。


print(series_close)



def ceemdan_decompose(series=None, trials=100, num_clusters=3):
    # 定义CEEMDAN分解函数。
    # series: 待分解的时间序列数据。
    # trials: CEEMDAN的试验次数,用于生成噪声。
    # num_clusters: 分解后的模态数量(这个参数在函数内并未使用)。

    decom = CEEMDAN()
    # 创建CEEMDAN对象。

    decom.trials = trials 
    # 设置CEEMDAN对象的试验次数。

    df_ceemdan = pd.DataFrame(decom(series.values).T)
    # 对时间序列数据执行CEEMDAN分解,并将结果转置后转换为DataFrame。

    df_ceemdan.columns = ['imf' + str(i+1) for i in range(len(df_ceemdan.columns))]
    # 为DataFrame的每一列命名,表示每个内在模态函数(IMF)。

    df = pd.DataFrame(df_ceemdan, columns=df_ceemdan.columns)
    # 创建一个新的DataFrame(这一步实际上是多余的,因为df_ceemdan已经是所需的DataFrame了)。

    return df_ceemdan
    # 返回分解结果的DataFrame。



df_ceemdan = ceemdan_decompose(series_close)
# 对series_close进行CEEMDAN分解,并返回结果的DataFrame。

# 可视化VMD分解结果
fig, axs = plt.subplots(nrows=len(df_ceemdan.columns), figsize=(10, 6), sharex=True)
# 创建一个绘图对象和多个子图对象。

for i, col in enumerate(df_ceemdan.columns):
    axs[i].plot(df_ceemdan[col])
    axs[i].set_title(col)
    # 遍历每个模态并绘制在子图上。

plt.suptitle('CEEMDAN Decomposition')
# 设置图表的总标题。

plt.xlabel('Time')
# 设置x轴的标签。

plt.show()
# 显示图表。




print(df_ceemdan)



df_ceemdan.to_excel("CEEMDAN.xlsx",index=False)#保存数据为CEEMDAN.xlsx







更多CEEMDAN组合算法获取链接:基于CEEMDAN的5种组合模型的时间序列预测python代码合集

CEEMDAN是一种信号分解方法,它可以将非线性和非平稳信号分解成若干个固有模态函数(IMF)的叠加。下面是CEEMDANPython实现代码: ```python import numpy as np from scipy.interpolate import UnivariateSpline def emd(x): x = x.astype(np.float64) t = np.arange(len(x)) imf = np.zeros((len(x), 2)) while True: if np.max(np.abs(x)) < 1e-10: break h = x sd = np.inf while sd > 0.1: spl = UnivariateSpline(t, h) h1 = h - spl(t) spl = UnivariateSpline(t, h1) h2 = h1 - spl(t) sd = np.sqrt(np.mean(h2 ** 2)) h = h1 - h2 imf[:, 0] += h imf[:, 1] += x - h x = imf[:, 1] return imf def ceemdan(x, n_imfs): x = x.astype(np.float64) imfs = np.zeros((len(x), n_imfs)) for i in range(n_imfs): imf = emd(x) imfs[:, i] = imf[:, 0] x -= imf[:, 0] imfs[:, -1] += x return imfs ``` 其中,`emd`函数实现了一次EMD分解,`ceemdan`函数实现了多次EMD分解,得到多个IMF。具体实现过程如下: 1. 首先将输入信号`x`转换为浮点数类型,并生成时间序列`t`。 2. 进入循环,如果信号的最大值小于1e-10,则跳出循环。 3. 将当前信号`x`赋值给变量`h`,并初始化标准差`sd`为正无穷。 4. 进入内层循环,使用样条插值方法拟合信号`h`,得到拟合曲线`spl(t)`。 5. 计算残差信号`h1=h-spl(t)`,再次使用样条插值方法拟合`h1`,得到拟合曲线`spl(t)`。 6. 计算残差信号`h2=h1-spl(t)`的标准差`sd`,如果`sd>0.1`,则将`h=h1-h2`,继续进行内层循环;否则跳出内层循环。 7. 将分解得到的IMF分别存储在二维数组`imf`的第一列中,将剩余信号存储在第二列中。 8. 将剩余信号作为新的输入信号,继续进行EMD分解,直到剩余信号的最大值小于1e-10或者达到最大迭代次数。 9. `ceemdan`函数调用多次`emd`函数,得到多个IMF,最后一个IMF加上剩余信号作为最后一个分量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值