使用BIgQuery生成正态分布式系列

时间:2018-06-12 12:25:47

标签: google-bigquery standard-sql

有没有办法在BQ中生成正态分布式系列?理想情况下,指定分布的均值和sd。 我找到了一种使用Marsaglia极坐标方法的方法,但是我并不理想我不需要分布的极坐标,而是生成一个遵循为其指定的参数正常分布的数组。 提前谢谢。

2 个答案:

答案 0 :(得分:0)

此查询为您提供以0为中心的正态分布的欧式坐标。您可以调整均值(均值变量)或sd(方差变量)和x轴值(GENERATE_ARRAY(beginning,end,step)):< / p>

CREATE TEMPORARY FUNCTION normal(x FLOAT64)
RETURNS FLOAT64
LANGUAGE js AS """
  var mean=0;
  var variance=1;
  var x0=1/(Math.sqrt(2*Math.PI*variance));
  var x1=-Math.pow(x-mean,2)/(2*Math.pow(variance,2));
  return x0*Math.pow(Math.E,x1);
""";
WITH numbers AS
  (SELECT x FROM UNNEST(GENERATE_ARRAY(-10, 10,0.5)) AS x)
SELECT x, normal(x) as normal
FROM numbers;

为此,我使用了“用户定义的功能” [1]。当您要使用另一个SQL表达式或要使用Java脚本时(如我所做的那样),将使用它们。

注意:我使用正态分布的概率密度函数,如果要使用另一个分布,则需要更改变量x0,x1和返回值(我将它们分别编写为更清楚)。

答案 1 :(得分:0)

在BQ中最简单的方法是创建一个自定义函数:

CREATE OR REPLACE FUNCTION 
`your_project.functions.normal_distribution_pdf`
(x ANY TYPE, mu ANY TYPE, sigma ANY TYPE) AS (
(
SELECT 
safe_divide(1,sigma * power(2 * ACOS(-1),0.5)) * exp(-0.5 * power(safe_divide(x-mu,sigma),2))
)
);

接下来,您只需要应用该功能:

with inputs as (
SELECT 1 as x, 0 as mu, 1 as sigma
union all 
SELECT 1.5 as x, 1 as mu, 2 as sigma
 union all 
SELECT 2 as x , 2 as mu, 3 as sigma     

)


SELECT x,
       `your_project.functions.normal_distribution_pdf`(x, mu, sigma) as normal_pdf
from
inputs