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