Google bigquery 使用BIgQuery生成正态分布序列

Google bigquery 使用BIgQuery生成正态分布序列,google-bigquery,bigquery-standard-sql,Google Bigquery,Bigquery Standard Sql,在BQ中是否有生成正态分布序列的方法?理想情况下,指定分布的平均值和sd。 我找到了一种使用Marsaglia极坐标法的方法,但它并不理想,因为我不想要分布的极坐标,而是要生成一个数组,该数组遵循为正态分布指定的参数。 提前谢谢。此查询提供以0为中心的正态分布的欧几里德坐标。您可以调整均值(均值变量)或sd(方差变量)以及x轴值(生成数组(开始、结束、步骤)): 为此,我使用了“用户定义函数”。当您想使用另一个SQL表达式或当您想使用Java脚本时(如我所做的),可以使用它们 注:我使用了正态分

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

此查询提供以0为中心的正态分布的欧几里德坐标。您可以调整均值(均值变量)或sd(方差变量)以及x轴值(
生成数组(开始、结束、步骤)
):

为此,我使用了“用户定义函数”。当您想使用另一个SQL表达式或当您想使用Java脚本时(如我所做的),可以使用它们


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

在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
接下来,您只需应用该功能:

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