วิธีการคำนวณความแตกต่างของ kl ใน r (พร้อมตัวอย่าง)


ในสถิติ ความแตกต่างระหว่าง Kullback–Leibler (KL) เป็นตัววัดระยะทางที่บอกปริมาณความแตกต่างระหว่างการแจกแจงความน่าจะเป็นทั้งสองแบบ

หากเรามีการแจกแจงความน่าจะเป็นสองแบบ ได้แก่ P และ Q โดยทั่วไปเราจะเขียนความแตกต่างของ KL โดยใช้สัญลักษณ์ KL(P || Q) ซึ่งหมายถึง “ความแตกต่างของ P จาก Q”

เราคำนวณโดยใช้สูตรต่อไปนี้:

KL(P || Q) = ΣP(x) ln (P(x) / Q(x))

ถ้าค่าความแตกต่าง KL ระหว่างการแจกแจงสองค่าเป็นศูนย์ แสดงว่าการแจกแจงเหมือนกัน

วิธีที่ง่ายที่สุดในการคำนวณความแตกต่างของ KL ระหว่างการแจกแจงความน่าจะเป็นสองครั้งใน R คือการใช้ฟังก์ชัน KL() จากแพ็คเกจ philentropy

ตัวอย่างต่อไปนี้แสดงวิธีใช้ฟังก์ชันนี้ในทางปฏิบัติ

ตัวอย่าง: การคำนวณความแตกต่างของ KL ใน R

สมมติว่าเรามีการแจกแจงความน่าจะเป็นสองตัวต่อไปนี้ใน R:

 #define two probability distributions
P <- c(.05, .1, .2, .05, .15, .25, .08, .12)
Q <- c(.3, .1, .2, .1, .1, .02, .08, .1)

หมายเหตุ : สิ่งสำคัญคือความน่าจะเป็นของการแจกแจงแต่ละครั้งจะรวมกันเป็นหนึ่ง

เราสามารถใช้โค้ดต่อไปนี้เพื่อคำนวณความแตกต่างของ KL ระหว่างการแจกแจงทั้งสอง:

 library (philentropy)

#rbind distributions into one matrix
x <- rbind(P,Q)

#calculate KL divergence
KL(x, unit=' log ')

Metric: 'kullback-leibler' using unit: 'log'; comparing: 2 vectors.
kullback-leibler 
       0.5898852 

ค่าความแตกต่าง KL ของการแจกแจง P จากการแจกแจง Q มีค่าประมาณ 0.589

โปรดทราบว่าหน่วยที่ใช้ในการคำนวณนี้เรียกว่า nats ซึ่งย่อมาจาก หน่วยข้อมูลธรรมชาติ

ดังนั้นเราจะบอกว่าความแตกต่างของ KL คือ 0.589 nats

โปรดทราบว่าความแตกต่างของ KL ไม่ใช่การวัดแบบสมมาตร ซึ่งหมายความว่าหากเราคำนวณความแตกต่างของ KL ของการแจกแจง Q จากการแจกแจงแบบ P เราอาจจะได้ค่าที่ต่างออกไป:

 library (philentropy)

#rbind distributions into one matrix
x <- rbind(Q,P)

#calculate KL divergence
KL(x, unit=' log ')

Metric: 'kullback-leibler' using unit: 'log'; comparing: 2 vectors.
kullback-leibler 
       0.4975493 

ความแตกต่าง KL ของการแจกแจง Q จากการแจกแจง P มีค่าประมาณ 0.497 nats

โปรดทราบว่าบางสูตรใช้บันทึกฐาน-2 เพื่อคำนวณความแตกต่างของ KL ในกรณีนี้ เรากำลังพูดถึงความแตกต่างในแง่ของ บิต มากกว่า nats

ในการคำนวณความแตกต่างของ KL ในรูปของบิต คุณสามารถใช้ log2 ในอาร์กิวเมนต์ หน่วย ได้:

 library (philentropy)

#rbind distributions into one matrix
x <- rbind(P,Q)

#calculate KL divergence (in bits)
KL(x, unit=' log2 ')

Metric: 'kullback-leibler' using unit: 'log2'; comparing: 2 vectors.
kullback-leibler 
       0.7178119

ความแตกต่าง KL ของการแจกแจง P จากการแจกแจง Q มีค่าประมาณ 0.7178 บิต

แหล่งข้อมูลเพิ่มเติม

บทช่วยสอนต่อไปนี้จะอธิบายวิธีดำเนินการงานทั่วไปอื่นๆ ใน R:

วิธีสร้างการแจกแจงแบบปกติใน R
วิธีการพล็อตการแจกแจงแบบปกติใน R

เพิ่มความคิดเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *