我正在使用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)
有关如何解决此错误的建议吗?
答案 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="")
)