BigQuery:计算列的熵

时间:2015-03-27 21:03:22

标签: google-bigquery entropy

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

1 个答案:

答案 0 :(得分:9)

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

SELECT LOG2(COUNT(DISTINCT column)) FROM Table

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

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值(在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