gpt4 book ai didi

r - 矢量化平等测试

转载 作者:行者123 更新时间:2023-12-03 01:21:48 25 4
gpt4 key购买 nike

如果这不是重复,我会感到惊讶,但我找不到解决方案。

我了解 == 在测试 float 相等性方面的局限性。应该使用 all.equal

0.1 + 0.2 == 0.3
# FALSE
all.equal(0.1 + 0.2, 0.3)
# TRUE

但是 == 具有矢量化的优点:

set.seed(1)
Df <- data.frame(x = sample(seq(-1, 1, by = 0.1), size = 100, replace = TRUE),
y = 0.1)
Df[Df$x > 0 & Df$x < 0.2,]
## x y
## 44 0.1 0.1
## 45 0.1 0.1

# yet
sum(Df$x == Df$y)
# [1] 0

我可以自己编写一个(糟糕的)函数:

All.Equal <- function(x, y){
stopifnot(length(x) == length(y))
out <- logical(length(x))
for (i in seq_along(x)){
out[i] <- isTRUE(all.equal(x[i], y[i]))
}
out
}

sum(All.Equal(Df$x, Df$y))

给出了正确的答案,但还有很长的路要走。

microbenchmark::microbenchmark(All.Equal(Df$x, Df$y), Df$x == Df$y)
Unit: microseconds
expr min lq mean median uq max neval cld
All.Equal(Df$x, Df$y) 9954.986 10298.127 20382.24436 10511.5360 10798.841 915182.911 100 b
Df$x == Df$y 16.857 19.265 29.06261 30.8535 38.529 45.151 100 a

另一个选择可能是:

All.equal.abs <- function(x,y){
tol <- .Machine$double.eps ^ 0.5
abs(x - y) < tol
}

其性能与==相当。

执行此任务的现有函数是什么?

最佳答案

Vectorize() 事实证明这是一个缓慢的选择。正如 @fishtank 在评论中建议的那样,最好的解决方案来自检查绝对差异是否小于某个容差值,即下面的 is_equal_tol()

set.seed(123)
a <- sample(1:10, size = 50, replace = T)
b <- sample(a)

is_equal_tol <- function(x, y, tol = .Machine$double.eps ^ 0.5) {
abs(x - y) < tol
}

is_equal_vec <- Vectorize(all.equal, c("target", "current"))

is_equal_eq <- function(x, y) x == y

microbenchmark::microbenchmark(is_equal_eq(a, b),
is_equal_tol(a, b),
isTRUE(is_equal_vec(a, b)),
times = 1000L)

Unit: nanoseconds
expr min lq mean median uq max neval
is_equal_eq(a, b) 0 856 1545.797 1284 2139 14113 1000
is_equal_tol(a, b) 1711 2567 4991.377 4278 6843 27370 1000
isTRUE(is_equal_vec(a, b)) 2858445 3008552 3258916.503 3082964 3204204 46130260 1000

关于r - 矢量化平等测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35097815/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com