【问题标题】:Converting the euclidean distance to manhattan distance将欧几里得距离转换为曼哈顿距离
【发布时间】:2017-09-08 16:00:52
【问题描述】:

spark mlib 库中给出了以下计算以求欧几里得距离

private[mllib] def fastSquaredDistance(
      v1: Vector,
      norm1: Double,
      v2: Vector,
      norm2: Double,
      precision: Double = 1e-6): Double = {
    val n = v1.size
    require(v2.size == n)
    require(norm1 >= 0.0 && norm2 >= 0.0)
    val sumSquaredNorm = norm1 * norm1 + norm2 * norm2
    val normDiff = norm1 - norm2
    var sqDist = 0.0

    val precisionBound1 = 2.0 * EPSILON * sumSquaredNorm / (normDiff * normDiff + EPSILON)
    if (precisionBound1 < precision) {
      sqDist = sumSquaredNorm - 2.0 * dot(v1, v2)
    } else if (v1.isInstanceOf[SparseVector] || v2.isInstanceOf[SparseVector]) {
      val dotValue = dot(v1, v2)
      sqDist = math.max(sumSquaredNorm - 2.0 * dotValue, 0.0)
      val precisionBound2 = EPSILON * (sumSquaredNorm + 2.0 * math.abs(dotValue)) /
        (sqDist + EPSILON)
      if (precisionBound2 > precision) {
        sqDist = Vectors.sqdist(v1, v2)
      }
    } else {
      sqDist = Vectors.sqdist(v1, v2)
    }
    sqDist
  }

我对机器学习很陌生。我的问题是关于如何通过修改上面的代码来找到曼哈顿距离。

【问题讨论】:

  • 曼哈顿距离只是对向量的减法(带有一些外部绝对值)。你不应该修改上面的代码! Wiki.

标签: scala apache-spark machine-learning


【解决方案1】:

没有任何额外的上下文,我建议以明显幼稚的方式实现 L1 距离:

d_manhatten(u,v) = sum( abs(u[i] - v[i]), i)     // Pseudocode

现在,我没怎么看你的代码,但它看起来大部分是 (1) 关注精度(与 L2 相比,这对 L1 的问题较小,因为没有正方形)和(2) 使用 L2 规范作为输入(据我所知,这在计算 L1 时无论如何都没有用)。所以修改当前的方法可能没那么有用。

另外,我听说过早的优化是万恶之源,所以先尝试最简单的方法,如果不能接受,再尝试混淆优化:)

【讨论】:

    猜你喜欢
    • 2019-03-08
    • 2019-05-07
    • 2013-10-20
    • 2017-10-09
    • 1970-01-01
    • 2013-03-02
    • 2012-06-18
    相关资源
    最近更新 更多