Как работает List :: Util 'shuffle'? - PullRequest
5 голосов
/ 02 марта 2011

В настоящее время я работаю над созданием классификатора с использованием c5.0.У меня есть набор данных из 8000 записей, и каждая запись имеет свой идентификационный номер (1-8000).При тестировании производительности классификатора мне пришлось сделать 5 комплектов из 10:90 (данные обучения: данные теста).Конечно, любые обучающие случаи не могут появиться снова в тестовых случаях, и дубликаты не могут появляться ни в одном из наборов.

Чтобы решить проблему случайного выбора примеров для обучающих данных и убедиться, что их нельзя выбрать длятестовые данные, которые я разработал, ужасно медленный метод;

  • заполните файл номерами от 1 до 8000 в отдельных строках.

  • выберите случайным образомномер строки (в диапазоне от 1 до 8000) и использование содержимого строки в качестве номера идентификатора обучающего примера.

  • записать все невыбранные номера в новый файл

  • уменьшить диапазон генератора случайных чисел на 1

  • повторить

Тогда все не выбранные числаиспользуется в качестве тестовых данных.Это работает, но это медленно.Чтобы ускорить процесс, я мог бы использовать List :: Util 'shuffle', чтобы просто 'случайно' перемешать и массив этих чисел.Но насколько случайным является случайное перемешивание?Очень важно поддерживать такой же уровень точности.Извините за эссе, но кто-нибудь знает, как на самом деле работает «shuffle».Любая помощь была бы великолепна

1 Ответ

9 голосов
/ 02 марта 2011

Вот алгоритм перемешивания, используемый в List :: Util :: PP

sub shuffle (@) {
  my @a=\(@_);
  my $n;
  my $i=@_;
  map {
    $n = rand($i--);
    (${$a[$n]}, $a[$n] = $a[$i])[0];
  } @_;
}

, который выглядит как Фишер-Йейтс shuffle.

...