信息熵是衡量离散概率分布不确定性的指标,公式为 H(X) = -Σ p(x)·log₂(p(x));C++ 标准库无现成实现,需手动完成频次统计、概率归一化、对数计算与加权求和四步。

什么是信息熵,为什么 C++ 里要自己算
信息熵(Shannon Entropy)本质是衡量一组离散概率分布的不确定性,公式是 H(X) = -Σ p(x) * log₂(p(x))。C++ 标准库没有现成函数,必须手动统计频次、归一化、累加。别指望 std::entropy——它不存在。你得从原始数据出发,自己走完「计数 → 概率 → 对数 → 加权求和」这四步。
用 std::map 或 std::unordered_map 统计频次最稳妥
输入通常是 std::vector 或 C 风格数组,先统计每个值出现次数。用 std::unordered_map 更快(平均 O(1) 插入),但要注意:如果 T 是自定义类型,得提供哈希和相等函数;基础类型(int、char、std::string)直接可用。
常见错误:遍历时用 map[key]++ 导致默认构造零值再加一,对 double 或指针类类型会出错。应改用 map.at(key)(需确保 key 存在)或更安全的写法:
for (const auto& x : data) {
counts[x]++; // 对 int/char/string 安全
}
统计完后,总样本数 n = data.size(),每个概率就是 static_cast。
计算时必须跳过概率为 0 的项,且避免 log2(0)
std::log2(0) 会返回 -inf,导致整个熵值失效。C++ 中只要 p == 0.0 就跳过这一项——注意浮点比较不能用 == 简单判断,但此处概率由整数除法得到,若频次为 0,则概率严格为 0.0,可直接判等。
关键代码片段:
double entropy = 0.0;
for (const auto& [value, count] : counts) {
double p = static_cast<double>(count) / n;
if (p > 0.0) { // 必须检查,否则 log2(0) 崩溃或污染结果
entropy -= p * std::log2(p);
}
}</double>
注意:std::log2 在 中,链接时无需额外选项;但某些旧编译器(如早期 MinGW)可能不支持,可退到 std::log(p) / std::log(2.0)。
字符数组、字节流、离散标签都适用,但别误把浮点数组当离散值用
信息熵要求输入是**离散取值**。如果你有一组 double 测量值,直接喂给上面逻辑会把每个细微差异当作不同符号,熵虚高。此时必须先量化(quantize):比如按区间分桶(floor(x / bin_width)),或聚类后取中心索引。
典型适用场景包括:
- 计算字符串中各字符的信息熵(如密码强度粗估)
- 评估分类模型输出的 softmax 概率向量的置信度(
entropy(logits)前需先softmax) - 图像直方图的灰度级熵(8-bit 图像天然离散)
最容易被忽略的一点:熵值单位是 bit,但它只反映分布形状,不反映数据长度。两个不同长度的序列可能有完全相同的熵——只要它们的相对频次一致。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











