[英]Elbow/knee in a curve in R
我有這個數據處理:
library(text2vec)
##Using perplexity for hold out set
t1 <- Sys.time()
perplex <- c()
for (i in 3:25){
set.seed(17)
lda_model2 <- LDA$new(n_topics = i)
doc_topic_distr2 <- lda_model2$fit_transform(x = dtm, progressbar = F)
set.seed(17)
sample.dtm2 <- itoken(rawsample$Abstract,
preprocessor = prep_fun,
tokenizer = tok_fun,
ids = rawsample$id,
progressbar = F) %>%
create_dtm(vectorizer,vtype = "dgTMatrix", progressbar = FALSE)
set.seed(17)
new_doc_topic_distr2 <- lda_model2$transform(sample.dtm2, n_iter = 1000,
convergence_tol = 0.001, n_check_convergence = 25,
progressbar = FALSE)
perplex[i] <- text2vec::perplexity(sample.dtm2, topic_word_distribution =
lda_model2$topic_word_distribution,
doc_topic_distribution = new_doc_topic_distr2)
}
print(difftime(Sys.time(), t1, units = 'sec'))
我知道有很多這樣的問題,但我一直無法准確找到我的情況的答案。 在上圖中,您可以看到潛在狄利克雷分配 model 的 3 到 25 個主題編號的困惑度計算。 我想獲得其中最充分的值,這意味着我想找到肘部或膝蓋,對於那些可能只被視為簡單數字向量的值,其結果如下所示:
1 NA
2 NA
3 222.6229
4 210.3442
5 200.1335
6 190.3143
7 180.4195
8 174.2634
9 166.2670
10 159.7535
11 153.7785
12 148.1623
13 144.1554
14 141.8250
15 138.8301
16 134.4956
17 131.0745
18 128.8941
19 125.8468
20 123.8477
21 120.5155
22 118.4426
23 116.4619
24 113.2401
25 114.1233
plot(perplex)
我會說肘部是 13 或 16,但我不完全確定,我想要確切的數字作為結果。 我在這篇論文中看到 f''(x) / (1+f'(x)^2)^1.5 是膝蓋公式,我這樣嘗試並說它是 18:
> d1 <- diff(perplex) # first derivative
> d2 <- diff(d1) / diff(perplex[-1]) # second derivative
> knee <- (d2)/((1+(d1)^2)^1.5)
Warning message:
In (d2)/((1 + (d1)^2)^1.5) :
longer object length is not a multiple of shorter object length
> which.min(knee)
[1] 18
我無法完全弄清楚這件事。 有人想分享我如何根據困惑作為結果獲得確切的理想主題編號嗎?
發現這個:“具有最佳相干分數的 LDA model,通過肘法獲得(具有最大絕對二階導數的點)(...)”在本文中,所以這個編碼可以工作: d1 <- diff(perplex); k <- which.max(abs(diff(d1) / diff(perplex[-1])))
d1 <- diff(perplex); k <- which.max(abs(diff(d1) / diff(perplex[-1])))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.