【发布时间】:2015-05-09 21:11:38
【问题描述】:
我对机器学习算法和 Spark 非常陌生。我跟着 在此处找到 Twitter 流语言分类器:
具体这段代码:
除了我试图在它拉出的一些推文上以批处理模式运行它 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 对推文进行分组(在 一个非常高的水平,我认为集群很常见 “话题”)。因此,当它检查每条推文以查看 models.predict 是否 == 1,不同的推文集应该出现在每个集群下(并且 因为它会根据自己检查训练集,每条推文 应该在一个集群中)。为什么不这样做?无论是我的 对kmeans的理解是错误的,我的训练集也是 小,否则我错过了一步。
非常感谢任何帮助
【问题讨论】:
标签: scala apache-spark machine-learning k-means apache-spark-mllib