如何用Python求数据集每一列的熵?

Ami*_*mir 3 python numpy machine-learning entropy pandas

我用 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
Run Code Online (Sandbox Code Playgroud)

这意味着分量 (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)
Run Code Online (Sandbox Code Playgroud)

你能更正我的代码吗?或者你知道有什么函数可以在 Python 中查找数据集每列的熵吗?

Gon*_*cia 6

您可以使用以下脚本在 pandas 中找到列的熵

import numpy as np
from math import 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()
Run Code Online (Sandbox Code Playgroud)

只需对每一列运行前面的函数,它就会返回每个熵。

这个答案的灵感来自这个