2017-09-08 10 views
0

が.MYの質問を機械学習に以下の計算は、スパーク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 
    } 

は、私は非常に新しいですユークリッド距離を見つけるためには、変更することで、マンハッタン距離を見つける方法についてです上記のコード。

+0

マンハッタン距離だけですベクトルの減算(いくつかの外側absを持つ)。上記のコードは変更しないでください! [Wiki](https://en.wikipedia.org/wiki/Taxicab_geometry)。 – sascha

答えて

2

任意の追加のコンテキストがなければ、私はちょうど明白な素朴な方法でL1距離を実装することをお勧めしたい:

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

さて、私はずっとあなたのコードを見ていないが、それはそれの多くのように見えます(2)L2ノルムを入力として使用する(私の知識では、計算には役立たない。) L1とにかく)。したがって、現在のメソッドを変更することはそれほど有用ではないかもしれません。

また、私は時期尚早の最適化は諸悪の根源であることを多くのことを聞いて、その最初の最も簡単な方法を試してみて、それが受け入れられない場合は、してみてください難読化最適化:)

関連する問題