2015-10-25 73 views
4

我對一組文檔運行LDA,並觀察到代表主題分佈的topicMatrix的值大於1,例如548.2201,685.2436,138.4013 ......什麼是這些值是什麼意思這些是分配的對數值或什麼。如何將這些值轉換爲概率分佈值。 在此先感謝。Spark MLLib LDA結果的解釋

回答

4

在這兩種模式(即DistributedLDAModelLocalLDAMoel)的topicsMatrix方法,我相信,迴歸(大約有由於之前的主題狄利克雷有點正規化的)預期字詞話題數矩陣。要檢查這一點,你可以採取矩陣並總結所有列。生成的向量(長度爲topic-count-size)應該近似等於單詞計數(在所有文檔中)。在任何情況下,要獲取主題(字典中的單詞概率分佈),需要對列進行規範化

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(),但它顯示它不是spark庫的成員。您是否知道如何爲經過培訓的新文檔查找主題分佈? – hari

0

:讓每個總和爲1

我沒有測試出來完全,但這樣的事情應該工作正常化由topicsMatrix返回的矩陣的列由topicsMatrix返回的矩陣使純scala中由topicsMatrix返回的矩陣的列標準化

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