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


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

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

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

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

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

เราสามารถใช้ฟังก์ชัน scipy.special.rel_entr() เพื่อคำนวณความแตกต่างของ KL ระหว่างการแจกแจงความน่าจะเป็นสองครั้งใน Python

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

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

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

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

 #define two probability distributions
P = [.05, .1, .2, .05, .15, .25, .08, .12]
Q = [.3, .1, .2, .1, .1, .02, .08, .1]

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

 from scipy. special import rel_entr

#calculate (P || Q)
sum(rel_entr(P, Q))

0.589885181619163

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

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

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

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

 from scipy. special import rel_entr

#calculate (Q || P)
sum(rel_entr(Q, P))

0.497549319448034

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

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

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

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

วิธีสร้างเมทริกซ์สหสัมพันธ์ใน Python
วิธีสร้างเมทริกซ์ความแปรปรวนร่วมใน Python

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

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