Как найти энтропию каждого столбца набора данных Python?

У меня есть набор данных, квантованный Python до 10 уровней, и он выглядит так:

9 9 1 8 9 1

1 9 3 6 1 0

8 3 8 4 4 1

0 2 1 9 9 0

Это означает, что компонент (9 9 1 8 9) принадлежит классу 1. Я хочу найти энтропию каждой функции (столбца). Я написал следующий код, но в нем много ошибок:

import pandas as pd
import math

f = open ( 'data1.txt' , 'r')

# Finding the probability
df = pd.DataFrame(pd.read_csv(f, sep='\t', header=None, names=['val1', 
    'val2', 'val3', 'val4','val5', 'val6', 'val7', 'val8']))
df.loc[:,"val1":"val5"] = df.loc[:,"val1":"val5"].div(df.sum(axis=0), 
    axis=1)

# Calculating Entropy
def shannon(col):
    entropy = - sum([ p * math.log(p) / math.log(2.0) for p in col])
    return entropy

sh_df = df.loc[:,'val1':'val5'].apply(shannon,axis=0)

Можете ли вы исправить мой код или знаете какую-нибудь функцию для нахождения энтропии каждого столбца набора данных в Python?


person Amir    schedule 06.04.2018    source источник
comment
сошлитесь на этот ответ, пожалуйста /questions/15450192/ в scipy уже есть формула для энтропии   -  person Aritesh    schedule 06.04.2018


Ответы (1)


Вы можете найти энтропию столбца в пандах с помощью следующего скрипта

import numpy as np
from scipy.stats import entropy
from math import log, e
import pandas as pd   

""" Usage: pandas_entropy(df['column1']) """

def pandas_entropy(column, base=None):
  vc = pd.Series(column).value_counts(normalize=True, sort=False)
  base = e if base is None else base
  return -(vc * np.log(vc)/np.log(base)).sum()

Просто запустите предыдущую функцию для каждого столбца, и она вернет каждую энтропию.

Этот ответ был вдохновлен этим

person Gonzalo Garcia    schedule 07.08.2019