- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个文本文件(制表符分隔),我需要计算文本文件中每一列的概率和熵。这是我的文本文件的样子:
aaa 0.0520852296 0.1648703511 0.1648703511
bbb 0.1062639955 0.1632039268 0.1632039268
ccc 1.4112745088 4.3654577641 4.3654577641
ddd 0.4992644913 0.1648703511 0.1648703511
eeee 0.169058175 0.1632039268 0.1632039268
因此我可以使用以下代码计算概率:
import pandas as pd
f=open(mydata,'r')
df = pd.DataFrame(pd.read_csv(f, sep='\t', header=None, names=['val1', 'val2', 'val3']))
print(df)
df.loc[:,"val1":"val3"] = df.loc[:,"val1":"val3"].div(df.sum(axis=0), axis=1)
print(df)
哪些输出,
aaa 0.0232736716 0.0328321936 0.0328321936
bbb 0.0474828153 0.0325003428 0.0325003428
ccc 0.6306113983 0.8693349271 0.8693349271
ddd 0.2230904597 0.0328321936 0.0328321936
eeee 0.0755416551 0.0325003428 0.0325003428
在那个输出上我想计算熵并将结果作为输出文件给我,所以我有以下代码
import math
entropy = - sum([ p * math.log(p) / math.log(2.0) for p in df ])
但是我收到以下错误信息:
TypeError: a float is required
非常感谢任何帮助。谢谢大家
最佳答案
你的问题出在这一行
entropy = - sum([ p * math.log(p) / math.log(2.0) for p in df ])
如果您考虑(或打印出)p for p in df
给您的是什么(例如运行 print([p for p in df])
),您可以看到 p
仅包含列的标题。因此,您将文本标签传递给需要 float
的 math
函数。因此错误。
apply
在这里可能很适合你:
import math
def shannon(col):
entropy = - sum([ p * math.log(p) / math.log(2.0) for p in col])
return entropy
sh_df = df.loc[:,'val1':'val3'].apply(shannon,axis=0)
print(sh_df)
正如其他人所指出的,您可能希望通过将第 0 列作为索引来整理您的数据框——这样您就不必使用
df.loc[:,'val1':'val3']
因此您可以使用以下方式导入数据:
df = pd.read_csv(f, sep='\t', header=None, index_col=0, names=['val1', 'val2', 'val3'])
并避免使用繁琐的 loc[:,'val1':'val3']
语法
关于python - 读取文本文件并计算概率和香农熵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31075772/
我们有一个 WPF 应用程序,允许用户下载加密内容,并且我们希望提供离线解密该内容的功能。我的想法是下载 key 并使用 DPAPI 存储它们,但我在使用熵参数时遇到了问题。 是否有任何方法可以生成熵
在 php.ini 的 session 部分,有一个名为 session.entropy_length 的指令。 我知道它用于使 session ID 的生成“更加随机”。 它如何使 session
在 php.ini 的 session 部分,有一个名为 session.entropy_length 的指令。 我知道它用于使 session ID 的生成“更加随机”。 它如何使 session
我使用决策树算法来解决二元分类问题,目标是最大限度地减少分类的误报(最大化阳性预测值)(诊断工具的成本非常高) 。 有没有办法在基尼/熵分割标准中引入权重来惩罚误报错误分类? Here例如,修改后的基
我想检查我的 std::random_device 实现是否具有非零熵(即非确定性),使用 std::random_device::entropy() 函数。然而,根据至cppreference.co
我在 tensorflow_decision_forests 文档 ( https://github.com/tensorflow/decision-forests ) ( https://www.t
我是一名优秀的程序员,十分优秀!