วิธีการคำนวณ 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