[R] NDCG in R?

Dennis Murphy djmuser at gmail.com
Sat Jun 11 07:23:14 CEST 2011


Hi:

I couldn't find one by searching with RSiteSearch() or package sos,
but it's not hard to write a simple function that reproduces the
example on the Wikipedia page:

ndcg <- function(x) {
  # x is a vector of relevance scores
  ideal_x <- rev(sort(x))
  DCG <- function(y) y[1] + sum(y[-1]/log(2:length(y), base = 2))
  DCG(x)/DCG(ideal_x)
 }

rel <- c(3,2,3,0,1,2)      # example from Wikipedia
ndcg(rel)
[1] 0.9315085

The difference between this and the result on the Wikipedia page is
due to rounding. You can see this by pulling out the DCG function and
evaluating it separately:

> DCG <- function(y) y[1] + sum(y[-1]/log(2:length(y), base = 2))
> DCG(rel)
[1] 8.097171
> DCG(rev(sort(rel)))
[1] 8.692536

The Wikipedia page clearly indicates that there are several
considerations that need to be addressed in the generation and
processing of relevance scores. The above function obviously does not
cover all the bases, but it does cover the situation corresponding to
the given example. It's a start...

HTH,
Dennis

On Fri, Jun 10, 2011 at 6:14 PM, Jim Cheng <jxcheng at gmail.com> wrote:
> Dose R have a function to calculate NDCG?
> http://en.wikipedia.org/wiki/Discounted_cumulative_gain#Normalized_DCG
>
> Thanks!
>
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
>



More information about the R-help mailing list