我还没有真正使用过方差计算那么多,而且我不太知道会发生什么。事实上我的数学一点也不好。
我有一个包含 1000000 个 0-10000 范围内的随机数值的数组。
该数组可能会变得更大,因此我使用 64 位 int 进行求和。
我试图找到有关如何计算方差的代码,但我不知道是否得到正确的输出。
平均值为 4692,中位数为 4533。我使用以下代码得到方差 1483780.469308:
// size is the element count, in this case 1000000
// value_sum is __int64
double p2 = pow( (double)(value_sum - (value_sum/size)), (double)2.0 );
double variance = sqrt( (double)(p2 / (size-1)) );
我得到了合理的价值吗?
计算有什么问题吗?
Note:看起来您没有在计算方差。
方差是通过从每个元素中减去平均值并计算这些差异的加权和来计算的。
所以你需要做的是:
// Get mean
double mean = static_cast<double>(value_sum)/size;
// Calculate variance
double variance = 0;
for(int i = 0;i<size;++i)
{
variance += (MyArray[i]-mean)*(MyArray[i]-mean)/size;
}
// Display
cout<<variance;
请注意,这是样本方差,当基础分布未知时使用(因此我们假设均匀分布)。
另外,经过一番挖掘后,我发现这不是一个无偏估计器。沃尔夫勒姆·阿尔法对此有话要说,但举个例子,当MATLAB计算方差,它返回“偏差校正样本方差”。
偏差校正方差可以通过将每个元素除以来获得size-1
, or:
//Please check that size > 1
variance += (MyArray[i]-mean)*(MyArray[i]-mean)/(size-1);
另请注意,值mean
保持不变。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)