BigQuery:计算列的熵

BigQuery: compute entropy of a column

我对 BQ 人员有一个建议:我认为如果有一个内置函数可以 return 列的熵,那将非常有用。一列离散的类别或值会相对容易。想法?这是否已经存在但我没有找到它?

下面是简单的解决方案 - 它计算列中不同值的数量,然后以 2 为底取对数 - 这给出了对所有不同值进行编码所需的位数,即列熵。

SELECT LOG2(COUNT(DISTINCT column)) FROM Table

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

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))

UPDATE 如果列变量不是离散类型(即 FLOAT),则可以将值离散化。下面的示例展示了一种方法 - 首先它找到最大值和最小值,计算范围,然后将所有 FLOAT 值(weight_pound 出生率 table 中的列)放入 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