如何从频率table计算熵?

How to calculate entropy from frequency table?

我有一堆名字(> 1000 万)及其相关计数的数据。

import pandas as pd
import numpy as np


data = {
    "Name": ['Sara', 'John', 'Mark', 'Peter', 'Kate'],
    "Count": [20, 10, 5, 2, 5],
}

df = pd.DataFrame(data)
print(df)
    Name  Count
0   Sara     20
1   John     10
2   Mark      5
3  Peter      2
4   Kate      5

我想计算 Count 列的熵,但不将数据扩展为 [Sara, Sara, Sara,...,Kate, Kate, Kate],因为对此的观察太多了。

如何在不扩展数据的情况下计算 Count 的熵?

假设数据框包含每个名称的计数值,您可以直接将 Series 个计数提供给 scipy.stats.entropy:

from scipy.stats import entropy

entropy(df.set_index('Name').squeeze())
# 1.3466893828909594

正如@nils 提到的,如果你想要的是二元熵,你可以设置 base=2

如果你想计算德香农熵H = -Sum[ P(xi) * log2( P(xi)) ]

import pandas as pd
import numpy as np
import math


data = {
    "Name": ['Sara', 'John', 'Mark', 'Peter', 'Kate'],
    "Count": [20, 10, 5, 2, 5],
}

df = pd.DataFrame(data)
df['prob'] = df['Count']/df['Count'].sum()
df['log'] = df.apply(lambda x: math.log(x['prob'],2),axis=1)
df['prod'] = df['prob']*df['log']

print('Entropy: ', -df['prod'].sum())