Spark MLlib / K-Means直觉

时间:2015-03-08 17:39:27

标签: scala apache-spark machine-learning k-means apache-spark-mllib

我是机器学习算法和Spark的新手。我跟着他 Twitter流式语言分类器在这里找到:

http://databricks.gitbooks.io/databricks-spark-reference-applications/content/twitter_classifier/README.html

特别是这段代码:

http://databricks.gitbooks.io/databricks-spark-reference-applications/content/twitter_classifier/scala/src/main/scala/com/databricks/apps/twitter_classifier/ExamineAndTrain.scala

除了我试图在批量模式下在某些推文上运行它,它就会拉出来 Cassandra,在这种情况下总共有200条推文。

如示例所示,我使用此对象“向量化”一组推文:

object Utils{
  val numFeatures = 1000
  val tf = new HashingTF(numFeatures)

  /**
   * Create feature vectors by turning each tweet into bigrams of
   * characters (an n-gram model) and then hashing those to a
   * length-1000 feature vector that we can pass to MLlib.
   * This is a common way to decrease the number of features in a
   * model while still getting excellent accuracy (otherwise every
   * pair of Unicode characters would potentially be a feature).
   */
  def featurize(s: String): Vector = {
    tf.transform(s.sliding(2).toSeq)
  }
}

这是我的代码,它是从ExaminAndTrain.scala修改的:

 val noSets = rawTweets.map(set => set.mkString("\n"))

val vectors = noSets.map(Utils.featurize).cache()
vectors.count()

val numClusters = 5
val numIterations = 30

val model = KMeans.train(vectors, numClusters, numIterations)

  for (i <- 0 until numClusters) {
    println(s"\nCLUSTER $i")
    noSets.foreach {
        t => if (model.predict(Utils.featurize(t)) == 1) {
          println(t)
        }
      }
    }

此代码运行,每个群集打印“群集0”“群集1”等 没有印在下面。如果我翻转

models.predict(Utils.featurize(t)) == 1 

models.predict(Utils.featurize(t)) == 0

同样的事情发生了,除了每个推文打印在每个群集下面。

这是我直觉认为正在发生的事情(请纠正我的 如果它错了):这段代码将每条推文变成一个向量, 随机挑选一些集群,然后运行kmeans对推文进行分组(at 一个非常高的水平,我认为,这些集群很常见 “话题”)。因此,当它检查每条推文时,看看是否有models.predict == 1,不同的推文集应出现在每个群集下(和 因为每次推文都会检查自己的训练集 应该在一个集群中)。为什么不这样做?不管我的 了解什么是kmeans是错的,我的训练集也是如此 小或我错过了一步。

非常感谢任何帮助

1 个答案:

答案 0 :(得分:3)

嗯,首先,KMeans是一种聚类算法,因此无人监督。因此,没有&#34;检查训练集对自己&#34; (好吧,你可以手动完成;)。

您的理解实际上非常好,只是您错过了model.predict(Utils.featurize(t))为您提供由KMeans分配的属于该群集的点。我想你想检查一下

models.predict(Utils.featurize(t)) == i

在您的代码中,因为我遍历所有群集标签。

也是一个小小的评论:特征向量是在推文的字符的2克模型上创建的。这个中间步骤很重要;)

2克(对于单词而言)意味着:&#34;熊对熊的喊叫&#34; =&GT; {(A,熊),(熊,喊),(喊叫,at),(at,a),(熊)}即#34;熊&#34;被计算两次。字符将是(A,[空格]),([空格],b),(b,e)等等。