ประมาณความซับซ้อนของ Kolmogorov


22

ฉันได้ศึกษาเกี่ยวกับความซับซ้อนของ Kolmogorovอ่านบทความและหนังสือจากVitanyi และ Liและใช้แนวคิดของNormalized Compression Distanceเพื่อตรวจสอบ stilometry ของผู้เขียน (ระบุว่าผู้เขียนแต่ละคนเขียนข้อความและเอกสารกลุ่มอย่างไรด้วยความคล้ายคลึงกัน)

ในกรณีดังกล่าวเครื่องอัดข้อมูลถูกใช้เพื่อประมาณความซับซ้อนของ Kolmogorov เนื่องจากเครื่องอัดข้อมูลสามารถใช้เป็นเครื่องทัวริงได้

นอกเหนือจากการบีบอัดข้อมูลและภาษาการเขียนโปรแกรม (ซึ่งคุณจะเขียนโปรแกรมบีบอัดบางชนิด) สิ่งอื่น ๆ ที่สามารถนำมาใช้เพื่อประมาณความซับซ้อนของ Kolmogorov ได้? มีวิธีการอื่นใดที่สามารถนำมาใช้ได้หรือไม่?


ฉันไม่แน่ใจว่าฉันเข้าใจคำถามของคุณ: คำจำกัดความของ KC เกี่ยวข้องกับเครื่องจักรทัวริงซึ่งเป็นตัวอย่างโปรแกรม (ที่เกี่ยวกับการแปลบางส่วน) การประมาณความซับซ้อนของ Kolmogorv นั้นหมายความว่าอย่างไรหากไม่มีภาษาโปรแกรม?
ดี้

1
บีบอัดสตริงโดยใช้ซอฟต์แวร์บีบอัดใด ๆ เช่น GZip ขนาดของการส่งออกเป็นขอบเขตบน KC ของสตริง
M. Alaggan

@ โคดี้: แน่นอนว่าฉันใช้ตัวอัดข้อมูลในการวิจัยของฉัน (zip, bzip, ppmd) กับ KC โดยประมาณ ตัวอัดข้อมูลไม่ใช่โปรแกรม .. ดังนั้นฉันกำลังมองหาคำแนะนำเกี่ยวกับสิ่งที่สามารถใช้ใน KC นอกเหนือจากภาษา (= เขียนโปรแกรมใน C / prolog / อะไรก็ตาม) และตัวอัดข้อมูล (= ใช้ zip, gzip, ppmc, ppmd ... ) :)
woliveirajr

1
ฉันคิดว่ามันดูเหมือนว่าคำจำกัดความของโปรแกรมบีบอัดข้อมูลคือ: โปรแกรมที่ประมาณค่า KC ของสตริงโดยโปรแกรม ("uncompressor") และอีกสตริงหนึ่ง (สตริงที่บีบอัด)
ดี้

คำตอบ:


9

ผมคิดว่าคำตอบที่เป็นไปได้หนึ่งคำถามของคุณคือ: ใช้หมายเลข pseudorandom กำเนิด Gลองเลือกตัวสร้างที่มีการโจมตีที่ทรงพลังกับมัน: ตัวสร้างตัวเลขแบบสุ่มสำหรับคือ (สำหรับจุดประสงค์ของเรา) อัลกอริทึมซึ่งเมื่อได้รับสตริง imputจะกำหนดเมล็ดเช่น s จากนั้นประมาณค่า KC ของ :G s ( s ) G ( ( s ) ) = s sGGAs A(s)G(A(s))=ss

input: s
Compute A(s);
if |A(s)| + |G| > |s| output: |s|
otherwise output: |A(s)| + |G|

ที่ไหนคือความยาวของโปรแกรมที่คำนวณ (มักจะค่อนข้างสั้นสำหรับเครื่องกำเนิดเชิงเส้น)G ( s )|G|G(s)

โปรดทราบว่าในทางปฏิบัติการโจมตีตัวสร้างตัวเลขแบบสุ่มนั้นไม่ได้อธิบายไว้: อาจล้มเหลวหรือให้ผลลัพธ์ที่ไม่สมบูรณ์ ในกรณีนี้คุณอาจปรับอัลกอริทึมเพื่อให้ส่งคืนเมื่อผลของการโจมตีไม่เป็นที่น่าพอใจ คำพูดเดียวกันสำหรับอัลกอริธึมการบีบอัด|s|

ข้อแม้แนวทางนี้เมื่อเทียบกับกลไกการบีบอัดคือการที่กลไกการบีบอัดโดยทั่วไปมากขึ้นเหมาะกับการคำนวณ KC ที่พวกเขาจะปรับให้เหมาะสมกับการทำงานในใด ๆสตริงในขณะที่การโจมตีสามารถทำงานได้เฉพาะในกรณีเกิดขึ้นจะอยู่ในภาพของ ( ไม่น่าเป็นไปได้มาก )GsG


7

การกระจายความน่าจะเป็นใด ๆ หากคุณมีการแจกแจงความน่าจะเป็นที่คำนวณได้ซึ่งให้ความน่าจะเป็นข้อมูลของคุณจากความไม่เสมอภาคของคราฟท์มีการบีบอัดที่คำนวณได้ซึ่งบีบอัดมันในบิต (ปัดเศษขึ้น ซึ่งหมายความว่าอัลกอริทึมการเรียนรู้ของเครื่องกำเนิดใด ๆ สามารถนำมาใช้ได้- บันทึกp ( x )p(x)logp(x)

นี่คือเหตุผลที่ Kolmogorov ซับซ้อนเป็นที่น่าสนใจเช่นนั้นไม่ได้เพราะมันเป็นวิธีการบีบอัดที่ดีที่สุด (ที่ใส่ใจเกี่ยวกับการบีบอัดอยู่แล้ว) แต่เพราะมันเป็นสุดยอดการเรียนรู้ขั้นตอนวิธีการ การบีบอัดและการเรียนรู้นั้นเป็นสิ่งเดียวกัน: การค้นหารูปแบบในข้อมูลของคุณ กรอบสถิติที่สร้างขึ้นจากแนวคิดนี้เรียกว่าความยาวรายละเอียดขั้นต่ำและได้รับแรงบันดาลใจโดยตรงจากความซับซ้อนของ Kolmogorov

ดูคำถามนี้ได้ที่ cstheory StackExchange


5

การเข้ารหัสไวยกรณ์เป็นอัลกอริธึมการบีบอัดเวอร์ชันที่ใช้งานน้อยกว่าและสามารถใช้เป็นค่าประมาณ "คร่าวๆ" ของความซับซ้อนของ Kolmogorov การเข้ารหัสไวยากรณ์ไม่ได้ถูกใช้เป็นอัลกอริธึมการบีบอัดเหมือนกับวิธีการทั่วไปอื่น ๆ ซึ่งส่วนใหญ่อาจจะเป็นเพราะมันไม่ได้ปรับปรุงการบีบอัดจาก Lempel-Ziv บนพื้นฐานของข้อความ แต่อาจทำได้ดีกับข้อมูลประเภทอื่น แนวคิดก็คือ "บีบอัด" สตริงโดยใช้กฎไวยากรณ์ การสืบทอดไวยากรณ์อาจส่งผลให้ DAG (เทียบกับต้นไม้ที่มีความซับซ้อนน้อยกว่า) ดังนั้นจึงมีความซับซ้อนที่เป็นตัวแทนได้มาก

อีกตัวเลือกหนึ่งคือการหาวงจรที่เล็กที่สุด / น้อยที่สุดที่เป็นตัวแทนของสตริง แต่เป็นที่ทราบกันดีว่ามีความซับซ้อนในการคำนวณสูงมากและสามารถประสบความสำเร็จได้ในสตริงเล็ก ๆ เท่านั้น

โดยทั่วไปยิ่งการประมาณใดเข้ามาใกล้เพื่อคำนวณยิ่งยากขึ้นเท่าไรK(x)

ในความรู้สึกที่ไม่เป็นทางการโดยทั่วไปใด ๆ "ประมาณ" ของนอกจากนี้ยังจะต้องเป็น "วิธีการบีบอัด"K(x)

นอกจากนี้ยังมีวิธีอัลกอริธึมการบีบอัดอื่น ๆ นอกเหนือจาก Lempel-Ziv "การเข้ารหัสแบบรันความยาว" ประเภทวิธีตัวอย่างเช่นพีชคณิตเวกเตอร์และSVDสามารถใช้เป็นอัลกอริทึมการบีบอัดได้ การแปลงฟูริเยร์ยังมักใช้ในการบีบอัดภาพเช่นในมาตรฐาน JPG


1
แน่นอนการบีบอัดจะต้องมี lossless จริงนับเป็นประมาณของ(x) ฉันค่อนข้างแน่ใจว่าการแปลงฟูริเยร์ใน JPG นั้นสูญเสียไป (แต่ฉันไม่ใช่ผู้เชี่ยวชาญ) K(x)
ดี้

จุดที่ดีอย่างไรก็ตามอัลกอริธึมการสูญเสียมักจะมีพารามิเตอร์ที่ปรับได้ซึ่งกำหนด "lossiness" และในทางทฤษฎีสามารถบรรลุ losslessness ด้วย "เงื่อนไข" หรือ "ความถี่" ที่เพียงพอเพื่อที่จะพูดและมันก็ขึ้นอยู่กับตัวอย่างอินพุตเช่นว่า ใน "ลำดับญาติเทียบกับการสุ่ม" ของพวกเขาเห็นผ่าน "เลนส์" ของอัลกอริทึมการบีบอัด ...
vzn

1
@cody และ vzn: ขอบคุณสำหรับคำตอบคุณให้ความคิดที่ดีสำหรับปริญญาเอกของฉันเกี่ยวกับการบีบอัด lossless x lossy :)
woliveirajr

JPEG ใช้ DCT ไม่ใช่ DFT
Evil
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.