【问题标题】:BigQuery: compute entropy of a columnBigQuery:计算列的熵
【发布时间】:2015-03-27 21:03:21
【问题描述】:

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

【问题讨论】:

    标签: google-bigquery entropy


    【解决方案1】:

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

    SELECT LOG2(COUNT(DISTINCT column)) FROM Table
    

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

    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 个桶中。之后 - 问题被简化为 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
    

    【讨论】:

    • 非常感谢您,Mosha 非常有帮助。它就像一个魅力并且我在这个过程中学到了更多关于 BQ 的知识!我还没有尝试自己解决这个问题,但似乎这个想法可能会扩展到连续值列,也许可以使用 NTILE() 或 RANK() 之类的东西?如果有人已经解决了这个问题,那将节省我的精力;-)
    • 再次感谢 Mosha,非常有帮助和启发。
    猜你喜欢
    • 2015-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-10
    • 2014-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多