ฉันเคยต้องเขียนฟังก์ชั่นที่คำนวณเอนโทรปีของบล็อกของชุดสัญลักษณ์ที่กำหนดสำหรับขนาดบล็อกที่กำหนดและรู้สึกประหลาดใจว่าผลลัพธ์สั้นเพียงใด ดังนั้นฉันขอท้าให้คุณ codegolf ฟังก์ชั่นดังกล่าว ฉันไม่ได้บอกคุณว่าฉันทำอะไรในตอนนี้ (และในภาษาใด) แต่ฉันจะทำในหนึ่งสัปดาห์หรือมากกว่านั้นถ้าไม่มีใครคิดเรื่องเดิมหรือแนวคิดที่ดีกว่ามาก่อน
คำจำกัดความของเอนโทรปีของบล็อก:
กำหนดลำดับสัญลักษณ์ A = A_1, …, A_n และขนาดบล็อก m:
- บล็อกของขนาด m คือส่วนขององค์ประกอบต่อเนื่องของลำดับสัญลักษณ์คือ A_i, …, A_ (i + m − 1) สำหรับ i ที่เหมาะสม
- ถ้า x เป็นลำดับสัญลักษณ์ของขนาด m, N (x) หมายถึงจำนวนบล็อกของ A ซึ่งเหมือนกับ x
- p (x) คือความน่าจะเป็นที่บล็อกจาก A นั้นเหมือนกับลำดับสัญลักษณ์ x ของขนาด m คือ p (x) = N (x) / (n − m + 1)
- ในที่สุดการบล็อกเอนโทรปีสำหรับบล็อกขนาด m ของ A คือค่าเฉลี่ยของ −log (p (x)) ในทุกบล็อค x ของขนาด m ใน A หรือ (ซึ่งเทียบเท่า) ผลรวมของ −p (x) · log (p) (x)) ในทุก ๆ x ขนาด m ที่เกิดขึ้นใน A (คุณสามารถเลือกลอการิทึมที่เหมาะสมที่คุณต้องการ)
ข้อ จำกัด และการชี้แจง:
- ฟังก์ชันของคุณควรใช้ลำดับสัญลักษณ์ A และขนาดบล็อก m เป็นอาร์กิวเมนต์
- คุณอาจสันนิษฐานว่าสัญลักษณ์แสดงเป็นจำนวนเต็มตามศูนย์หรือในรูปแบบที่สะดวกอื่น
- โปรแกรมของคุณควรมีความสามารถในการโต้แย้งเหตุผลในทางทฤษฎีและในความเป็นจริงควรสามารถคำนวณกรณีตัวอย่าง (ดูด้านล่าง) บนคอมพิวเตอร์มาตรฐาน
- อนุญาตให้มีฟังก์ชั่นและไลบรารีในตัวได้ตราบใดที่มันไม่ได้ทำการประมวลผลส่วนใหญ่ในการโทรครั้งเดียวนั่นคือการแยกบล็อคทั้งหมดของขนาด m จาก A นับจำนวนการเกิดขึ้นของบล็อก x ที่กำหนดหรือคำนวณเอนโทรปี จากลำดับของค่า p - คุณต้องทำสิ่งเหล่านั้นด้วยตัวเอง
ทดสอบ:
[2, 3, 4, 1, 2, 3, 0, 0, 3, 2, 3, 0, 2, 2, 4, 4, 4, 1, 1, 1, 0, 4, 1,
2, 2, 4, 0, 1, 2, 3, 0, 2, 3, 2, 3, 2, 0, 1, 3, 4, 4, 0, 2, 1, 4, 3,
0, 2, 4, 1, 0, 4, 0, 0, 2, 2, 0, 2, 3, 0, 0, 4, 4, 2, 3, 1, 3, 1, 1,
3, 1, 3, 1, 0, 0, 2, 2, 4, 0, 3, 2, 2, 3, 0, 3, 3, 0, 0, 4, 4, 1, 0,
2, 3, 0, 0, 1, 4, 4, 3]
บล็อกเอนโทรปีของลำดับนี้คือ (สำหรับลอการิทึมธรรมชาติ):
- m = 1: 1.599
- m = 2: 3.065
- m = 3: 4.067
- m = 4: 4.412
- m = 5: 4.535
- m = 6: 4.554
entropy(probabilities(blocks(A,m)))จริง ๆ เท่านั้น