2

我有一個維基頁面(棒球,曲棍球,音樂,足球)的語料庫,我通過tfidf,然後通過kmeans運行。在幾個問題開始後(你可以看到我以前的問題),我終於得到了一個KMeansModel ...但是當我嘗試predict時,我一直得到相同的中心。這是因爲小數據集,還是因爲我正在比較多個單詞文檔與較少量的單詞(1-20)查詢?還是有什麼我做錯了?請參見下面的代碼:K-Means集羣偏向一箇中心

//Preprocessing of data includes splitting into words 
//and removing words with only 1 or 2 characters 
val corpus: RDD[Seq[String]] 
val hashingTF = new HashingTF(100000) 
val tf = hashingTF.transform(corpus) 
val idf = new IDF().fit(tf) 
val tfidf = idf.transform(tf).cache 
val kMeansModel = KMeans.train(tfidf, 3, 10) 

val queryTf = hashingTF.transform(List("music")) 
val queryTfidf = idf.transform(queryTf) 
kMeansModel.predict(queryTfidf) //Always the same, no matter the term supplied 

這個問題似乎有點相關this one

回答

3

更多的清單比一個答案:

  1. 單個單詞的查詢或在很短的句子可能不是一個特別是與大型特徵矢量相結合的不錯選擇。我將從文集的大量文檔片段開始

    手動檢查每個集羣的查詢之間的相似性。它是否與每個集羣都很相似?

    import breeze.linalg.{DenseVector => BDV, SparseVector => BSV, Vector => BV} 
    import breeze.linalg.functions.cosineDistance 
    import org.apache.spark.mllib.linalg.{Vector, SparseVector, DenseVector} 
    
    def toBreeze(v: Vector): BV[Double] = v match { 
        case DenseVector(values) => new BDV[Double](values) 
        case SparseVector(size, indices, values) => { 
        new BSV[Double](indices, values, size) 
        } 
    } 
    
    val centers = kMeansModel.clusterCenters.map(toBreeze(_)) 
    val query = toBreeze(queryTfidf) 
    centers.map(c => cosineDistance(query, c)) 
    
  2. K-Means是否會聚?取決於數據集和初始質心,十次或二十次迭代是不夠的。試着將這個數字增加到一千個左右,看看問題是否存在。

  3. 您的語料庫是否足夠多樣化以形成有意義的羣集?嘗試爲您的語料庫中的每個文檔找到質心。您是否獲得了相對均勻的分佈,或者幾乎所有文檔都分配給了一個集羣。

    進行目視檢查。將您的tfidf RDD轉換爲矩陣,應用PCA,繪圖,逐個顏色的顏色,看看您是否得到有意義的結果。

    繪製質心以及檢查這些是否覆蓋可能的聚類。如果不再檢查收斂。

    您還可以檢查重心之間的相似之處:

    (0 until centers.size) 
        .toList 
        .flatMap(i => ((i + 1) until centers.size) 
        .map(j => (i, j, 1 - cosineDistance(centers(i), centers(j))))) 
    
  4. 是您的預處理徹底就夠了嗎?簡單地刪除短語很可能是不夠的。我會盡可能擴大使用停用詞刪除。一些詞幹也不會受到傷害。

  5. K均值結果取決於初始質心。嘗試多次運行算法,看看問題是否存在。

  6. 嘗試更復雜的算法,像LDA

+0

謝謝!我今晚試試這些建議。 –

+0

@JustinPihony它有用嗎? – zero323