【问题标题】:Efficient Euclidean distance in h2o with R使用 R 的 h2o 中的有效欧几里得距离
【发布时间】:2017-04-04 14:15:55
【问题描述】:

我在 H2O 中有一个大的十六进制框架,为此我需要计算每行中两点之间的欧几里得距离。虽然它产生了正确的结果,但下面的 H2O R 代码运行得太慢了。 30 分钟已经过去,它仍在运行。我什至有时间在它运行时将这个问题发布到stackoverflow。

这个 h2o 代码是否有更高效的设计?

# H2O R code to row-wise compute Euclidean distance between two points s1 and s2 contained in each row.
# Is this the most efficient H2O code that is possible? Real world will run on a big hex frame.
h2odistance = function(hex, cols1, cols2) {
    nr = h2o.nrow(hex)
    for (r in 1:nr) {
        dif = hex[r,cols1] - hex[r,cols2]
        sq = dif * dif
        sm = h2o.sum(sq)
        rt[r] = h2o.sqrt(sm)
    }
    rt  
}

这是它的普通旧 R 代码,用于比较。我包含一个用于正确性检查的小型测试用例数据框:

(df = data.frame(s1_c1=c(1,3), s1_c2=c(2,20), s1_c3=c(3,3), s2_c1=c(9,21), s2_c2=c(10,22), s2_c3=c(0,0)))
fn <- function(z) {sqrt(sum((z[1:3] - z[4:6])^2))}
(rt = apply(df, 1, fn))

这是纯R代码的正确输出以供参考:

11.7046999107196 18.3575597506858

h2o 代码也输出正确的值:

h2odistance(as.h2o(df), 1:3, 4:6)

11.7046999107196 18.3575597506858

【问题讨论】:

  • 请注意,这不是全对距离计算。它只是计算 nrow(df) 距离。这不是最近邻搜索。

标签: r h2o


【解决方案1】:

您可以将h2o.distance() 函数与measure = "l2" 一起使用,该函数最近已提交到master 分支但尚未发布。要使用它,您需要build H2O from master。如何使用该功能的一个例子是here。

【讨论】:

  • 我得到内存错误:没有足够的可用内存来分配距离矩阵(404279 行和 404279 列。看,你似乎在制作一个全对距离矩阵。但这是一个糟糕的假设——我不想要全对计算。我只想要由 x 框架和 y 框架定义的两点之间的距离。实现对所有对做出了错误的假设。也许你有最近的邻居,但是 NN绝对不是距离计算的唯一好处。我每帧行只有 2 个点来计算距离。
【解决方案2】:

【讨论】:

  • 我遇到了内存错误。 (见对 Erin 的评论)。为什么 h2o.distance 进行全对计算?在计算距离的一般情况下,我不希望这样。当然,h2o 不能以 404279 x 404279 的密集格式分配方阵。我只想要每行中 2 个点(在我的情况下为 100-d)之间的距离。这里没有全对的东西。详尽的最近邻搜索不一定是用户想要进行距离计算的原因。尝试对大量点对进行详尽的 NN 搜索是个坏主意——近似方法适用于这种规模,例如 balltree 和 LSH。
【解决方案3】:

这个表达式应该可以解决问题: sqrt(apply((hex[,cols1] - hex[,col2])^2, 1, sum))

【讨论】:

  • 或:sqrt(h2o.sum((hex[,cols1] - hex[,cols2])^2, axis = 1, return_frame = TRUE))
猜你喜欢
  • 2018-01-28
  • 1970-01-01
  • 2017-01-07
  • 2021-01-31
  • 1970-01-01
  • 2013-03-02
  • 1970-01-01
相关资源
最近更新 更多