BigQuery:计算列的熵

She*_*Rey 3 entropy google-bigquery

我对BQ人员有一个建议:我认为如果有一个内置函数可以返回列的熵,那将非常有用.一列离散的类别或值将相对容易.思考?这已经存在但我找不到了吗?

Mos*_*sky 10

简单的解决方案如下 - 它计算列中不同值的数量,然后在基数2上取对数 - 这给出了编码所有不同值所需的位数,即列熵.

SELECT LOG2(COUNT(DISTINCT column)) FROM Table
Run Code Online (Sandbox Code Playgroud)

然而,这没有考虑到不同值具有不同概率的事实.香农熵公式是-SUM(P(xi)*log(P(xi))其中P(xi)是值xi的概率.这里是一个如何计算在BigQuery中的示例year,natality表中的列的Shannon熵:

select -sum(p*log2(p)) from (
select ratio_to_report(c) over() p from (
select year, count(*) c from publicdata:samples.natality group by 1))
Run Code Online (Sandbox Code Playgroud)

更新如果列变量不是离散类型(即FLOAT),则可以对值进行离散化.下面的示例显示了一种方法 - 首先它找到最大值和最小值,计算范围,然后将所有FLOAT值(在natality表中的weight_pound列)放入100个桶中.之后 - 问题被减少到INTEGER值的熵.

select discrete_weight, count(*) from (
select 
  cast((weight_pounds - min_weight) * 100 / range_weight as integer)
    as discrete_weight 
from [publicdata:samples.natality] a cross join 
(select 
  min(weight_pounds) as min_weight, 
  max(weight_pounds) - min(weight_pounds) as range_weight 
from [publicdata:samples.natality]) b) group by 1
Run Code Online (Sandbox Code Playgroud)