EEMD 的分解精度也可以应用正交性指标IO 值来进行评价,IO计算公式及其python实现
时间: 2023-12-29 15:04:46 浏览: 140
正交性指标IO值是评估 EEMD 分解结果的一种常用方法。IO值越接近1,说明分解结果越好。
IO计算公式如下:
$$IO=\frac{\sum_{i=1}^{N}\sum_{j=1}^{N}S_{i,j}^2}{\sum_{i=1}^{N}\sum_{j=1}^{N}\sum_{k=1}^{n}{(S_{i,j,k}^2})}$$
其中,$S_{i,j}$ 是 EEMD 分解后的第 $i$ 个 IMF 和第 $j$ 个 IMF 的内积,$S_{i,j,k}$ 是 EEMD 分解后的第 $i$ 个 IMF 和第 $j$ 个 IMF 的第 $k$ 个分量的内积。
下面是 Python 实现代码:
```python
import numpy as np
def calc_IO(S):
n_IMF = S.shape[0]
IO_numerator = np.sum(S**2)
IO_denominator = np.sum(S.reshape(n_IMF, -1)**2, axis=1).sum()
IO = IO_numerator / IO_denominator
return IO
```
其中,输入参数 S 是 EEMD 分解后的结果,为一个包含多个 IMF 的三维数组。函数返回值为 IO值。
相关问题
EEMD 的分解精度也可以应用IO 值来进行评价,IO计算公式及其python实现
I/O值是评价信号分解精度的指标之一,通过计算信号在分解前后的信息熵差异来评价信号分解的效果。其计算公式如下:
$$ IO = \frac{H_{orig} - H_{decomp}}{H_{orig}} \times 100\% $$
其中,$H_{orig}$为原始信号的信息熵,$H_{decomp}$为分解后得到的各个IMF和残差的信息熵之和。IO值越大,表示分解的效果越好。
以下是Python实现:
```python
import numpy as np
from PyEMD import EMD
from scipy.stats import entropy
def calc_io(signal, num_imfs):
# 对信号进行EMD分解
emd = EMD()
imfs = emd(signal, max_imf=num_imfs)
residual = imfs[-1]
imfs = imfs[:-1]
# 计算原始信号的信息熵
orig_entropy = entropy(np.abs(signal))
# 计算分解后各个IMF和残差的信息熵之和
decomp_entropy = np.sum([entropy(np.abs(imf)) for imf in imfs]) + entropy(np.abs(residual))
# 计算IO值
io = (orig_entropy - decomp_entropy) / orig_entropy * 100
return io
```
其中,`signal`为输入的信号,`num_imfs`为要分解的IMF数。该函数返回计算得到的IO值。
EEMD 的分解精度也可以应用IO 值来进行评价,计算公式及其python实现
EMD(Empirical Mode Decomposition,经验模态分解)是一种将信号分解成若干固有模态函数(Intrinsic Mode Functions, IMF)的方法。而对于每个IMF,我们可以计算其瞬时频率(Instantaneous Frequency,IF)。
针对每个IMF,我们可以计算其带宽,然后通过带宽和IMF的振幅来计算该模态函数的信息熵。最后,将所有IMF的信息熵加权平均,就可以得到整个信号的信息熵,也就是EMD的信息熵分解精度。
具体的计算公式如下:
$$
IO = \frac{\sum_{i=1}^{n}E_i\cdot H_i}{\sum_{i=1}^{n}E_i}
$$
其中,$n$表示IMF的数量,$E_i$表示第$i$个IMF的能量,$H_i$表示第$i$个IMF的信息熵。
下面是Python实现的示例代码:
```python
import numpy as np
from scipy.stats import entropy
def calculate_IF(x):
"""计算信号x的瞬时频率"""
x_hilbert = np.imag(scipy.signal.hilbert(x))
IF = np.diff(np.unwrap(np.angle(x_hilbert))) / (2 * np.pi)
return IF
def calculate_emd_entropy(x):
"""计算信号x的EMD信息熵"""
from PyEMD import EMD
# 进行EMD分解
emd = EMD()
IMFs = emd(x)
# 计算每个IMF的带宽和信息熵
bandwidths = []
entropies = []
for IMF in IMFs:
IF = calculate_IF(IMF)
bandwidth = np.max(IF) - np.min(IF)
entropy = np.sum(-IMF**2 * np.log(IMF**2))
bandwidths.append(bandwidth)
entropies.append(entropy)
# 计算IO值
weights = np.array(bandwidths) / np.sum(bandwidths)
IO = np.sum(weights * np.array(entropies))
return IO
```
使用该函数,我们可以计算出给定信号的EMD信息熵。
阅读全文