Понимание алгоритма корреляции искр

Я читал исходный код алгоритма корреляции Spark, и, просматривая код, я не мог понять этого конкретного кода.

Это из файла: org/apache/spark/mllib/linalg/BLAS.scala

 def spr(alpha: Double, v: Vector, U: Array[Double]): Unit = {
    val n = v.size
    v match {
      case DenseVector(values) =>
        NativeBLAS.dspr("U", n, alpha, values, 1, U)
      case SparseVector(size, indices, values) =>
        val nnz = indices.length
        var colStartIdx = 0
        var prevCol = 0
        var col = 0
        var j = 0
        var i = 0
        var av = 0.0
        while (j < nnz) {
          col = indices(j)
          // Skip empty columns.
          colStartIdx += (col - prevCol) * (col + prevCol + 1) / 2
          av = alpha * values(j)
          i = 0
          while (i <= j) {
            U(colStartIdx + indices(i)) += av * values(i)
            i += 1
          }
          j += 1
          prevCol = col
        }
    }
  }

Я не знаю Скала, и это могло быть причиной, по которой я не мог этого понять. Может кто-нибудь объяснить, что здесь происходит.

Он вызывается из Rowmatrix.scala

  def computeGramianMatrix(): Matrix = {
    val n = numCols().toInt
    checkNumColumns(n)
    // Computes n*(n+1)/2, avoiding overflow in the multiplication.
    // This succeeds when n <= 65535, which is checked above
    val nt = if (n % 2 == 0) ((n / 2) * (n + 1)) else (n * ((n + 1) / 2))

    // Compute the upper triangular part of the gram matrix.
    val GU = rows.treeAggregate(new BDV[Double](nt))(
      seqOp = (U, v) => {
        BLAS.spr(1.0, v, U.data)
        U
      }, combOp = (U1, U2) => U1 += U2)

    RowMatrix.triuToFull(n, GU.data)
  }

Корреляция определяется здесь: https://en.wikipedia.org/wiki/Pearson_correlation_coefficient

Конечная цель - понять алгоритм корреляции Спарка.

Обновление 1: добавьте документ https://stanford.edu/~rezab/papers/linalg.pdf

0 ответов

Другие вопросы по тегам