R LDAvis K = 2 createJSON()错误

时间:2016-03-06 17:25:59

标签: r lda topic-modeling

我正在使用LDAvis包的createJSON()函数,而我的topicmodel是针对2个主题并收到此错误

Error in stats::cmdscale(dist.mat, k = 2) : 'k' must be in {1, 2, .. n - 1} 

然后我使用给定here的可重复示例进行测试,将K = 2并保持一致并在createJSON()中再次遇到此错误。

查看createJSON()here的源代码后,问题出在函数jsPCA()中。 在jsPCA()中,当K = 2时,dist.mat出现是一个单独的值,它会在行中引发错误

pca.fit <- stats::cmdscale(dist.mat, k = 2) 

有关如何解决此错误的建议吗?

1 个答案:

答案 0 :(得分:4)

由于jsPCA内部的jensenShannon函数存在零问题,因此出现了问题。整个jsPCA代码如下所示:

 jsPCA <- function(phi){
    jensenShannon <- function(x, y) {
    m <- 0.5 * (x + y)
    0.5 * sum(x * log(x/m)) + 0.5 * sum(y * log(y/m))
    }
    dist.mat <- proxy::dist(x = phi, method = jensenShannon)
    pca.fit <- stats::cmdscale(dist.mat, k = 2)
    data.frame(x = pca.fit[, 1], y = pca.fit[, 2])  
    }

如果m包含零,则结果为NaN。错误从那里流过。因此,您可以通过指定容忍零的降维方法来防止错误。实际上,LDAvis文档提供了一个植根于t-SNE的选项:

 library("tsne")
 svd_tsne <- function(x) tsne(svd(x)$u)

只需将此功能插入mds.method,你应该好好去:

 createJSON(phi, theta, doc.length, vocab, term.frequency,
            mds.method = svd_tsne,
            plot.opts = list(xlab="", ylab="")
            )