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