2014-12-18 2 views
1

У меня есть массив в Perl, и я хотел бы нарисовать образцы из него вероятностным образом. Например, в R функция sample делает это для меня, например.Вероятностный образец из массива в Perl

x = c('a','b','c','d') 
sample(x,size = 2,prob = c(0.1,0.4,0.4,0.1)) 

Приведенный выше код будет возвращать b,c чаще. Как мне сделать то же самое в Perl. Есть ли модуль, который делает это для меня? Спасибо заранее.

+0

Может 'Статистика :: r' – toolic

+0

Это будет работать, но мне нужно сделать это в масштабе. Я прочитал примечания модуля о CPAN, он отправляет сигнал межпроцессного сигнала в интерпретатор R, который должен быть медленным. – broccoli

+1

Возможно, https://metacpan.org/pod/List::Util::WeightedChoice –

ответ

1

Это может быть сделано в PDL (по шкале) с использованием функции vsearch.

use strict; 
use warnings; 

use PDL; 

my @x = qw(a b c d); 

my $pdf = pdl(0.1, 0.4, 0.4, 0.1); 

# vsearch requires a CDF, 
my $cdf = $pdf->dcumusumover; 
$cdf /= $cdf->max; 

# $sample is a piddle containing the indices into @x; 
my $sample = vsearch(random(10000), $cdf); 

print scalar hist($sample, 0, 4, 1), "\n"; 

приводит

% perl x.pl 
[991 3974 4014 1021] 
0

С основной Perl команды, которые вы могли бы просто сделать что-то вроде

my @vals = ('a','b','c','d'); 
my @probs = (0.1,0.4,0.4,0.1); 
my @result; 
for(my $i=0; $i<20; $i++) { 
    my $draw = rand(1); 
    my $v = 0; 
    while ($draw>0 && $draw > $probs[$v]){ 
     $draw -= $probs[$v]; 
     $v++; 
    } 
    push @result, $vals[$v]; 
} 

print join(", ", @result), "\n"; 
+1

Для больших массивов это будет довольно медленным. Эффективнее будет генерировать совокупную сумму вероятностей и использовать двоичный поиск (например, [List :: Binary :: Search] (https://metacpan.org/pod/List::BinarySearch)), чтобы вычислить индексы. –

+1

«fo'r loop в вашем коде можно сделать более эффективным: измените его на' for (0..19) ' –

+0

Я не уверен, что сгенерированный результат обязательно будет следовать предлагаемому распределению 0,1,0.4,0.4, 0.1 – broccoli

Смежные вопросы