#!/usr/bin/env python
# coding: utf-8
# In[1]:
import os # 导入 os 模块,用于与操作系统进行交互
import copy # 导入 copy 模块,用于创建对象的副本
import numpy # 导入 numpy 模块,用于数值计算
import random # 导入 random 模块,用于生成随机数
import datetime # 导入 datetime 模块,用于处理日期和时间
import math # 导入 math 模块,用于数学函数
import pandas as pd # 导入 pandas 模块,用于数据处理和分析
import numpy as np # 导入 numpy 模块,并将其重命名为 np,以方便使用
import matplotlib.pyplot as plt # 导入 matplotlib 的 pyplot 模块,用于绘图
from sampen import sampen2 # 样本熵模块
from vmdpy import VMD # 从 vmdpy 包导入 VMD 模块,用于变分模态分解
import warnings # 导入 warnings 模块,用于控制警告信息
from scipy.fftpack import hilbert, fft, ifft # 从 scipy.fftpack 模块导入指定的函数
from math import log # 从 math 模块导入 log 函数
from typing import List # 从 typing 模块导入 List 类型,用于类型提示
#更多模型咸鱼搜索机器学习之心,支持模型定制
warnings.filterwarnings("ignore") # 忽略警告信息的输出
# In[2]:
# 读取名为'焦作全.csv'的CSV文件,并将其存储在变量`data`中,只使用第一列和第二列数据
data = pd.read_csv('A.csv', usecols=[0, 1])
#更多模型咸鱼搜索机器学习之心,支持模型定制
Y = 'A' # 将字符串'AQI'赋值给变量`Y`
# In[3]:
tau = 0 # 初始化变量tau为整数值0
DC = 0 # 初始化变量DC为整数值0
#更多模型咸鱼搜索机器学习之心,支持模型定制
init = 1 # 初始化变量init为整数值1
tol = 1e-7 # 初始化变量tol为浮点数1e-7(即0.0000001)
# In[4]:
def EE(signal: np.array, epsilon=1e-10) -> float:
"""
该函数计算一个信号的包络熵。
:param signal: 输入信号
:param epsilon: 一个很小的常数,用以避免log(0)和除以零的情况
:return: 信号的包络熵
"""#更多模型咸鱼搜索机器学习之心,支持模型定制
# 计算 Hilbert 变换的绝对值来得到包络信号
envelope_signal = np.abs(hilbert(signal))
# 将包络信号归一化到 [0,1] 范围
scaler = MinMaxScaler()
envelope_signal_normalized = scaler.fit_transform(envelope_signal.reshape(-1,1))
# 用一个很小的正常数替换信号中的零值
envelope_signal_normalized[envelope_signal_normalized == 0] = epsilon
# 计算包络信号的熵
p = envelope_signal_normalized / (np.sum(envelope_signal_normalized) + epsilon)
entropy = -np.sum(p*np.log2(p + epsilon))
# 如果计算出的熵是 NaN,发出警告并返回 NaN
if np.isnan(entropy):
print(f"警告:在为信号 {signal} 计算包络熵时遇到 NaN 值")
return np.nan
return entropy
# In[ ]:
#更多模型咸鱼搜索机器学习之心,支持模型定制
# In[5]:
# 包络熵
def training(X):#更多模型咸鱼搜索机器学习之心,支持模型定制
alpha = int(X[0]) # 将X列表中的第一个元素转换为整数并赋值给变量alpha
K = int(X[1]) # 将X列表中的第二个元素转换为整数并赋值给变量K
print('参数为:',X) # 打印参数X的值
u, u_hat, omega = VMD(data[Y], alpha=alpha, tau=tau, K=K, DC=DC, init=init, tol=tol) # 使用VMD函数进行信号分解
df_vmd = pd.DataFrame(u.T) # 创建DataFrame来存储VMD分解的结果
df_vmd.columns = ['imf'+str(i) for i in range(K)] # 为每个列设置列名,命名为'imf'加上索引号
np_envelope_entropy = [] # 创建一个空列表来存储包络熵值
for i in range(len(df_vmd.columns)):
# 对每个 imf 信号计算包络熵
envelope = EE(df_vmd['imf'+str(i)].values) # 对'imf'+索引号对应的列进行包络熵计算
np_envelope_entropy.append(envelope) # 将包络熵值添加到列表中
# 将所有 imf 信号的包络熵存储在一个 DataFrame 中
entropy = pd.DataFrame(np_envelope_entropy, index=['imf'+str(i) for i in range(len(df_vmd.columns))])
ee = entropy[0].mean() # 计算包络熵的平均值
print('的适应度:',ee) # 打印适应度值
return ee # 返回适应度值
# In[ ]:
#更多模型咸鱼搜索机器学习之心,支持模型定制
# In[6]:
# 样本熵
def training(X):
alpha = int(X[0]) # 将X列表中的第一个元素转换为整数并赋值给变量alpha
K = int(X[1]) # 将X列表中的第二个元素转换为整数并赋值给变量K
print(X) # 打印X的值#更多模型咸鱼搜索机器学习之心,支持模型定制
u, u_hat, omega = VMD(data[Y], alpha=alpha, tau=tau, K=K, DC=DC, init=init, tol=tol) # 使用VMD函数进行信号分解
df_vmd = pd.DataFrame(u.T) # 创建DataFrame来存储VMD分解的结果
df_vmd.columns = ['imf'+str(i) for i in range(K)] # 为每个列设置列名,命名为'imf'加上索引号
np_sampen = [] # 创建一个空列表来存储样本熵值
for i in range(len(df_vmd.columns)):
sample_entropy = sampen2(list(df_vmd['imf'+str(i)].values),mm = 1,r = 0.1,normalize=True) # 对'imf'+索引号对应的列计算样本熵
np_sampen.append(sample_entropy[1][1]) # 将样本熵值添加到列表中
df_sampen = pd.DataFrame(np_sampen, index=['imf'+str(i) for i in range(len(df_vmd.columns))]) # 创建DataFrame来存储样本熵值
sampen = df_sampen.max().values[0] # 获取样本熵的最大值
print(sampen) # 打印样本熵的值
return sampen # 返回样本熵的值
# In[ ]:
# In[7]:
'''适应度函数,最小化各VMD分量的局部包络熵'''
def training1(X):
np.random.seed(0) # 设置随机种子为0
K = int(X[0]) # 将X列表中的第一个元素转换为整数并赋值给变量K
alpha = int(X[1]) # 将X列表中的第二个元素转换为整数并赋值给变量alpha
print(K, alpha) # 打印K和alpha的值
imf, u_hat, omega = VMD(data[Y], alpha, tau, K, DC, init, tol) # 使用VMD函数进行信号分解,并获取分解结果
comp = np.vstack([imf.reshape(1, -1)]) # 将分解结果按行堆叠成一个二维数组
SE = 0 # 初始化局部包络熵的总和为0
se_imf = [] # 创建一个空列表来存储各个分量的局部包络熵
for i in range(comp.shape[0]):#更多模型咸鱼搜索机器学习之心,支持模型定制
temp = EE(comp[i, :]) # 计算第i个分量的局部包络熵
SE += temp # 将局部包络熵添加到总和中
se_imf.append(temp) # 将局部包络熵添加到列表中
# fit = SE # 将总的局部包络熵作为适应度函数值
# fit = SE/K # 将总的局部包络熵除以分量数K作为适应度函数值
fit = min(se_imf) # 选择各分量局部包络熵的最小值作为适应度函数值
return fit # 返回适应度函数值
# In[ ]:
# In[8]:
class SSA():
def __init__(self, func, n_dim=None, pop_size=20, max_iter=50, lb=-512, ub=512, verbose=False):
self.func = func
self.n_dim = n_dim # 粒子的维度,也是目标函数的变量个数
self.pop = pop_size # 粒子数量
P_percent = 0.2 # # 生产者的人口规模占总人口规模的20%
D_percent = 0.1 # 预警者的人口规模占总人口规模的10%
self.pNum = round(self.pop * P_percent) # 生产者的人口规模占总人口规模的20%
self.warn = round(self.pop * D_percent) # 预警者的人口规模占总人口规模的10%
#更多模型咸鱼搜索机器学习之心,支持模型定制
self.max_iter = max_iter # 最大迭代次数
self.verbose = verbose # 是否打印每次迭代的结果
# 根据给定的 lb 和 ub 列表设置下界和上界数组
self.lb, self.ub = np.array(lb) * np.ones(self.n_dim), np.array(ub) * np
没有合适的资源?快使用搜索试试~ 我知道了~
Python实现SSA-VMD信号分解降噪(完整源码和数据)

共3个文件
xlsx:1个
py:1个
csv:1个

1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉

温馨提示
1.Python实现SSA-VMD信号分解降噪((完整源码和数据) anaconda + pycharm + python +Tensorflow 注意事项:保姆级注释,几乎一行一注释,方便小白入门学习! 2.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 3.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 4.作者介绍:某大厂资深算法工程师,从事Matlab、Python算法仿真工作8年;擅长智能优化算法、神经网络预测、信号处理、元胞自动机等多种领域的算法仿真实验,更多仿真源码、数据集定制私信+
资源推荐
资源详情
资源评论





























收起资源包目录




共 3 条
- 1
资源评论

- weixin_471458522024-07-09发现一个超赞的资源,赶紧学习起来,大家一起进步,支持!
- 普通网友2025-03-03资源值得借鉴的内容很多,那就浅学一下吧,值得下载!

机器学习之心
- 粉丝: 3w+
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈



安全验证
文档复制为VIP权益,开通VIP直接复制
