Apache Commons Math 2.2 Процентная ошибка? - PullRequest
3 голосов
/ 04 апреля 2011

Я не уверен на 100%, если это ошибка или я что-то не так делаю, но если вы даете Percentile большой объем данных, который соответствует одному и тому же значению (см. Код ниже), метод оценки принимает очень много времени. Если вы зададите Percentile, то для оценки случайных значений потребуется значительно меньше времени.

Как отмечено ниже, Медиана - это субкальса Перцентиля.

Percentile java doc

private void testOne(){
  int size = 200000;
  int sameValue = 100;
  List<Double> list = new ArrayList<Double>();

  for (int i = 0; i < size; i++)
  {
    list.add((double)sameValue);
  }
  Median m = new Median();
  m.setData(ArrayUtils.toPrimitive(list.toArray(new Double[0])));

  long start = System.currentTimeMillis();
  System.out.println("Start:"+ start);

  double result = m.evaluate();

  System.out.println("Result:" + result);
  System.out.println("Time:"+ (System.currentTimeMillis()- start));
}


private void testTwo(){
  int size = 200000;
  List<Double> list = new ArrayList<Double>();

  Random r = new Random();

  for (int i = 0; i < size; i++)
  {
    list.add(r.nextDouble() * 100.0);
  }
  Median m = new Median();
  m.setData(ArrayUtils.toPrimitive(list.toArray(new Double[0])));

  long start = System.currentTimeMillis();
  System.out.println("Start:"+ start);

  double result = m.evaluate();

  System.out.println("Result:" + result);
  System.out.println("Time:"+ (System.currentTimeMillis()- start));
}

Ответы [ 2 ]

4 голосов
/ 30 ноября 2012

Это известная проблема между версиями 2.0 и 2.1 и исправлена ​​для версии 3.1 .

Версия 2.0 действительно включала сортировку данных, но в2.1 они, похоже, перешли на алгоритм выбора .Однако ошибка в их реализации, которая привела к некоторому плохому поведению для данных с большим количеством идентичных значений.В основном они использовали> = и <= вместо> и <. </p>

3 голосов
/ 04 апреля 2011

Хорошо известно, что некоторые алгоритмы могут демонстрировать более медленную производительность для определенных наборов данных. Производительность может быть улучшена путем рандомизации набора данных перед выполнением операции.

Поскольку процентиль, вероятно, включает в себя сортировку данных, я предполагаю, что ваша «ошибка» на самом деле не является дефектом кода, а скорее проявлением одного из медленных наборов данных.

...