You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决Python使用pywt计算小波熵时出现nan值的问题

小波熵计算出现nan值的解决方法

问题原因

  • 概率项p存在负值:小波分解得到的系数可正可负,直接参与计算会导致log(负数)返回nan
  • 概率项p存在0值:log(0)返回-inf,参与求和计算后会触发nan
  • 计算逻辑不符合小波熵定义:小波熵的概率项应为单系数能量占该频段总能量的比值,要求取值范围为[0,1],原代码的计算逻辑完全不符合该要求
  • 存在多余的遍历逻辑:原代码遍历原始信号采样点的操作无意义,小波熵直接基于小波系数计算即可

修复后代码

import numpy as np
import pywt

# 加载数据
data = np.loadtxt('data.txt')
# 5层db4小波分解
cA5, cD5, cD4, cD3, cD2, cD1 = pywt.wavedec(data, 'db4', mode='symmetric', level=5)

def calc_wavelet_entropy(coeff):
    # 计算每个小波系数的能量
    energy = coeff ** 2
    total_energy = np.sum(energy)
    # 兜底处理:总能量为0时熵为0
    if total_energy == 0:
        return 0.0
    # 归一化得到概率分布
    p = energy / total_energy
    # 截断极小值,避免log(0)报错
    epsilon = 1e-12
    p = np.clip(p, epsilon, 1.0)
    # 计算香农熵
    return -np.sum(p * np.log(p))

# 计算D2频段小波熵
ent_d2 = calc_wavelet_entropy(cD2)
print(f"D2频段小波熵:{ent_d2}")

关键修复说明

  • 修正了概率计算逻辑,确保所有概率项为非负值,取值范围在(0,1]区间
  • 增加极小值截断处理,避免log运算出现无效值
  • 增加总能量为0的兜底判断,避免除以0的错误
  • 移除无意义的原始数据遍历步骤,符合小波熵的标准计算流程

内容的提问来源于stack exchange,提问作者Hanie Asemi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 13:18:03