Fra*_*ger 2 language-agnostic algorithm statistics algebra
我有一个代表高斯分布的值类型:
struct Gauss {
double mean;
double variance;
}
Run Code Online (Sandbox Code Playgroud)
我想在一系列这些值上执行积分:
Gauss eulerIntegrate(double dt, Gauss iv, Gauss[] values) {
Gauss r = iv;
foreach (Gauss v in values) {
r += v*dt;
}
return r;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是如何为这些正态分布实现添加.
标量(dt
)的乘法似乎很简单.但这并不简单!感谢FOOSHNICK的帮助:
public static Gauss operator * (Gauss g, double d) {
return new Gauss(g.mean * d, g.variance * d * d);
}
Run Code Online (Sandbox Code Playgroud)
但是,除了我之外.我想我可以添加手段; 这是导致我麻烦的差异.这些定义中的任何一个对我来说都是"合乎逻辑的".
public static Gauss operator + (Gauss a, Gauss b) {
double mean = a.mean + b.mean;
// Is it this? (Yes, it is!)
return new Gauss(mean, a.variance + b.variance);
// Or this? (nope)
//return new Gauss(mean, Math.Max(a.variance, b.variance));
// Or how about this? (nope)
//return new Gauss(mean, (a.variance + b.variance)/2);
}
Run Code Online (Sandbox Code Playgroud)
任何人都可以帮助定义一个统计上正确的 - 或者至少是"合理的" - 版本的+
运算符吗?
我想我可以将代码切换为使用区间运算,但我希望保持在概率和统计数据的世界.
两个正态分布的总和本身就是一个正态分布:
N(mean1,variance1)+ N(mean2,variance2)~N(mean1 + mean2,variance1 + variance2)
这一切都在维基百科页面上.
请注意,这些确实是差异而不是标准偏差.
// X + Y
public static Gauss operator + (Gauss a, Gauss b) {
//NOTE: this is valid if X,Y are independent normal random variables
return new Gauss(a.mean + b.mean, a.variance + b.variance);
}
// X*b
public static Gauss operator * (Gauss a, double b) {
return new Gauss(a.mean*b, a.variance*b*b);
}
Run Code Online (Sandbox Code Playgroud)
更准确地说:
如果随机变量 Z 定义为两个不相关的高斯随机变量 X 和 Y 的线性组合,则 Z 本身就是高斯随机变量,例如:
如果 Z = aX + bY,则平均值 (Z) = a * 平均值 (X) + b * 平均值 (Y),方差 (Z) = a 2 * 方差 (X) + b 2 * 方差(Y)。
如果随机变量是相关的,那么你必须考虑到这一点。方差(X) 由期望值 E([X-mean(X)] 2 ) 定义。通过计算 Z = aX + bY,我们得到:
方差(Z) = a 2 * 方差(X) + b 2 * 方差(Y) + 2ab * 协方差(X,Y)
如果您对两个不具有高斯分布的不相关随机变量求和,则总和的分布是两个分量分布的卷积。
如果您要对两个相关的非高斯随机变量求和,则必须自己计算适当的积分。