กลับไปหน้าบทความ

อ่าน 7 นาที

อัลกอริทึมวิเทอร์บี

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

อัลกอริทึมวิเทอร์บี

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

อัลกอริทึมนี้พบการประยุกต์ใช้อย่างแพร่หลายในการถอดรหัสรหัสคอนโวลูชันที่ใช้ในโทรศัพท์มือถือดิจิทัลCDMAและGSM โมเด็ม แบบหมุนหมายเลข ดาวเทียม การสื่อสารในอวกาศลึก และเครือ ข่าย LAN ไร้สาย 802.11นอกจากนี้ยังใช้กันทั่วไปในการรู้จำเสียงพูดการสังเคราะห์เสียงพูดการแยกเสียงพูด [ 1 ] การ ค้นหาคำหลักภาษาศาสตร์เชิงคำนวณและชีวสารสนเทศตัวอย่างเช่น ในการแปลงเสียงพูดเป็นข้อความ (การรู้จำเสียงพูด) สัญญาณเสียงคือลำดับที่สังเกตได้ และสตริงของข้อความคือ "สาเหตุที่ซ่อนอยู่" ของสัญญาณนั้น อัลกอริทึม Viterbi จะค้นหาสตริงของข้อความที่มีความเป็นไปได้มากที่สุดเมื่อพิจารณาจากสัญญาณ เสียง

ประวัติศาสตร์

อัลกอริทึม Viterbi ได้รับการตั้งชื่อตามAndrew Viterbiผู้เสนออัลกอริทึมนี้ในปี 1967 ในฐานะอัลกอริทึมการถอดรหัสสำหรับรหัสคอนโวลูชันบนลิงก์การสื่อสารดิจิทัลที่มีสัญญาณรบกวน[ 2 ]อย่างไรก็ตาม อัลกอริทึมนี้มีประวัติการคิดค้นหลายครั้งโดยมีการค้นพบอิสระอย่างน้อยเจ็ดครั้ง รวมถึงการค้นพบโดย Viterbi, Needleman และ WunschและWagner และ Fischer [ 3 ] อัลกอริทึมนี้ได้รับการแนะนำในการประมวลผลภาษาธรรมชาติในฐานะวิธีการติดแท็กส่วนของคำพูดตั้งแต่ปี 1987

เส้นทาง Viterbiและอัลกอริทึม Viterbiได้กลายเป็นคำศัพท์มาตรฐานสำหรับการประยุกต์ใช้อัลกอริทึมการเขียนโปรแกรมแบบไดนามิกกับปัญหาการเพิ่มค่าสูงสุดที่เกี่ยวข้องกับความน่าจะเป็น[ 3 ] ตัวอย่างเช่น ในการวิเคราะห์ไวยากรณ์เชิงสถิติ อัลกอริทึมการเขียนโปรแกรมแบบไดนามิกสามารถใช้เพื่อค้นหาการอนุมานแบบไร้บริบทที่น่าจะเป็นไปได้มากที่สุด (การวิเคราะห์) ของสตริง ซึ่งโดยทั่วไปเรียกว่า "การวิเคราะห์ Viterbi" [ 4 ] [ 5 ] [ 6 ]การประยุกต์ใช้อีกอย่างหนึ่งคือการติดตามเป้าหมายโดยจะคำนวณเส้นทางที่กำหนดความน่าจะเป็นสูงสุดให้กับลำดับของการสังเกต[ 7 ]

อัลกอริทึม

เมื่อกำหนดแบบจำลองมาร์คอฟแบบซ่อนเร้นที่มีชุดสถานะซ่อนเร้นชุดการปล่อยที่เป็นไปได้ (การสังเกต) M และลำดับของการสังเกตอัลกอริทึม Viterbi จะค้นหาลำดับของสถานะซ่อนเร้นที่มีความเป็นไปได้มากที่สุดที่สามารถสร้างการสังเกตเหล่านั้นได้ ในแต่ละขั้นตอนเวลา อัลกอริทึมจะแก้ปัญหาย่อยโดย พิจารณา เฉพาะการสังเกตจนถึงเท่านั้น

มีการสร้าง เมทริกซ์สองเมทริกซ์ที่มีขนาด ดังนี้:

  • ประกอบด้วยความน่าจะเป็นสูงสุดที่จะไปอยู่ในสถานะณ การสังเกตจากลำดับสถานะที่เป็นไปได้ทั้งหมดที่นำไปสู่สถานะนั้น
  • ติดตามสถานะก่อนหน้าที่เคยใช้ในลำดับสถานะที่มีความน่าจะเป็นสูงสุดนี้

ให้และเป็นความน่าจะเป็นเริ่มต้นและความน่าจะเป็นการเปลี่ยนผ่านตามลำดับ และให้เป็นความน่าจะเป็นของการสังเกตที่สถานะจากนั้นค่าของจะได้รับจากความสัมพันธ์เวียนเกิด[ 8 ] สูตรสำหรับจะเหมือนกันสำหรับยกเว้นว่าจะถูกแทนที่ด้วยและเส้นทาง Viterbi สามารถพบได้โดยการเลือกค่าสูงสุดของที่ขั้นตอนเวลาสุดท้าย และย้อนกลับตาม

รหัสเทียม

ฟังก์ชัน Viterbi(states, init, trans, emit, obs) รับข้อมูลดังนี้ : states: สถานะที่ซ่อนอยู่ S init: ความน่าจะเป็นเริ่มต้นของแต่ละสถานะ trans: เมทริกซ์การเปลี่ยนสถานะ S × S emit : เมทริกซ์การปล่อย S × M obs: ลำดับของการสังเกต T ครั้ง prob ← เมทริกซ์ศูนย์ T × S ก่อนหน้า ← เมทริกซ์ T × S ว่างเปล่า สำหรับแต่ละรัฐ s ในรัฐต่างๆทำ prob[0][s] = init[s] * emit[s][obs[0]] สำหรับ t = 1 ถึง T - 1 รวมทั้งสองค่าด้วย// t = 0 ได้รับการจัดการไปแล้วสำหรับแต่ละสถานะ s ใน states สำหรับแต่ละสถานะ r ใน states ทำซ้ำ new_prob ← prob[t - 1][r] * trans[r][s] * emit[s][obs[t]] ถ้า new_prob > prob[t][s] แล้ว ความน่าจะเป็น[t][s] ← ความน่าจะเป็นใหม่ ก่อนหน้า ← r เส้นทาง ← อาร์เรย์ว่างที่มีความยาว T เส้นทาง[T - 1] ← สถานะ s ที่มีความน่าจะเป็นสูงสุด[T - 1][s] สำหรับ t = T - 2 ถึง 0 รวมทั้งสองค่าด้วย เส้นทาง[t] ← ก่อนหน้า[t + 1][เส้นทาง[t + 1]] เส้นทาง ส่งคืนสิ้นสุด

ความซับซ้อนเชิงเวลาของอัลกอริทึมคือ. หากทราบว่าการเปลี่ยนสถานะใดมีความน่าจะเป็นไม่เป็นศูนย์ จะสามารถหาขอบเขตที่ดีขึ้นได้โดยการวนซ้ำเฉพาะการเปลี่ยนสถานะที่เชื่อมโยงไปยังในลูปภายใน จากนั้นโดยใช้การวิเคราะห์แบบถัวเฉลี่ยจะสามารถแสดงได้ว่าความซับซ้อนคือโดยที่คือจำนวนขอบในกราฟ นั่นคือจำนวนรายการที่ไม่เป็นศูนย์ในเมทริกซ์การเปลี่ยนสถานะ

ตัวอย่าง

แพทย์ต้องการตรวจสอบว่าผู้ป่วยมีสุขภาพดีหรือมีไข้หรือไม่ ข้อมูลเดียวที่แพทย์สามารถได้รับคือการสอบถามผู้ป่วยว่าพวกเขารู้สึกอย่างไร ผู้ป่วยอาจบอกว่ารู้สึกปกติ เวียนศีรษะ หรือหนาวสั่น

เชื่อกันว่าสภาวะสุขภาพของผู้ป่วยทำงานในลักษณะของห่วงโซ่มาร์คอฟ แบบไม่ต่อเนื่อง มีสองสถานะคือ "สุขภาพดี" และ "มีไข้" แต่แพทย์ไม่สามารถสังเกตเห็นสถานะเหล่านี้ได้โดยตรง เพราะมันถูกซ่อนไว้จากแพทย์ ในแต่ละวัน โอกาสที่ผู้ป่วยจะบอกแพทย์ว่า "ฉันรู้สึกปกติ" "ฉันรู้สึกหนาว" หรือ "ฉันรู้สึกเวียนหัว" นั้นขึ้นอยู่กับสภาวะสุขภาพของผู้ป่วยในวันนั้นเท่านั้น

สภาวะที่สังเกตได้ (ปกติ หนาว วิงเวียน) ร่วมกับ สภาวะ ที่ซ่อนอยู่ (สุขภาพดี มีไข้) ก่อให้เกิดแบบจำลองมาร์คอฟแบบซ่อนเร้น (HMM) จากประสบการณ์ที่ผ่านมา ความน่าจะเป็นของแบบจำลองนี้ได้รับการประมาณไว้ดังนี้:

init = {"สุขภาพดี": 0.6, "มีไข้": 0.4} ทรานส์ = { "สุขภาพดี": {"สุขภาพดี": 0.7, "มีไข้": 0.3} "ไข้": {"ปกติ": 0.4, "ไข้": 0.6} } ปล่อย = { "สุขภาพดี": {"ปกติ": 0.5, "หนาว": 0.4, "เวียนศีรษะ": 0.1} "ไข้": {"ปกติ": 0.1, "หวัด": 0.3, "เวียนศีรษะ": 0.6} } 

ในโค้ดนี้initแสดงถึงความเชื่อของแพทย์เกี่ยวกับโอกาสที่ผู้ป่วยจะมีสุขภาพดีในตอนเริ่มต้น โปรดสังเกตว่าการแจกแจงความน่าจะเป็นที่ใช้ในที่นี้ไม่ใช่การแจกแจงความน่าจะเป็นสมดุล ซึ่งจะเป็นไป{'Healthy': 0.57, 'Fever': 0.43}ตามความน่าจะเป็นของการเปลี่ยนแปลงสถานะ ความน่าจะเป็นของการเปลี่ยนแปลงสถานะtransแสดงถึงการเปลี่ยนแปลงของสภาวะสุขภาพในห่วงโซ่มาร์คอฟพื้นฐาน ในตัวอย่างนี้ ผู้ป่วยที่มีสุขภาพดีในวันนี้มีโอกาสเพียง 30% ที่จะมีไข้ในวันพรุ่งนี้ ความน่าจะเป็นของการปล่อยemitแสดงถึงโอกาสที่การสังเกตแต่ละแบบ (ปกติ เป็นหวัด หรือเวียนศีรษะ) จะเกิดขึ้น โดยพิจารณาจากสภาวะพื้นฐาน (สุขภาพดีหรือมีไข้) ผู้ป่วยที่มีสุขภาพดีมีโอกาส 50% ที่จะรู้สึกปกติ ส่วนผู้ป่วยที่มีไข้มีโอกาส 60% ที่จะรู้สึกเวียนศีรษะ

การแสดงผลเชิงกราฟิกของ HMM ที่กำหนดให้

ผู้ป่วยรายหนึ่งมาพบแพทย์ติดต่อกันสามวัน โดยรายงานว่ารู้สึกปกติในวันแรก รู้สึกหนาวในวันที่สอง และรู้สึกเวียนศีรษะในวันที่สาม

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

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

ความน่าจะเป็นที่เหลือสรุปไว้ในตารางต่อไปนี้:

วัน123
การสังเกต ปกติเย็นวิงเวียน
สุขภาพดี 0.30.0840.00588
ไข้ 0.040.0270.01512

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

การทำงานของอัลกอริทึมของวิเทอร์บีสามารถมองเห็นได้ด้วยแผนภาพแบบโครงตาข่ายเส้นทางวิเทอร์บีโดยพื้นฐานแล้วคือเส้นทางที่สั้นที่สุดผ่านโครงตาข่ายนี้

ส่วนขยาย

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

ด้วยอัลกอริทึมที่เรียกว่าการถอดรหัส Viterbi แบบวนซ้ำเราสามารถค้นหาลำดับย่อยของการสังเกตที่ตรงกับแบบจำลอง Markov ที่ซ่อนอยู่ได้ดีที่สุด (โดยเฉลี่ย) อัลกอริทึมนี้เสนอโดย Qi Wang และคณะเพื่อจัดการกับรหัสเทอร์โบ [ 9 ] การถอดรหัส Viterbi แบบวนซ้ำทำงานโดยการเรียกใช้อัลกอริทึม Viterbi ที่แก้ไขแล้วซ้ำ ๆ โดยประเมินคะแนนสำหรับตัวเติมใหม่จนกว่าจะบรรจบกัน

มีการเสนออัลกอริทึมทางเลือกอีกแบบหนึ่งคืออัลกอริทึม Lazy Viterbi [ 10 ]สำหรับการใช้งานที่น่าสนใจในทางปฏิบัติหลายอย่าง ภายใต้เงื่อนไขเสียงรบกวนที่เหมาะสม ตัวถอดรหัสแบบ Lazy (โดยใช้อัลกอริทึม Lazy Viterbi) จะเร็วกว่าตัวถอดรหัส Viterbi ดั้งเดิม (โดยใช้อัลกอริทึม Viterbi) มาก ในขณะที่อัลกอริทึม Viterbi ดั้งเดิมคำนวณทุกโหนดในโครงสร้างผลลัพธ์ที่เป็นไปได้ อัลกอริทึม Lazy Viterbi จะรักษารายการโหนดที่มีลำดับความสำคัญไว้เพื่อประเมินตามลำดับ และจำนวนการคำนวณที่ต้องการมักจะน้อยกว่า (และไม่เคยมากกว่า) อัลกอริทึม Viterbi ทั่วไปสำหรับผลลัพธ์เดียวกัน อย่างไรก็ตาม การทำให้เป็นแบบขนานในฮาร์ดแวร์นั้นไม่ใช่เรื่องง่ายนัก

อัลกอริทึม Viterbi เอาต์พุตแบบอ่อน

อัลกอริทึม Viterbi แบบเอาต์พุตอ่อน ( SOVA ) เป็นรูปแบบหนึ่งของอัลกอริทึม Viterbi แบบคลาสสิก

SOVA แตกต่างจากอัลกอริธึม Viterbi แบบดั้งเดิมตรงที่ใช้เมตริกเส้นทางที่ได้รับการปรับปรุง ซึ่งคำนึงถึงความน่าจะเป็นล่วงหน้าของสัญลักษณ์อินพุต และสร้างเอาต์พุตแบบอ่อน ที่บ่งชี้ ความน่าเชื่อถือของการตัดสินใจ

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

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

ดูเพิ่มเติม

เอกสารอ้างอิงทั่วไป

  • Viterbi AJ (เมษายน 1967). "ขอบเขตข้อผิดพลาดสำหรับรหัสคอนโวลูชันและอัลกอริทึมการถอดรหัสที่เหมาะสมที่สุดในเชิงอะซิมโทติก" IEEE Transactions on Information Theory . 13 (2): 260– 269. doi : 10.1109/TIT.1967.1054010 .(หมายเหตุ: อัลกอริทึมการถอดรหัส Viterbi อธิบายไว้ในส่วนที่ IV) ต้องสมัครสมาชิกจึงจะเข้าถึงได้
  • Feldman J, Abou-Faycal I, Frigo M (2002). "ตัวถอดรหัสความน่าจะเป็นสูงสุดที่รวดเร็วสำหรับรหัสคอนโวลูชัน". รายงานการประชุม IEEE ครั้งที่ 56 ด้านเทคโนโลยียานยนต์ เล่มที่ 1 หน้า  371–375 . CiteSeerX  10.1.1.114.1314 . doi : 10.1109/VETECF.2002.1040367 . ISBN 978-0-7803-7467-6S2CID 9783963 ​
  • Forney GD (มีนาคม 1973). "อัลกอริทึม Viterbi". Proceedings of the IEEE . 61 (3): 268– 278. doi : 10.1109/PROC.1973.9030 .ต้องสมัครสมาชิกก่อนจึงจะเข้าถึงได้
  • Press, WH; Teukolsky, SA; Vetterling, WT; Flannery, BP (2007). "ส่วนที่ 16.2 การถอดรหัสแบบ Viterbi" . สูตรเชิงตัวเลข: ศิลปะแห่งการคำนวณทางวิทยาศาสตร์ (ฉบับที่ 3). นิวยอร์ก: สำนักพิมพ์มหาวิทยาลัยเคมบริดจ์. ISBN 978-0-521-88068-8เก็บถาวรจากต้นฉบับเมื่อวันที่ 11 สิงหาคม 2554 เรียกดูเมื่อวันที่ 17 สิงหาคม 2554
  • Rabiner LR (กุมภาพันธ์ 1989). "บทช่วยสอนเกี่ยวกับแบบจำลองมาร์คอฟที่ซ่อนอยู่และการประยุกต์ใช้ที่เลือกสรรในการรู้จำเสียงพูด" Proceedings of the IEEE . 77 (2): 257– 286. CiteSeerX  10.1.1.381.3454 . doi : 10.1109/5.18626 . S2CID  13618539 .(อธิบายอัลกอริธึมส่งต่อและอัลกอริธึม Viterbi สำหรับ HMM)
  • Shinghal, R. และGodfried T. Toussaint , "การทดลองในการรู้จำข้อความด้วยอัลกอริทึม Viterbi ที่ได้รับการดัดแปลง" IEEE Transactions on Pattern Analysis and Machine Intelligence , Vol. PAMI-l, เมษายน 1979, หน้า 184–193
  • Shinghal, R. และGodfried T. Toussaint , "ความไวของอัลกอริทึม Viterbi ที่ได้รับการดัดแปลงต่อสถิติของแหล่งที่มา," IEEE Transactions on Pattern Analysis and Machine Intelligence , เล่ม PAMI-2, มีนาคม 1980, หน้า 181–185
  • การใช้งานใน Java, F#, Clojure, C# บนวิกิตำรา
  • บทแนะนำเกี่ยวกับการเข้ารหัสแบบคอนโวลูชันด้วยการถอดรหัสแบบวิตเทอร์บี โดย ชิป เฟลมมิง
  • คู่มือสำหรับชุดเครื่องมือแบบจำลองมาร์คอฟที่ซ่อนอยู่ (Hidden Markov Model) (เขียนด้วยภาษาซี) ซึ่งประกอบด้วยคำอธิบายเกี่ยวกับอัลกอริทึม Viterbi
  • อัลกอริทึม Viterbiโดย ดร. Andrew J. Viterbi (scholarpedia.org)

การนำไปใช้

  • Mathematicaมีการใช้งานฟังก์ชันนี้เป็นส่วนหนึ่งของการสนับสนุนกระบวนการสุ่ม (stochastic processes)
  • เฟรมเวิร์กการประมวลผลสัญญาณ Susaมีการใช้งาน C++ สำหรับ รหัส แก้ไขข้อผิดพลาดล่วงหน้าและการปรับสมดุลช่องสัญญาณที่นี่
  • ซี++
  • Java ถูกเก็บถาวรเมื่อวันที่ 4 พฤษภาคม 2014 ที่Wayback Machine
  • Java 8
  • จูเลีย (HMMBase.jl)
  • เพิร์ล
  • Prolog ถูกเก็บถาวรเมื่อวันที่ 2 พฤษภาคม 2012 ที่Wayback Machine
  • ฮัสเคลล์
  • ไป
  • SFIHMMมีโค้ดสำหรับการถอดรหัสแบบ Viterbi
ดึงข้อมูลมาจาก " https://en.wikipedia.org/w/index.php?title=Viterbi_algorithm&oldid=1352542134#Soft_output_Viterbi_algorithm "

สรุปเนื้อหา

ข้อมูลสำคัญจากบทความ

ข้อมูลสำคัญเกี่ยวกับ อัลกอริทึมวิเทอร์บี

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

ประวัติศาสตร์

อัลกอริทึม Viterbi ได้รับการตั้งชื่อตาม Andrew Viterbi ผู้เสนออัลกอริทึมนี้ในปี 1967 ในฐานะอัลกอริทึมการถอดรหัสสำหรับ รหัสคอนโวลูชัน บนลิงก์การสื่อสารดิจิทัลที่มีสัญญาณรบกวน [ 2 ] อย่างไรก็ตาม อัลกอริทึมนี้มีประวัติการ คิดค้นหลายครั้ง...

อัลกอริทึม

เมื่อกำหนดแบบจำลองมาร์คอฟแบบซ่อนเร้นที่มีชุดสถานะซ่อนเร้นชุดการปล่อยที่เป็นไปได้ (การสังเกต) M และลำดับของการสังเกตอัลกอริทึม Viterbi จะค้นหาลำดับของสถานะซ่อนเร้นที่มีความเป็นไปได้มากที่สุดที่สามารถสร้างการสังเกตเหล่านั้นได้ ในแต่ละขั้นตอนเวลา...

รหัสเทียม

ความซับซ้อนเชิงเวลาของอัลกอริทึมคือ. หากทราบว่าการเปลี่ยนสถานะใดมีความน่าจะเป็นไม่เป็นศูนย์ จะสามารถหาขอบเขตที่ดีขึ้นได้โดยการวนซ้ำเฉพาะการเปลี่ยนสถานะที่เชื่อมโยงไปยังในลูปภายใน จากนั้นโดยใช้ การวิเคราะห์แบบถัวเฉลี่ย...