พารามิเตอร์อินพุตสำหรับการใช้การจัดสรร Dirichlet แฝง


17

เมื่อใช้การสร้างหัวข้อ (Latent Dirichlet Allocation) จำนวนหัวข้อคือพารามิเตอร์อินพุตที่ผู้ใช้ต้องระบุ

ฉันคิดว่าเราควรจะมีชุดหัวข้อผู้สมัครที่กระบวนการ Dirichlet มีตัวอย่าง ความเข้าใจของฉันถูกต้องหรือไม่ ในทางปฏิบัติจะตั้งค่าหัวข้อผู้สมัครประเภทนี้ได้อย่างไร

คำตอบ:


21

เท่าที่ฉันรู้คุณเพียงแค่ต้องจัดหาหัวข้อและคลังข้อมูลจำนวนมาก ไม่จำเป็นต้องระบุหัวข้อชุดผู้สมัครแม้คนหนึ่งจะสามารถนำมาใช้เป็นคุณสามารถเห็นในตัวอย่างเริ่มต้นที่ด้านล่างของหน้า 15 ของGrun และ Hornik (2011)

อัปเดต 28 มกราคม 14. ตอนนี้ฉันทำสิ่งต่าง ๆ เล็กน้อยกับวิธีการด้านล่าง ดูที่นี่สำหรับแนวทางปัจจุบันของฉัน: /programming//a/21394092/1036500

วิธีง่ายๆในการค้นหาจำนวนหัวข้อที่เหมาะสมที่สุดโดยไม่มีข้อมูลการฝึกอบรมคือการวนลูปผ่านโมเดลที่มีจำนวนหัวข้อต่างกันเพื่อค้นหาจำนวนหัวข้อที่มีความน่าจะเป็นบันทึกสูงสุดตามข้อมูล ลองพิจารณาตัวอย่างนี้ด้วยR

# download and install one of the two R packages for LDA, see a discussion
# of them here: http://stats.stackexchange.com/questions/24441
#
install.packages("topicmodels")
library(topicmodels)
#
# get some of the example data that's bundled with the package
#
data("AssociatedPress", package = "topicmodels")

ก่อนที่จะเริ่มสร้างโมเดลหัวข้อและวิเคราะห์ผลลัพธ์เราต้องตัดสินใจเกี่ยวกับจำนวนหัวข้อที่โมเดลควรใช้ นี่คือฟังก์ชั่นในการวนซ้ำหมายเลขหัวข้อต่าง ๆ รับความเป็นไปได้ของแบบจำลองสำหรับแต่ละหมายเลขหัวข้อและพล็อตเพื่อให้เราสามารถเลือกรูปแบบที่ดีที่สุด จำนวนหัวข้อที่ดีที่สุดคือหัวข้อที่มีค่าความน่าจะเป็นบันทึกสูงสุดเพื่อรับข้อมูลตัวอย่างที่อยู่ในแพ็คเกจ ที่นี่ฉันเลือกที่จะประเมินทุกรุ่นที่เริ่มต้นด้วย 2 หัวข้อถึง 100 หัวข้อ (ขั้นตอนนี้ใช้เวลาสักพัก!)

best.model <- lapply(seq(2,100, by=1), function(k){LDA(AssociatedPress[21:30,], k)})

ตอนนี้เราสามารถแยกค่าความน่าจะเป็นของบันทึกสำหรับแต่ละรุ่นที่สร้างขึ้นและเตรียมการลงจุด:

best.model.logLik <- as.data.frame(as.matrix(lapply(best.model, logLik)))

best.model.logLik.df <- data.frame(topics=c(2:100), LL=as.numeric(as.matrix(best.model.logLik)))

และทำพล็อตเพื่อดูว่าจำนวนหัวข้อที่มีโอกาสมากที่สุดในการบันทึกที่ปรากฏคือ:

library(ggplot2)
ggplot(best.model.logLik.df, aes(x=topics, y=LL)) + 
  xlab("Number of topics") + ylab("Log likelihood of the model") + 
  geom_line() + 
  theme_bw()  + 
  opts(axis.title.x = theme_text(vjust = -0.25, size = 14)) + 
  opts(axis.title.y = theme_text(size = 14, angle=90))

ป้อนคำอธิบายรูปภาพที่นี่

ดูเหมือนว่าจะอยู่ระหว่าง 10 ถึง 20 หัวข้อ เราสามารถตรวจสอบข้อมูลเพื่อค้นหาจำนวนหัวข้อที่แน่นอนด้วยความน่าจะเป็นบันทึกสูงสุดดังนี้:

best.model.logLik.df[which.max(best.model.logLik.df$LL),]
# which returns
       topics        LL
12     13           -8525.234

ดังนั้นผลลัพธ์ที่ได้คือ 13 หัวข้อจึงเหมาะสมที่สุดสำหรับข้อมูลเหล่านี้ ตอนนี้เราสามารถก้าวไปข้างหน้าด้วยการสร้างโมเดล LDA ด้วย 13 หัวข้อและตรวจสอบโมเดล:

lda_AP <- LDA(AssociatedPress[21:30,], 13)   # generate the model with 13 topics 
get_terms(lda_AP, 5)                         # gets 5 keywords for each topic, just for a quick look
get_topics(lda_AP, 5)                        # gets 5 topic numbers per document

และอื่น ๆ เพื่อตรวจสอบคุณสมบัติของรูปแบบ

วิธีนี้ขึ้นอยู่กับ:

Griffiths, TL และ M. Steyvers 2004 ค้นหาหัวข้อทางวิทยาศาสตร์ กิจการของสถาบันวิทยาศาสตร์แห่งชาติของสหรัฐอเมริกา 101 (Suppl 1): 5228 –5235


ฉันอัปเดตรหัสนี้และบันทึกเป็นส่วนสำคัญ มีวิธีการลงจุดที่พิมพ์ตามค่าเริ่มต้น devtools::source_url("https://gist.githubusercontent.com/trinker/9aba07ddb07ad5a0c411/raw/c44f31042fc0bae2551452ce1f191d70796a75f9/optimal_k") +1 คำตอบที่ดี
Tyler Rinker

ด้วยการเพิ่ม k ใน LDA คุณกำลังขยายพื้นที่พารามิเตอร์และโมเดลที่มี k ที่เล็กกว่านั้นจะซ้อนอยู่ภายในโมเดลที่มี k สูงกว่า LL ควรเพิ่มขึ้นเรื่อย ๆ ด้วย k สิ่งที่คุณเกิดขึ้นกับการชนเล็ก ๆ รอบ k = 13 อาจเป็นเพราะอัลกอริธึม VEM ที่ไม่รวมกันเป็นค่าสูงสุดทั่วโลกสำหรับโมเดลที่ซับซ้อน คุณจะมีโชคมากขึ้นด้วย AIC หรือ BIC
VitoshKa

สวัสดี @Ben คำตอบที่มีประโยชน์จริงๆ ฉันมีหนึ่งคำถามเกี่ยวกับมันเมื่อคุณกำลังประเมินรุ่นที่มี 2-100 best.model <- lapply(seq(2,100, by=1), function(k){LDA(AssociatedPress[21:30,], k)})หัวข้อ: ทำไมคุณถึงเลือกเฉพาะข้อมูลดิบ 21:30
Economist_Ayahuasca

เมื่อไม่กี่ปีที่ผ่านมาที่ฉันโพสต์คำตอบนั้นฉันจำไม่ได้แน่นอน แต่อาจเป็นเพียงการทำให้เวลาในการคำนวณสั้นลง!
เบ็น

1
ขณะนี้มี pkg ที่ดีสำหรับการคำนวณจำนวนหัวข้อที่เหมาะสมคือ: cran.r-project.org/web/packages/ldatuning
Ben
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.