Как рассчитать энтропию из таблицы частот? - PullRequest
0 голосов
/ 23 сентября 2019

У меня есть данные о группе имен (> 10 миллионов) и связанных с ними счетах.

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 без расширения данных?

Ответы [ 2 ]

1 голос
/ 23 сентября 2019

Предполагая, что фрейм данных содержит значения значений для каждого имени, вы можете напрямую передать Series значений в scipy.stats.entropy:

from scipy.stats import entropy

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

как @Нильс упоминает, что если вам нужна двоичная энтропия, вы можете установить base=2

0 голосов
/ 23 сентября 2019

Если вы хотите вычислить энтропию де Шеннона 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())
...