我和Spark的Mllib合作,现在正在与LDA合作 .
但是当我使用Spark提供的代码(参见下文)来预测用于训练模型的Doc时,预测的结果(文档主题)与受过训练的文档主题的结果相反 .
我不知道结果是什么造成的 .
请求帮助,这是我的代码如下:
火车: $lda.run(corpus)
语料库是这样的RDD: $RDD[(Long, Vector)]
Vector包含词汇,单词索引,wordcounts . 预测:
def predict(documents: RDD[(Long, Vector)], ldaModel: LDAModel): Array[(Long, Vector)] = {
var docTopicsWeight = new Array[(Long, Vector)](documents.collect().length)
ldaModel match {
case localModel: LocalLDAModel =>
docTopicsWeight = localModel.topicDistributions(documents).collect()
case distModel: DistributedLDAModel =>
docTopicsWeight = distModel.toLocal.topicDistributions(documents).collect()
}
docTopicsWeight
}
2 回答
我直接在模型上使用案例类 . 你需要使用
isInstanceOf
和asInstanceOf
方法 .即使这似乎是一个老帖子,我最近发现自己有同样的问题 . 我想我理解你报道的问题 .
如果您尝试对每个文档和2个主题只有一个单词的2个小文档进行非常基本的测试,使用EM进行培训,然后从DistributedLDAModel获取topicDistributions,使用正确的alpha和beta,您可以获得模型来推断属于每个文档的每个文档主题即文档1 - 主题1,文档2 - 主题2,在我的情况下,我使每个文档的每个文档的概率为0.998 .
运行相同的测试,但这次将DistributedLDAModel转换为LocalLDAModel,每个文档属于一个主题的概率降低到0.666(使用相同的alpha和beta以及主题数) .
所以我接下来要做的是重载.toLocal方法来接受一个新的alpha和beta,然后用这些方法来使它更接近第一个测试但是我有更多的场景要覆盖,每次我都要修改alpha参数 .
我们团队的结论是,尝试使用DistributedLDAModel转换为LocalLDAModel进行预测似乎并不合适 . https://github.com/rabarona/spark-shell-utils/tree/master/2.1.0/spark-mllib/DistributedLDAModel-to-LocalLDAModel
你的结论是什么?你找到了解决方案吗?
钯 . 这就是我发现在小例子上运行测试的内容,如果我遗漏了某些内容或者我说错了,请告诉我 .
代码示例: