Как я могу рассчитать дисперсию? - PullRequest
0 голосов
/ 08 октября 2019

как рассчитать дисперсию с помощью итератора?

public static double variance(final Iterator<Integer> array) {

}

- этот метод вычисляет среднее значение

 private static double mean(final List<Integer> array) {
        return array.stream()
        .mapToInt(Integer::intValue)
        .average()
        .orElse(Double.NaN);
    }

1 Ответ

0 голосов
/ 11 октября 2019

На основании этого ответа вы можете сделать:

public static double variance(final Iterator<Integer> iterator) {
  List<Integer> array = new ArrayList<>();
  iterator.forEachRemaining(array::add);
  double mean = mean(array);
  double temp = 0;
  for(double a :array)
    temp += (a-mean)*(a-mean);
  return temp/(array.size()-1);
}

Но странно, что в mean используется List. Если это Iterator не нужно, то это может быть:

public static double variance(final List<Integer> array) {
  double mean = mean(array);
  double temp = 0;
  for(double a :array)
    temp += (a-mean)*(a-mean);
  return temp/(array.size()-1);
}

И с stream

public static double variance(final Iterator<Integer> iterator) {
  List<Integer> array = new ArrayList<>();
  iterator.forEachRemaining(array::add);
  double mean = mean(array);

  return array.stream()
          .map(a -> (a-mean)*(a-mean))
          .reduce(0d, Double::sum)/(array.size()-1);

}
...