源数据:

    static double[] felix = new double[] { 0.003027523, 0.002012256, -0.001369238, -0.001737660, -0.001647287,
        0.000275154, 0.002017238, 0.001372621, 0.000274148, -0.000913576, 0.001920263, 0.001186456, -0.000364631,
        0.000638337, 0.000182266, -0.001275626, -0.000821093, 0.001186998, -0.000455996, -0.000547445, -0.000182582,
        -0.000547845, 0.001279006, 0.000456204, 0.000000000, -0.001550388, 0.001552795, 0.000729594, -0.000455664,
        -0.002188184, 0.000639620, 0.000091316, 0.001552228, -0.001002826, 0.000182515, -0.000091241, -0.000821243,
        -0.002009132, 0.000000000, 0.000823572, 0.001920088, -0.001368863, 0.000000000, 0.002101800, 0.001094291,
        0.001639643, 0.002637323, 0.000000000, -0.000172336, -0.000462665, -0.000136141 };


方差函数:

    public static double Variance(double[] x)
    {
        if (x.Length == 0)
            return 0;
        double sumX = 0;
        double sumXsquared = 0;
        double varianceX = 0;
        int dataLength = x.Length;


        for (int i = 0; i < dataLength; i++)
        {
            sumX += x[i];
            sumXsquared += x[i] * x[i];
        }

        varianceX = (sumXsquared / dataLength) - ((sumX / dataLength) * (sumX / dataLength));
        return varianceX;
    }


Excel和一些在线计算器说方差为1.56562E-06
虽然我的功能给我1.53492394804015E-06。我开始怀疑C#是否存在准确性问题或什么问题。以前有人遇到过这种问题吗?

最佳答案

您所看到的是sample variance and population variance之间的区别,与浮点精度或C#浮点实现的精度无关。

您正在计算总体方差。 Excel和该网站正在计算样本方差。

Var和VarP是不同的计算,因此您需要注意使用的是哪一种。 (不幸的是,人们经常称它们为可互换的,而不是可互换的。对于标准偏差也是如此)

您的数据的样本方差是1.56562E-06,总体方差是1.53492394804015E-06。

从一段时间code posted on codeproject回来:

样本中的方差

public static double Variance(this IEnumerable<double> source)
{
    double avg = source.Average();
    double d = source.Aggregate(0.0, (total, next) => total += Math.Pow(next - avg, 2));
    return d / (source.Count() - 1);
}


人口差异

public static double VarianceP(this IEnumerable<double> source)
{
    double avg = source.Average();
    double d = source.Aggregate(0.0, (total, next) => total += Math.Pow(next - avg, 2));
    return d / source.Count();
}

关于c# - 我在C#中的方差函数未返回准确值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3321308/

10-13 01:25