VMD模态分解以及K值优化python代码

发布时间:2023年12月19日


前言

看。


一、VMD模态分解python代码

import numpy as np
import matplotlib.pyplot as plt
from vmdpy import VMD

# 创建一个由三个不同频率的正弦波叠加而成的信号
fs = 1000  # 采样频率
t = np.linspace(0, 1, fs)  # 时间向量
f1, f2, f3 = 5, 12, 30  # 三个正弦波的频率
x1 = np.sin(2 * np.pi * f1 * t)
x2 = np.sin(2 * np.pi * f2 * t)
x3 = np.sin(2 * np.pi * f3 * t)
x = x1 + x2 + x3  # 叠加信号

# VMD参数
alpha = 2000       # moderate bandwidth constraint
tau = 0.            # noise-tolerance (no strict fidelity enforcement)
K = 3               # 3 modes
DC = 0              # no DC part imposed
init = 1            # initialize omegas uniformly
tol = 1e-7

# VMD分解
u, u_hat, omega = VMD(x, alpha, tau, K, DC, init, tol)

# 绘制原始信号
plt.figure(figsize=(16, 8))
plt.subplot(4, 1, 1)
plt.plot(t, x, 'k')
plt.title('Original signal')

# 检查 u 的形状并转置(如果需要)
if u.shape[0] == 3:
    u = u.T

# 绘制 VMD 分解后的每个模式
for i in range(K):
    plt.subplot(4, 1, i+2)
    plt.plot(t, u[:, i])
    plt.title('Mode {}'.format(i+1))

plt.tight_layout()
plt.show()

二、K值的优化

在VMD(Variational Mode Decomposition)算法中,K值代表要分解的模态数量。选择合适的K值对于算法的性能至关重要。如果K值设置得太小,可能无法捕捉到所有重要的模态;如果设置得太大,则可能会产生一些无意义的模态。

1.样本熵

样本熵(Sample Entropy)是一种用于测量时间序列复杂度的工具,它可以用来评估时间序列的不规则性。样本熵越大,数据越复杂,不可预测性越高。

2.排列熵

代码如下(示例):

import numpy as np
from vmdpy import VMD
import math
from itertools import permutations

# 排列熵计算函数
def permutation_entropy(time_series, m, delay):
    n = len(time_series)
    permutations_dict = {p: 0 for p in permutations(range(m))}
    for i in range(n - delay * (m - 1)):
        # 生成原始数据的排列序列
        sorted_index_tuple = tuple(np.argsort(time_series[i:i + delay * m:delay]))
        permutations_dict[sorted_index_tuple] += 1

    # 计算概率分布并得到排列熵
    pe = 0.0
    for permutation, count in permutations_dict.items():
        if count > 0:
            p = count / (n - delay * (m - 1))
            pe -= p * math.log(p)
    return pe

# 创建一个由三个不同频率的正弦波叠加而成的信号
fs = 1000  # 采样频率
t = np.linspace(0, 1, fs)  # 时间向量
f1, f2, f3 = 5, 12, 30  # 三个正弦波的频率
x1 = np.sin(2 * np.pi * f1 * t)
x2 = np.sin(2 * np.pi * f2 * t)
x3 = np.sin(2 * np.pi * f3 * t)
x = x1 + x2 + x3  # 叠加信号

# VMD参数
alpha = 2000       # moderate bandwidth constraint
tau = 0.           # noise-tolerance (no strict fidelity enforcement)
DC = 0             # no DC part imposed
init = 1           # initialize omegas uniformly
tol = 1e-7

# 排列熵参数
m = 3  # 嵌入维度
delay = 1  # 延迟

# 循环不同的K值
for K in range(2, 9):
    # VMD分解
    u, u_hat, omega = VMD(x, alpha, tau, K, DC, init, tol)
    
    # 检查 u 的形状并转置(如果需要)
    if u.shape[0] == K:
        u = u.T
    
    # 计算每个分量的排列熵
    permutation_entropies = []
    for i in range(K):
        pe = permutation_entropy(u[:, i], m, delay)
        permutation_entropies.append(pe)
    
    # 计算排列熵的均值
    mean_pe = np.mean(permutation_entropies)
    
    # 输出排列熵及其均值
    print(f"K={K}时各分量的排列熵: {permutation_entropies}")
    print(f"K={K}时排列熵的均值: {mean_pe}")

发现K值取4的时候排列熵均值最低。

3.功率谱熵、奇异谱熵、能量熵、近似熵、模糊熵


总结

其他的待补充完善。

文章来源:https://blog.csdn.net/linmuquan1989/article/details/135074580
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。