#!/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