所以我使用这个方法来计算我的数组的标准差,但它似乎没有给我正确的值。
double numbers[] = new double[10];
double sumOfAllItems = 0;
private double total()
{
for (int i = 0; i < numbers.Length; i++)
{
sumOfAllItems += numbers[i];
}
return sumOfAllItems;
}
public double mean()
{
// working
**sumOfAllItems = 0;**
return total() / numbers.Length;
}
// numbers are from (1-10) (too lazy to type up all of them.
public double variance()
{
// each (value - mean) squared
double summationsTotal = 0; // (numbers[i] - mean() squared
for (int i = 0; i < numbers.Length; i++)
{
summationsTotal += Math.Pow(numbers[i] - mean(), 2);
}
return summationsTotal / (numbers.Length - 1);
}
我手动计算了方差,它给了我一个9.166666的答案。这是样品配方。
然而,当我在我的GUI上计算它时,它给了我866.25。这段代码有什么问题吗?
答案 0 :(得分:4)
问题在于:
double sumOfAllItems = 0;
private double total()
{
for (int i = 0; i < numbers.Length; i++)
{
sumOfAllItems += numbers[i];
}
return sumOfAllItems;
}
应该是:
double sumOfAllItems = 0;
private double total()
{
sumOfAllItems = 0;
for (int i = 0; i < numbers.Length; i++)
{
sumOfAllItems += numbers[i];
}
return sumOfAllItems;
}
缓存均值而不是在方差函数内重新计算它会更有效 - 它不会改变。类似的东西:
public double variance()
{
// each (value - mean) squared
double dMean - mean();
double summationsTotal = 0; // (numbers[i] - mean() squared
for (int i = 0; i < numbers.Length; i++)
{
summationsTotal += Math.Pow(numbers[i] - dMmean, 2);
}
return summationsTotal / (numbers.Length - 1);
}
答案 1 :(得分:3)
好的,你得到了答案。我建议使用Linq好东西和扩展方法的替代方法。
public static double StandardDeviation(this ICollection<double> values)
{
return Math.Sqrt(values.Variance());
}
public static double Variance(this ICollection<double> values)
{
if (values.Count == 0)
return 0;
var avg = values.Average();
return values.Select(x => Math.Pow(x - avg, 2)).Sum() / values.Count;
}
称之为:
var variance = numbers.Variance(); //or so
答案 2 :(得分:0)
你需要取差异平方的平方根,然后取平均值。所以在那里添加一个平方根。当你进行除法时不要使用-1,因为你没有处理索引,而是处理项目的实际数量。
答案 3 :(得分:0)
您要多次重新计算total()而不先将其归零。所以你的总数会有很大的错误价值。要快速解决问题,您应该将sumOfAllItems
方法中的total()
变量归零。但如果您在进入for循环之前在mean()
中仅计算variance()
一次,那么您会做得更好。你的代码会变快。