当前位置: 首页 > 知识库问答 >
问题:

R:扫描向量一次而不是4次?

方宏富
2023-03-14

假设我有两个相等长度的逻辑向量。用简单的方法计算混淆矩阵:

c(sum(actual == 1 & predicted == 1),
  sum(actual == 0 & predicted == 1),
  sum(actual == 1 & predicted == 0),
  sum(actual == 0 & predicted == 0))

需要扫描矢量 4 次。

有可能一次性完成吗?

PS。我尝试了< code > table(2 * actual predicted)和< code>table(actual,predicted)两种方法,但这两种方法都明显慢得多。

PPS。在这里,速度不是我的主要考虑因素,我对理解语言更感兴趣。

共有3个答案

况博容
2023-03-14

有一个表格可以计算交叉制表,如果实际预测仅包含零和一,则应给出类似的结果:

table(actual, predicted)

在内部,这是通过粘贴向量来工作的——效率非常低。似乎对字符的强制也发生在仅将一个值制成表格时,这可能是table(实际*2预测)性能不佳的原因。

秦炜
2023-03-14

喜欢这个:

tabulate(4 - actual - 2*predicted, 4)

(< code > table te 这里比< code>table快得多,因为它知道输出将是长度为4的向量)。

马德厚
2023-03-14

您可以尝试使用数据表

library(data.table)
DT <- data.table(actual, predicted)
setkey(DT, actual, predicted)[,.N, .(actual, predicted)]$N
set.seed(24)
actual <- sample(0:1, 10 , replace=TRUE)
predicted <- sample(0:1, 10, replace=TRUE)

使用数据。表_1.9.5dplyr_0.4.0

library(microbenchmark)
set.seed(245)
actual <- sample(0:1, 1e6 , replace=TRUE)
predicted <- sample(0:1, 1e6, replace=TRUE)
f1 <- function(){
  DT <- data.table(actual, predicted)
  setkey(DT, actual, predicted)[,.N, .(actual, predicted)]$N}

f2 <- function(){table(actual, predicted)}
f3 <- function() {data_frame(actual, predicted) %>%
                      group_by(actual, predicted) %>% 
                      summarise(n())}

microbenchmark(f1(), f2(), f3(), unit='relative', times=20L)
#Unit: relative
# expr       min        lq      mean   median        uq       max neval cld
#f1()  1.000000  1.000000  1.000000  1.00000  1.000000  1.000000    20  a 
#f2() 20.818410 22.378995 22.321816 22.56931 22.140855 22.984667    20   b
#f3()  1.262047  1.248396  1.436559  1.21237  1.220109  2.504662    20  a 

包括来自< code>dplyr和< code >制表的< code >计数,也包括在稍大数据集的基准测试中

set.seed(498)
actual <- sample(0:1, 1e7 , replace=TRUE)
predicted <- sample(0:1, 1e7, replace=TRUE)
f4 <- function() {data_frame(actual, predicted) %>% 
                       count(actual, predicted)}
f5 <- function(){tabulate(4-actual-2*predicted, 4)}

在基准测试中还包括另一个 data.table 解决方案(由@Arun提供)

f6 <- function() {setDT(list(actual, predicted))[,.N, keyby=.(V1,V2)]$N}

microbenchmark(f1(),  f3(), f4(), f5(), f6(),  unit='relative', times=20L)
#Unit: relative
#expr      min       lq     mean   median       uq      max neval  cld
#f1() 2.003088 1.974501 2.020091 2.015193 2.080961 1.924808    20   c 
#f3() 2.488526 2.486019 2.450749 2.464082 2.481432 2.141309    20    d
#f4() 2.388386 2.423604 2.430581 2.459973 2.531792 2.191576    20    d
#f5() 1.034442 1.125585 1.192534 1.217337 1.239453 1.294920    20  b  
#f6() 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000    20 a   
 类似资料:
  • AWS描述 单个扫描请求可以消耗(1 MB页面大小/4 KB项目大小)/2(最终一致读取)=128次读取操作。https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/bp-query-scan.html 128似乎是Scan命令一次可以读取的最大容量。 然而,当我进行测试时,扫描命令(最终一致,没有任何过滤器选项)总是以11

  • 对于何时选择GSI或其他方式的全表扫描,是否有任何衡量标准? 我知道两者背后的基本概念,但GSI的定价模型非常依赖于表格本身,我很难决定 更重要的是,如何在不同的表大小下进行扩展,或者多少扫描效率太低,而需要GSI 顺便说一下,我很难找到好的资源来过滤表达式,以便在dynamodb上进行查询和扫描,有什么好的建议吗?(“#v

  • 问题内容: 在我当前的程序中,一种方法要求用户输入产品描述作为输入。但是,当我以后尝试打印此信息时,仅显示节目的第一个单词。这可能是什么原因?我的方法如下: 因此,如果用户输入的是“带有橙味的汽水”,则只会产生“ 汽水”。 任何帮助将不胜感激! 问题答案: 替换为:

  • 我对java有点陌生,习惯于用Python编写代码。因此,当涉及到获取用户输入时,我总是对执行这样的任务需要多少行代码感到恼火。所以我尝试创建自己的类来简化这个过程。我想表演这样的节目: 控制台内部: 以下是迄今为止的代码: 当我使用该类一次时,一切正常,但当我再次尝试使用它时,我会遇到一个异常: 输出: 我真的不知道为什么总是这样。请帮帮我,谢谢。

  • 问题内容: 我试图将我的应用程序中较大且经常使用的部分重构为单独的方法,以使其易于维护。 其中一些方法要求用户输入并进行输入验证,因此我使用了Scanner和System.in,但是当我关闭Scanner时,我也关闭了System.in。 所以我的问题是,我只能通过用CloseShieldInputStream屏蔽System.in来防止System.in关闭,还是应该开始将Scanner传递给方

  • 我试图将应用程序中大量且经常使用的部分重新划分为不同的方法,以使其更容易维护。 其中一些方法要求用户输入并进行输入验证,因此我使用了扫描仪和系统。但当我关闭扫描仪时,我也会关闭系统。在里面 所以我的问题是,我只能阻止系统。通过使用CloseShieldInputStream屏蔽它来关闭,还是我应该开始向方法传递一个扫描器?