簡體   English   中英

BigQuery:計算列的熵

[英]BigQuery: compute entropy of a column

我對 BQ 的人有一個建議:我認為如果有一個內置的 function 可以返回列的熵,那將非常有用。 一列離散的類別或值相對容易。 想法? 這是否已經存在但我沒有找到它?

簡單的解決方案如下 - 它計算列中不同值的數量,然后在基數2上取對數 - 這給出了編碼所有不同值所需的位數,即列熵。

SELECT LOG2(COUNT(DISTINCT column)) FROM Table

然而,這沒有考慮到不同值具有不同概率的事實。 香農熵公式是-SUM(P(xi)* log(P(xi))其中P(xi)是值xi的概率。這里是一個例子,如何在BigQuery中計算,在natality表中列year香農熵:

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

更新如果列變量不是離散類型(即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

在點擊屋

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM