BigQuery:计算列的熵



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

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

SELECT LOG2(COUNT(DISTINCT column)) FROM Table

然而,这并没有考虑到不同的值具有不同的概率这一事实。Shannon熵公式是-SUM(P(xi)*log(P(xi)),其中P(xi)是值xi的概率。以下是如何在BigQuery中计算natality表中列year的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))

UPDATE如果列变量不是离散类型(即FLOAT),则可以对值进行离散化。下面的示例显示了一种方法——首先,它找到最大值和最小值,计算范围,然后将所有FLOAT值(出生率表中的weight_pound列)放入100个桶中。之后,问题被简化为整数值的熵。

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

在点击室中

select splitByString('', col) as s, arrayReduce('entropy', s) as entropy_s from (
select col from t 
)

最新更新