วิธีการคำนวณความแตกต่างของ 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