2015-10-25 2 views
4

Я запустил LDA на искру для набора документов и заметил, что значения topicMatrix, которые представляют распределение темы по срокам, более 1, например, 548.2201, 685.2436, 138.4013 ... Что делает эти значения означают? Являются ли они логарифмическими значениями распределения или чем-то. Как преобразовать эти значения в значения распределения вероятности. Спасибо заранее.Интерпретация результатов Spark MLLib LDA

ответ

4

В обеих моделях (т.е. DistributedLDAModel и LocalLDAMoel) метод topicsMatrix будет, я считаю, возвращение (примерно, есть немного регуляризации из-за Дирихль предварительного по темам) ожидаемой слово-тема графы матрица. Чтобы проверить это, вы можете взять эту матрицу и суммировать все столбцы. Результирующий вектор (длины длины темы-размера) должен быть приблизительно равен счету слов (по всем вашим документам). В любом случае для получения тем (распределения вероятности по словам в словаре) вам необходимо нормализовать столбцы матрицы, возвращаемой topicsMatrix таким образом, чтобы каждая сумма до 1.

Я не проверяла его полностью, но что-то, как это должно работать, чтобы нормализовать столбцы матрицы, возвращаемую topicsMatrix:

import breeze.linalg.{DenseVector => BDV} 
import org.apache.spark.mllib.linalg._ 

def normalizeColumns(m: Matrix): DenseMatrix = { 
    val bm = Matrices.toBreeze(m).toDenseMatrix 
    val columnSums = BDV.zeros[Double](bm.cols).t 
    var i = bm.rows 
    while (i > 0) { i -= 1; columnSums += bm(i, ::) } 
    i = bm.cols 
    while (i > 0) { i -= 1; bm(::, i) /= columnSums(i) } 
    new DenseMatrix(bm.rows, bm.cols, bm.data) 
} 
+0

Благодарим за ответ. Но есть ли какая-либо документация, в которой упоминаются эти вещи? – hari

+0

Исходный код Scala - это документация. ;-) –

+0

ОК, большое спасибо. Также я хотел проверить распространение темы для документов. Я пытался ldamodel.topicdistribution(), но он показывал, что он не является членом библиотеки искры. Знаете ли вы, как найти распределение тем для обученных и новых документов? – hari

0

Нормализовать столбцы матрицы, возвращаемой темами. Матрица в чистом scala

def formatSparkLDAWordOutput(wordTopMat: Matrix, wordMap: Map[Int, String]): scala.Predef.Map[String, Array[Double]] = { 

// incoming word top matrix is in column-major order and the columns are unnormalized 
val m = wordTopMat.numRows 
val n = wordTopMat.numCols 
val columnSums: Array[Double] = Range(0, n).map(j => (Range(0, m).map(i => wordTopMat(i, j)).sum)).toArray 

val wordProbs: Seq[Array[Double]] = wordTopMat.transpose.toArray.grouped(n).toSeq 
    .map(unnormProbs => unnormProbs.zipWithIndex.map({ case (u, j) => u/columnSums(j) })) 

wordProbs.zipWithIndex.map({ case (topicProbs, wordInd) => (wordMap(wordInd), topicProbs) }).toMap 

} 

https://github.com/apache/incubator-spot/blob/v1.0-incubating/spot-ml/src/main/scala/org/apache/spot/lda/SpotLDAWrapper.scala#L237

Смежные вопросы