首页 > 解决方案 > 使用 BIgQuery 生成正态分布系列

问题描述

有没有办法在 BQ 中生成正态分布的系列?理想情况下指定分布的均值和标准差。我找到了一种使用 Marsaglia 极坐标法的方法,但它并不理想,因为我不想要分布的极坐标而是生成一个数组,该数组遵循为其指定的参数使其呈正态分布。先感谢您。

标签: google-bigquerybigquery-standard-sql

解决方案


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

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 Script(就像我一样)时使用它们。

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


推荐阅读