我有一个代表高斯分布的值类型:
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);
}
任何人都可以帮助定义+
运算符的统计正确 - 或至少“合理”版本吗?
我想我可以将代码切换为使用区间运算,但我希望保持在概率和统计数据的世界。
答案 0 :(得分:7)
两个正态分布的总和本身就是正态分布:
N(mean1,variance1)+ N(mean2,variance2)~N(mean1 + mean2,variance1 + variance2)
这一切都在wikipedia page上。
请注意,这些确实是差异,而不是标准偏差。
// 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);
}
答案 1 :(得分:3)
更确切地说:
如果将随机变量Z定义为两个不相关的高斯随机变量X和Y的线性组合,那么Z本身就是高斯随机变量,例如:
如果Z = aX + bY, 然后平均值(Z)= a *平均值(X)+ b *平均值(Y),方差(Z)= a 2 *方差(X)+ b 2 *方差(Y)。
如果随机变量相关,那么你必须考虑到这一点。方差(X)由期望值E([X-平均值(X)] 2 )定义。为Z = aX + bY工作,我们得到:
方差(Z)= a 2 *方差(X)+ b 2 *方差(Y)+ 2ab *协方差(X,Y)
如果要求两个不具有高斯分布的不相关随机变量,则总和的分布是两个分量分布的convolution。
如果要对两个相关的非高斯随机变量求和,则必须自己完成相应的积分。
答案 2 :(得分:2)
哈,我以为你不能一起添加高斯分布,但你可以!
http://mathworld.wolfram.com/NormalSumDistribution.html
实际上,均值是个体分布的总和,方差是各个分布的总和。
答案 3 :(得分:2)
嗯,你的标量乘法是错误的 - 你应该将方差乘以d的平方。如果您要添加常量,则只需将其添加到均值,方差保持不变。如果要添加两个分布,则添加均值并添加差异。
答案 4 :(得分:2)
任何人都可以帮助定义统计上正确的 - 或者至少是“合理的” - 版本的+运算符吗?
可以说不是,因为添加两个分布意味着不同的东西 - 在可靠性和可维护性方面起作用我的第一个反应就是系统的mtbf的分配,如果每个部分的mtbf是正态分布的并且系统没有冗余。您正在讨论两个正态分布的独立变量之和的分布,而不是两个正态分布的效果的(逻辑)和。通常,运算符重载具有令人惊讶的语义。我将其作为一个函数保留并称之为'normalSumDistribution',除非您的代码具有非常特定的目标受众。
答案 5 :(得分:1)
我不确定我喜欢你在一系列价值观上所谓的“整合”。你的意思是微积分意义上的那个词吗?你想做数值积分吗?还有其他更好的方法可以做到这一点。你的看起来不对我,更不用说最佳了。
高斯分布是一个很好的,平滑的函数。我认为一个很好的求积法或Runge-Kutta会是一个更好的主意。
答案 6 :(得分:1)
我原本以为这取决于你正在做什么类型的添加。如果您只想获得一个正态分布,其属性(平均值,标准差等)等于两个分布的总和,那么添加其他答案中给出的属性就可以了。这是在PERT之类的假设中使用的假设,其中如果将大量正态概率分布相加,则得到的概率分布是另一个正态概率分布。
当添加的两个发行版不相似时会出现问题。例如,添加平均值为2且标准差为1且概率分布为10且标准差为2的概率分布。如果向上添加这两个分布,则得到具有两个峰值的概率分布,一个在2ish和一个10岁。因此,结果不是正常的分配。关于添加分布的假设只有在原始分布非常相似或者您有大量原始分布时才真正有效,这样才能使峰值和谷值均衡。