我正在为我的AP计算机科学课写代码,我需要找出一组数字的方差。对于那些不知道如何求方差的人来说,它是平均值的差值的平方和,除以长度减去1。为了让这一点更容易理解,这里有一个例子。如果您有数据{1,5,8,7,2,7},则平均值为6。您的方差将为(1-6)^2 + (5-6)^2 + (8-6)^2 + (7-6)^2 + (2-6)^2 + (7-6)^2/5 = 8.4。所以这就是方法。
public static double variance(int[] data) {
int sum = 0;
double average;
for (int i=0; i < data.length; i++) {
sum = sum + data[i];
}
average = (double)sum/data.length;
for (int i=0; i < data.length; i++) {
data[i] = data[i] - (int)average^2;
}
int add = 0;
for (int d : data)
add += d;
add = add/data.length-1;
return add;
}
}
我不允许改变整数数组的数据,我不知道为什么我得到了错误的方差,请帮帮忙!
发布于 2013-12-16 13:05:35
你最明显的问题在这里:
average^2
^
运算符不是幂运算。它是bitwise XOR。
使用:
Math.pow(average, 2)
或
average * average
另外,
您应该是偏差的平方,而不是平均值。do‘t do cast
add/data.length-1
is wrong
(int)
data
is unnecessary.再加上一点清理,
public static double variance(int[] data) {
int sum = 0;
for (int datum : data) {
sum += datum;
}
double average = (double)sum / data.length;
double devianceSum = 0;
for (int datum : data) {
devianceSum += Math.pow(datum - average, 2);
}
return devianceSum / data.length;
}
发布于 2013-12-16 13:28:58
在你的代码中有几个点,你的计算失去了精度,这可能会导致你的答案与你期望的相去甚远。如前所述,您必须在Java语言中使用Math.pow
进行求幂。但这需要应用于每个值与平均值的差异,而不仅仅是平均值本身。本质上,您需要的是括号(a-b)^2
而不是a - b^2
(在数学语法中)。您还应该始终使用double
而不是int
作为数据类型。
public static double variance(int[] data) {
double sum = 0;
double average;
double[] deviations = new int[data.length];
for (int i=0; i < data.length; i++) {
sum += data[i];
}
average = sum/data.length;
for (int i=0; i < data.length; i++) {
deviations[i] = Math.pow(data[i] - average, 2);
}
double result = 0;
for (Double d : deviations)
result += d;
result = result/data.length-1;
return result;
}
https://stackoverflow.com/questions/20603802
复制相似问题