【问题标题】:Replacing nested for loops with an apply function用 apply 函数替换嵌套的 for 循环
【发布时间】:2014-05-05 23:45:57
【问题描述】:

我正在构建一个电影推荐引擎,下面的代码计算相似度矩阵。

data <- read.csv('movie_test.csv')

similarity <- matrix(NA, nrow(data), nrow(data))

for (i in 1:nrow(data)) {

for (j in 1:nrow(data)) {

if (i != j) {
  similarity[i, j] <- sum((data[i,] * data[j,]), na.rm = TRUE) / 
    (sqrt((sum(((data[i,] - data[j,] + data[j,]) * data[i,]), na.rm = TRUE))) *
       sqrt((sum(((data[j,] - data[i,] + data[i,]) * data[j,]), na.rm = TRUE))))
    }
  }
}

对于小型数据集,这非常有效。但是对于 900 个用户和 1000 部电影来说,这无法扩展。我听说 apply 函数集运行得更快,但我怀疑它是否会扩展。有没有其他方法可以在不使用 for 循环的情况下完成上述任务?

非常感谢您的建议!!!

【问题讨论】:

  • 它们并没有明显更快,只是更具可读性
  • 你为什么要做- data[j,] + data[j,]之类的事情?是忘记简化还是编码错误?
  • 如果有帮助,这似乎被称为“反射相关矩阵”。

标签: r loops apply


【解决方案1】:

这应该很快:

m <- as.matrix(data)
m[is.na(m)] <- 0
z <- m %*% t(m)
d <- sqrt(diag(z))
similarity <- t(t(z) / d) / d

对角线将包含1,这似乎比NA 更合适,但如果您愿意,您可以随时这样做:

diag(similarity) <- NA

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多