r - 这种对 ROC 绘图的优化背后的基本原理是什么?

标签 r algorithm optimization vector roc

我正在阅读 this Rnews document from June 2004 ,以及第 33 页的文章 Programmers' Niche 介绍了一种绘制接收器操作特性曲线并对其进行优化的方法。

第一个代码片段很简单并且符合定义

drawROC.A <- function(T, D) {
    cutpoints <- c(-Inf, sort(unique(T)), Inf)
    sens <- sapply(cutpoints,
                   function(c) sum(D[T>c])/sum(D))
    spec <- sapply(cutpoints,
                   function(c) sum((1-D)[T<=c]/sum(1-D)))

    plot(1-spec, sens, type = "l")
}

然后作者说(经过我的少量修改),

There is a relatively simple optimization of the function that increases the speed substantially, though at the cost of requiring T to be a number, rather than just an object for which > and <= are defined

drawROC.B <- function(T, D){
  DD <- table(-T, D)
  sens <- cumsum(DD[ ,2]) / sum(DD[ ,2])
  mspec <- cumsum(DD[ ,1]) / sum(DD[ ,1])

  plot(mspec, sens, type="l")
}

我花了很长时间阅读优化版本,但卡在第一行:它看起来像负号 -前面T用于逆序求和,为什么呢?

困惑的是,我将两个函数生成的 ROC 绘制在一起,以检查结果是否相同。

enter image description here

左图由 drawROC.A 制作而右边的是 drawROC.B 的结果.乍一看并不完全相同,但仔细看,Y轴的范围不同,其实是同一个plot。

编辑:

现在我明白了 drawROC.B 的结果是什么是正确的(见下面我的回答),但我仍然不知道显着的性能提升来自哪里......

最佳答案

我想我已经明白了。 DD <- table(-T, D)意思是倒序求和,这是因为我们计算的是Pr(T > c),而表的求和是统计T中小于等于当前元素的元素个数。

换句话说,这也可行,因为 Pr(T > c) = 1 - Pr(T <= c)。

drawROC.B <- function(T, D){
  DD <- table(T, D)
  sens <- 1 - cumsum(DD[ ,2])/sum(DD[ ,2])
  mspec <- 1 - cumsum(DD[ ,1])/sum(DD[ ,1])

  plot(mspec, sens, type="l")
}

顺便说一句,您可以使用它来将两个点 (0, 0) 和 (1, 1) 添加到 drawROC.B 的结果中.

drawROC.C <- function(T, D){
  DD <- table(-T, D)
  sens <- c(0, cumsum(DD[ ,2])/sum(DD[ ,2]), 1)
  mspec <- c(0, cumsum(DD[ ,1])/sum(DD[ ,1]), 1)

  plot(mspec, sens, type="l")
}

至于性能增益,请注意 drawROC.A需要执行(渐近)unique(T) * length(T)比较,而 drawROC.A只需要 length(T)构建表的操作和所有后​​续操作的成本都一样高。

关于r - 这种对 ROC 绘图的优化背后的基本原理是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55174784/

相关文章:

r - 从纬度和经度计算角度

algorithm - 线扫水平垂直组点检测

java - 查找字符串和字符串前缀之间最长后缀长度的算法

algorithm - 如何用离散来接近优化算法

javascript - 重构 Javascript 以优化速度

regex - 使用正则表达式优化连接

r - 在 R 中导入和 rbind 多个具有通用名称的 csv 文件

r - 在ggplot中,使用像因子这样的数值变量来创建多个绘图,但使用数值来控制间距

optimization - GMSPolyline 非常大的内存峰值

c++ - 使用备用编译器构建 Travis-CI R 项目