如何解决在 Python 中获取 nan 熵?
How to Solve Getting nan Entropy in Python?
根据一篇关于脑机接口的论文,我想用离散小波变换提取时频域特征,然后用给出的方程计算能量和熵。
所以我选择pywt in python, and now I have the below code for getting wavelet and entropy from each frequency band ( for example I'm using D2 ), and here是数据的link:
import numpy as np
data = np.loadtxt('data.txt')
import pywt
cA5, cD5, cD4, cD3, cD2, cD1 = pywt.wavedec(data,'db4',mode='symmetric',level= 5)
Ent = 0
for d in data:
E = d**2
p = cD2 * E
Ent -= np.sum( np.abs( p * np.log(p) ) )
print(Ent)
但我得到每个频段的熵 nan
。如何解决获取小波熵的 nan 值?
你的问题是小波变换的第二个频带的结果中的负数。负数的对数导致 nan
使用 numpy
和 ValueError: math domain error
使用 python 的 math
库引发异常。
顺便说一句,我认为您在实施公式时犯了一个错误。我认为这是正确的实现方式:
ENT2 = -np.dot(np.log(np.square(cD2)), np.square(cD2))
ENG = np.square(cD2).sum()
根据一篇关于脑机接口的论文,我想用离散小波变换提取时频域特征,然后用给出的方程计算能量和熵。
所以我选择pywt in python, and now I have the below code for getting wavelet and entropy from each frequency band ( for example I'm using D2 ), and here是数据的link:
import numpy as np
data = np.loadtxt('data.txt')
import pywt
cA5, cD5, cD4, cD3, cD2, cD1 = pywt.wavedec(data,'db4',mode='symmetric',level= 5)
Ent = 0
for d in data:
E = d**2
p = cD2 * E
Ent -= np.sum( np.abs( p * np.log(p) ) )
print(Ent)
但我得到每个频段的熵 nan
。如何解决获取小波熵的 nan 值?
你的问题是小波变换的第二个频带的结果中的负数。负数的对数导致 nan
使用 numpy
和 ValueError: math domain error
使用 python 的 math
库引发异常。
顺便说一句,我认为您在实施公式时犯了一个错误。我认为这是正确的实现方式:
ENT2 = -np.dot(np.log(np.square(cD2)), np.square(cD2))
ENG = np.square(cD2).sum()