【问题标题】:Normalized cumulative discounted gain formula in RR中的归一化累积贴现增益公式
【发布时间】:2020-03-10 11:07:29
【问题描述】:

我想在 R 中编写函数中的下一个公式:

它应该在 R 包中,但安装后该包不存在...

# original source: 
https://www.rdocumentation.org/packages/rrecsys/versions/0.9.5.4/topics/nDCG
#Alternative source:
https://en.wikipedia.org/wiki/Discounted_cumulative_gain

函数的使用是用两个向量作为输入。

# example
v1=c(1,2,3,4)
v2=c(1,3,2,4)
nDGC(v1,v2)

谁能帮我高效地编写代码?

一个python版本的DGC是:

rel = zip(range(1,7),[3,2,3,0,1,2])
dcg6 = rel[0][1] + sum(map(lambda (a,b):b/math.log(a,2),rel[1:]))
print dcg6

【问题讨论】:

标签: r function recommender-systems


【解决方案1】:

这是 Wikipedia 中方程式的直接 R 实现,包括一些错误检查:


第一个方程

DCG_pos <- function(rel, p)
{
  if(missing(p)) p <- length(rel)
  stopifnot(p <= length(rel))

  sum(rel[seq(p)]/log(seq(p) + 1, 2))
}

第二个方程


IDCG_pos <- function(rel, p)
{
  if(missing(p)) p <- length(rel)
  stopifnot(p <= length(rel))

  sum((2^(rel[seq(p)]) - 1)/log(seq(p) + 1, 2))
}

第三个方程

nDGC_pos <- function(rel, p)
{
  if(missing(p)) p <- length(rel)
  stopifnot(p <= length(rel))

  DCG_pos(rel, p) / IDCG_pos(rel, p)
}

你可以像这样使用它们:

DCG_pos(1:5, 5)
#> [1] 7.41883
IDCG_pos(1:5, 5)
#> [1] 24.84537
nDGC_pos(1:5, 5)
#> [1] 0.2986

reprex package (v0.3.0) 于 2020-03-10 创建

【讨论】:

  • 这看起来不错!是否提供 p 参数的任何建议?
  • p 参数是可选的。如果您有一个包含 10 个数字的向量,您可以指定是否只希望包含第一个 p 数字。如果留空,p 将默认为rel 的长度
  • 太棒了,太棒了!
猜你喜欢
  • 2020-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-04
  • 1970-01-01
  • 2014-06-21
相关资源
最近更新 更多