我有一个代表高斯分布的值类型:
struct Gauss { double mean; double variance; }
我想在一系列这些值上执行积分:
Gauss eulerIntegrate(double dt, Gauss iv, Gauss[] values) { Gauss r = iv; foreach (Gauss v in values) { r += v*dt; } return r; }
我的问题是如何为这些正态分布实现添加.
标量(dt
)的乘法似乎很简单.但这并不简单!感谢FOOSHNICK的帮助:
public static Gauss operator * (Gauss g, double d) { return new Gauss(g.mean * d, g.variance * d * d); }
但是,除了我之外.我想我可以添加手段; 这是导致我麻烦的差异.这些定义中的任何一个对我来说都是"合乎逻辑的".
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); }
任何人都可以帮助定义一个统计上正确的 - 或者至少是"合理的" - 版本的+
运算符吗?
我想我可以将代码切换为使用区间运算,但我希望保持在概率和统计数据的世界.
两个正态分布的总和本身就是一个正态分布:
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); }