如何从列表中计算Median Absolute Deviation(MAD) (例如List<Double> list
)?
我在编程我不知道的语言(例如in C#和in R)中找到了stackoverflow的一些实现,但没有一个是Java语言。
答案 0 :(得分:2)
计算中位数:
您可以使用Arrays.sort()
对input
数组进行排序,然后if arrayLength%2==0
,然后median
值为(array[array.length/2-1] + array[array.length/2])/2
,否则中位数为(array[array.length/2])
。
计算MAD:
创建Double[] intermediate - new Double[array.length]
并使用intermediate
为每个元素计算intermediate[i] = Math.abs(input[i]-median)
数组,然后以与第一步相同的方式计算intermediate
数组的中位数,并且您已做好准备。
我为你做的例子:
import java.util.Arrays;
import java.util.List;
public class MAD {
public static void main(String[] args) {
List<Double> input = Arrays.asList(new Double[] {1d, 1d, 2d, 2d, 4d, 6d, 9d});
System.out.println(mad(input));
}
private static Double mad(List<Double> inputList) {
Double[] input = inputList.toArray(new Double[inputList.size()]);
Double median = median(input);
arrayAbsDistance(input, median);
return median(input);
}
private static void arrayAbsDistance(Double[] array, Double value) {
for (int i=0; i<array.length;i++) {
array[i] = Math.abs(array[i] - value);
}
}
private static Double median(Double[] input) {
if (input.length==0) {
throw new IllegalArgumentException("to calculate median we need at least 1 element");
}
Arrays.sort(input);
if (input.length%2==0) {
return (input[input.length/2-1] + input[input.length/2])/2;
}
return input[input.length/2];
}
}