google-bigquery - 使用 BIgQuery 生成正态分布系列
问题描述
有没有办法在 BQ 中生成正态分布的系列?理想情况下指定分布的均值和标准差。我找到了一种使用 Marsaglia 极坐标法的方法,但它并不理想,因为我不想要分布的极坐标而是生成一个数组,该数组遵循为其指定的参数使其呈正态分布。先感谢您。
解决方案
此查询为您提供以 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 和返回值(我分别写了它们,这样更清楚)。
推荐阅读
- c++ - Project2.exe 中 0x0F792B99 (opencv_imgproc249d.dll) 处的未处理异常:0xC0000005:访问冲突读取位置 0xCDCDCDCD
- python - matplotlib 可以在同一个栏中生成具有不同图例的条形图吗?
- javascript - Javascript字符串属性和for的?
- android - 如何创建这个数据库?
- php - 关键 php_buildpack 的 Keepalive 设置
- c++ - 我如何访问结构向量的元素
- android - MP Android图表折线图中的多个Y轴
- javascript - Laravel 无法从 ajax 请求中获取数据
- angular - 如何从一个 app.component.ts 文件中填充多个选择器?
- visual-studio-code - VS Code:如何同时滚动拆分面板