#!/usr/bin/perl
use strict;
use warnings;
my @r = (3,0,2,1,1);
my $cum = $r[0];
for (my $i = 1; $i < @r; $i++) {
$cum += $r[$i] / (log($i+1)/log(2));
}
print "$cum\n";
% ./dcg.pl 5.19253606521631
perl -nle '$c+=$.>1?$_*log(2)/log$.:$_;print"DCG$. $c"'
% cat a.txt 3 0 2 1 1 % perl -nle '$c+=$.>1?$_*log(2)/log$.:$_;print"DCG$. $c"' a.txt DCG1 3 DCG2 3 DCG3 4.26185950714291 DCG4 4.76185950714291 DCG5 5.19253606521631
#!/usr/bin/perl
use strict;
use warnings;
my @r = (3,0,2,1,1);
my $dcg = dcg(@r);
my $idcg = dcg(sort {$b <=> $a} @r);
my $ndcg = $dcg / $idcg;
print "$dcg / $idcg = $ndcg\n";
sub dcg {
my @r = @_;
my $cum = $r[0];
for (my $i = 1; $i < @r; $i++) {
$cum += $r[$i] / (log($i+1)/log(2));
}
return $cum;
}
% ./ndcg.pl 5.19253606521631 / 6.13092975357146 = 0.846941047104885