如何从频率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())
我有一堆名字(> 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())