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

Pandas计算熵返回'-inf':成因分析与修正方法咨询

关于计算信用卡客户数据集熵时出现 -inf 的问题解答

嘿,我来帮你理清这个问题——你遇到的 -inf 熵值,本质是因为用错了计算方法,咱们一步步拆解:

为什么会出现 -inf?

首先,scipy.stats.entropy 这个函数的设计初衷是接收概率分布(也就是每个类别出现的频率,总和得是1),而不是直接丢原始数据进去。你直接传整个DataFrame的话,函数会把每列的原始数值当成概率项来计算,这就完全偏离了香农熵的计算逻辑。

当某列里有0值,或者所有取值完全相同时,计算过程中会触发 0 * log(0) 的运算——理论上这个项的极限是0,但计算机里 log(0) 直接返回 -inf,最后就得到了你看到的 -inf 结果。简单说,这些 -inf 对应的特征其实是没有分布多样性的(比如全是同一个值),理论熵应该是0,只是错误的输入方式让函数输出了异常值。

正确计算特征熵的方法

要得到正确的熵值,得先统计每个特征的取值频率,再传给熵函数。用Pandas可以这么写:

import pandas as pd
from scipy.stats import entropy

# 先把不需要计算的ID列去掉(如果有的话)
feature_data = df.drop(columns=["ID"])

# 写个小函数计算单个特征的熵
def get_feature_entropy(series):
    # 统计每个取值的频率(normalize=True会转成概率)
    value_probs = series.value_counts(normalize=True).values
    # 如果特征只有一种取值,熵直接是0;否则计算熵
    return entropy(value_probs) if len(value_probs) > 1 else 0.0

# 对所有特征应用这个函数
feature_entropies = feature_data.apply(get_feature_entropy)

快速修正现有结果(把 -inf 换成0)

如果你只是想快速处理当前得到的结果,用NumPy的nan_to_num就能一键替换 -inf 为0:

import numpy as np

# 你原来的熵结果数组
original_entropy = np.array([10.11582214, 10.01808774, 10.25940955, 10.22181775, 10.25018627, 10.27641471, -np.inf, -np.inf, -np.inf, -np.inf, -np.inf, -np.inf, -np.inf, -np.inf, -np.inf, -np.inf, -np.inf, -np.inf, 9.15542383, 8.98160775, 8.97607359, 8.94236069, 8.94899185, 8.81999977, 8.80026465])

# 替换所有负无穷为0
corrected_entropy = np.nan_to_num(original_entropy, neginf=0)
print(corrected_entropy)

这么处理后,那些原本无多样性的特征熵就会变成符合理论的0值。

最后再提醒下

以后计算特征熵的时候,一定要先转成概率分布再传进函数,不然很容易出现这种数值异常。那些 -inf 其实就是函数在告诉你“我收到的输入不对,没法算出合理的熵”~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:58:40