看。
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()
在VMD(Variational Mode Decomposition)算法中,K值代表要分解的模态数量。选择合适的K值对于算法的性能至关重要。如果K值设置得太小,可能无法捕捉到所有重要的模态;如果设置得太大,则可能会产生一些无意义的模态。
样本熵(Sample Entropy)是一种用于测量时间序列复杂度的工具,它可以用来评估时间序列的不规则性。样本熵越大,数据越复杂,不可预测性越高。
代码如下(示例):
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的时候排列熵均值最低。
其他的待补充完善。