【发布时间】:2018-02-12 04:21:39
【问题描述】:
我经常通过程序来处理一些数据。做起来很简单,让我们考虑数据是一系列相同大小的数字。 当数字高得不合理时,标准化数据可能很有用。一种常见的转换是从所有值中减去平均值。在此转换之后,转换后的数据将具有平均零。
平均为零后可以进行的其他常见转换是将数据除以其标准差。应用此转换后,新数据具有单位方差。
当处理以这种方式归一化的数据时,我希望数值误差应该更小。但是,我似乎无法进行这些转换,因为即使我尝试计算标准偏差也会出现数值错误。
Bellow 是 C# 中的示例代码,我在其中尝试计算标准偏差。即使没有(公式的)统计知识,也可以很容易地看出程序的输出应该为零。 (如果数据是常数数组,则数据平方的平均值等于平均值的平方。)
static double standardDeviation(double[] data)
{
double sum = 0;
double sumOfSquares = 0;
foreach (double number in data)
{
sum += number;
sumOfSquares += number * number;
}
double average = sum / data.Length;
double averageOfSquares = sumOfSquares / data.Length;
return Math.Sqrt(averageOfSquares - average * average);
}
static void Main(string[] args)
{
double bigNumber = 1478340000000;
double[] data = Enumerable.Repeat(bigNumber, 83283).ToArray();
Console.WriteLine(standardDeviation(data));
}
程序输出一个由数字错误引起的巨大数字而不是零:2133383.0308878
请注意,如果我省略 Math.Sqrt(即我将计算方差而不是标准差),那么误差会高得多。
这是什么原因,我该如何写这个带有较小的数字错误?
【问题讨论】:
标签: c# math statistics average numerical-methods