为什么 fit_transform 和 transform 会产生不同的结果?
Why do fit_transform and transform produce different results?
我在 text2vec
包中玩弄 LDA,并且很困惑为什么 fit_transfrom
和 transform
在使用相同数据时会有所不同。
The documentation 声明 transform 将学习的模型应用于新数据,但结果与 fit_transform
产生的结果有很大不同
data("movie_review")
library(stringr)
library(text2vec)
library(dpylr)
tokens = movie_review$review[1:4000] %>%
tolower %>%
word_tokenizer
it = itoken(tokens, ids = movie_review$id[1:4000], progressbar = FALSE)
v = create_vocabulary(it) %>%
prune_vocabulary(term_count_min = 10, doc_proportion_max = 0.2)
vectorizer = vocab_vectorizer(v)
dtm = create_dtm(it, vectorizer, type = "dgTMatrix")
lda_model = LDA$new(n_topics = 10, doc_topic_prior = 0.1, topic_word_prior = 0.01)
set.seed(123)
doc_topic_distr =
lda_model$fit_transform(x = dtm, n_iter = 1000,
convergence_tol = 0.001, n_check_convergence = 25,
progressbar = FALSE)
set.seed(123)
new_doc_topic_dist =
lda_model$transform(x = dtm, n_iter = 1000,
convergence_tol = 0.001, n_check_convergence = 25,
progressbar = FALSE)
head(doc_topic_distr)
head(new_doc_topic_dist)
我原以为 doc_topic_distr
和 new_doc_topic_distr
是一样的,但它们完全不同。
好问题!确实存在 CRAN 版本的问题(并且它主要在 github 的开发版本中修复)。问题如下:
- 在
fit_transform
期间,我们学习了 document-topic 分布和 word-topic 分布。一旦收敛,我们将 word-topic 保存在模型中,并将 return document-topic 作为结果。
- 在
transform
期间,我们使用固定的 word-topic 分布并且仅推断 document-topic。不能保证推断的 document-topic 与 fit_transform
期间相同(但应该足够接近)。
我们在开发版本中所做的更改 - 我们 运行 fit_transform
和 transform
以便每个方法具有几乎相同的 document-topic 分布。 (有几个额外的参数调整以确保它们完全相同 - 请参阅开发版本的文档)。
我在 text2vec
包中玩弄 LDA,并且很困惑为什么 fit_transfrom
和 transform
在使用相同数据时会有所不同。
The documentation 声明 transform 将学习的模型应用于新数据,但结果与 fit_transform
data("movie_review")
library(stringr)
library(text2vec)
library(dpylr)
tokens = movie_review$review[1:4000] %>%
tolower %>%
word_tokenizer
it = itoken(tokens, ids = movie_review$id[1:4000], progressbar = FALSE)
v = create_vocabulary(it) %>%
prune_vocabulary(term_count_min = 10, doc_proportion_max = 0.2)
vectorizer = vocab_vectorizer(v)
dtm = create_dtm(it, vectorizer, type = "dgTMatrix")
lda_model = LDA$new(n_topics = 10, doc_topic_prior = 0.1, topic_word_prior = 0.01)
set.seed(123)
doc_topic_distr =
lda_model$fit_transform(x = dtm, n_iter = 1000,
convergence_tol = 0.001, n_check_convergence = 25,
progressbar = FALSE)
set.seed(123)
new_doc_topic_dist =
lda_model$transform(x = dtm, n_iter = 1000,
convergence_tol = 0.001, n_check_convergence = 25,
progressbar = FALSE)
head(doc_topic_distr)
head(new_doc_topic_dist)
我原以为 doc_topic_distr
和 new_doc_topic_distr
是一样的,但它们完全不同。
好问题!确实存在 CRAN 版本的问题(并且它主要在 github 的开发版本中修复)。问题如下:
- 在
fit_transform
期间,我们学习了 document-topic 分布和 word-topic 分布。一旦收敛,我们将 word-topic 保存在模型中,并将 return document-topic 作为结果。 - 在
transform
期间,我们使用固定的 word-topic 分布并且仅推断 document-topic。不能保证推断的 document-topic 与fit_transform
期间相同(但应该足够接近)。
我们在开发版本中所做的更改 - 我们 运行 fit_transform
和 transform
以便每个方法具有几乎相同的 document-topic 分布。 (有几个额外的参数调整以确保它们完全相同 - 请参阅开发版本的文档)。