Mengenal Hidden Markov Model (HMM): Bagaimana Komputer Memperkirakan Keadaan yang Tidak Terlihat?

Bagaimana komputer memperkirakan kondisi internal sebuah motor listrik hanya dari data sensor suhu? Artikel ketiga dalam seri Probabilitas dan Proses Stokastik ini memperkenalkan Hidden Markov Model (HMM), mulai dari hidden state, observation, transition probability, emission probability, Teorema…

Pada pembahasan sebelumnya, kita telah mempelajari Rantai Markov sebagai model matematika untuk menghitung peluang perpindahan suatu sistem dari satu keadaan menuju keadaan lainnya.

Kita menggunakan contoh cuaca cerah dan hujan, menyusunnya dalam matriks transisi, kemudian menghitung peluang keadaan berikutnya menggunakan Python.

Namun, bagaimana jika keadaan yang ingin kita ketahui justru tidak dapat diamati secara langsung?

Misalnya, kita sedang mengoperasikan sebuah motor listrik. Kita dapat mengukur suhu permukaannya menggunakan sensor. Kita juga dapat mengukur arus listrik dan getarannya.

Namun, hasil pengukuran tersebut belum tentu menjelaskan kondisi internal motor secara langsung. Suhu yang tinggi dapat disebabkan oleh beban kerja, kondisi lingkungan, sistem pendinginan, atau gangguan pada komponen motor.

Dengan kata lain, kita memiliki informasi yang dapat diamati, tetapi keadaan sebenarnya yang ingin diketahui tidak selalu terlihat.

Persoalan semacam ini membawa kita kepada Hidden Markov Model (HMM), yaitu model probabilistik yang digunakan untuk mempelajari rangkaian keadaan tersembunyi berdasarkan hasil pengamatan yang tersedia.

1. Apa yang Dimaksud dengan Keadaan Tersembunyi?

Dalam Rantai Markov yang telah kita pelajari, keadaan sistem dianggap dapat diketahui secara langsung. Jika hari ini cerah, kita mengetahui bahwa sistem berada pada keadaan cerah.

Dalam Hidden Markov Model, kita tidak mengamati keadaan sistem secara langsung. Yang tersedia adalah hasil pengamatan yang dipengaruhi oleh keadaan tersebut.

Untuk mempermudah pembahasan, bayangkan sebuah motor listrik yang memiliki dua kategori kondisi internal:

  • Normal: motor beroperasi dalam kondisi yang kita kategorikan sehat.
  • Panas: motor berada dalam kondisi termal yang memerlukan perhatian.

Kita menganggap kedua kategori tersebut sebagai hidden state, yaitu keadaan tersembunyi yang ingin diperkirakan.

Sementara itu, sebuah sensor suhu memberikan dua kategori pengamatan:

  • Rendah: pembacaan suhu berada di bawah batas yang ditentukan.
  • Tinggi: pembacaan suhu berada pada atau di atas batas tersebut.

Perhatikan perbedaannya. Kondisi internal motor merupakan keadaan yang ingin kita ketahui, sedangkan kategori suhu merupakan informasi yang kita ukur.

Dalam model pembelajaran ini, pembacaan suhu tinggi tidak otomatis berarti motor berada dalam hidden state Panas. Sebaliknya, pembacaan suhu rendah juga tidak menjamin motor berada dalam hidden state Normal.

Hubungan antara keduanya dinyatakan menggunakan probabilitas.

2. Dua Jenis Probabilitas dalam Hidden Markov Model

Sebelum menyusun program, kita perlu memahami dua jenis probabilitas yang menjadi bagian penting dari HMM.

A. Transition Probability

Transition probability atau probabilitas transisi menjelaskan peluang perubahan keadaan tersembunyi dari satu waktu ke waktu berikutnya.

Misalnya, kita menggunakan matriks berikut:

                 Berikutnya
                Normal  Panas

Saat Normal      0.9    0.1
Saat Panas       0.3    0.7

Matriks tersebut dapat ditulis:

A = [
    [0.9, 0.1],
    [0.3, 0.7]
]

Artinya, apabila motor saat ini berada dalam kondisi Normal, peluang tetap Normal pada pengamatan berikutnya adalah 90%, sedangkan peluang berpindah ke Panas adalah 10%.

Apabila motor berada dalam kondisi Panas, peluang tetap Panas pada pengamatan berikutnya adalah 70%, sedangkan peluang kembali Normal adalah 30%.

Nilai-nilai tersebut adalah asumsi untuk pembelajaran, bukan karakteristik universal motor listrik.

B. Emission Probability

Jenis probabilitas kedua adalah emission probability atau probabilitas emisi.

Probabilitas ini menjelaskan peluang munculnya suatu hasil pengamatan apabila sistem berada pada keadaan tersembunyi tertentu.

Misalnya:

Kondisi Internal Sensor Rendah Sensor Tinggi
Normal 0,80 0,20
Panas 0,25 0,75

Dalam bentuk matriks:

B = [
    [0.80, 0.20],
    [0.25, 0.75]
]

Artinya, jika motor sebenarnya Normal, peluang sensor memberikan kategori Rendah adalah 80%, sedangkan peluang sensor memberikan kategori Tinggi adalah 20%.

Jika motor sebenarnya Panas, peluang sensor memberikan kategori Tinggi adalah 75%, sedangkan peluang sensor memberikan kategori Rendah adalah 25%.

Mengapa hasil pengamatan tidak selalu cocok dengan keadaan internal?

Karena pembacaan sensor dapat dipengaruhi banyak faktor, termasuk variasi pengukuran, kondisi lingkungan, posisi sensor, dan keterbatasan model yang digunakan.

Probabilitas emisi memungkinkan kita menyatakan ketidakpastian hubungan antara keadaan internal dan hasil pengamatan.

3. Perbedaan Rantai Markov dan Hidden Markov Model

Perbedaan mendasar kedua model tersebut dapat dirangkum sebagai berikut.

Aspek Rantai Markov Hidden Markov Model
Keadaan sistem Dianggap dapat diamati Tidak diamati secara langsung
Probabilitas transisi Ada Ada
Probabilitas emisi Tidak diperlukan dalam model dasar Diperlukan
Informasi pengamatan Keadaan itu sendiri Data yang dipengaruhi keadaan tersembunyi
Contoh Perubahan cuaca yang diketahui Perkiraan kondisi motor dari data sensor

Pada HMM standar, kita menggunakan dua asumsi penting.

Pertama, keadaan tersembunyi berikutnya hanya bergantung secara probabilistik pada keadaan tersembunyi sekarang, apabila keadaan sekarang sudah diketahui.

Kedua, hasil pengamatan pada suatu waktu bergantung pada keadaan tersembunyi pada waktu tersebut dan dianggap independen dari pengamatan lainnya setelah keadaan tersembunyi diketahui.

Asumsi-asumsi inilah yang memungkinkan persoalan kompleks diselesaikan menggunakan perhitungan probabilitas secara sistematis.

4. Mengapa Kita Membutuhkan Probabilitas Awal?

Selain matriks transisi dan matriks emisi, HMM memerlukan informasi mengenai kemungkinan keadaan pada awal pengamatan.

Informasi tersebut disebut initial state probability atau distribusi probabilitas awal.

Misalnya, sebelum membaca sensor, kita memperkirakan:

P(Normal) = 0.8
P(Panas)  = 0.2

Dalam bentuk vektor:

pi = [0.8, 0.2]

Dengan demikian, model HMM sederhana kita mempunyai tiga parameter utama:

  • pi: distribusi peluang keadaan awal.
  • A: matriks probabilitas transisi keadaan tersembunyi.
  • B: matriks probabilitas emisi hasil pengamatan.

Ketiga komponen tersebut sering dinyatakan sebagai parameter model lambda = (A, B, pi).

5. Menghitung Keadaan Motor dari Satu Pembacaan Sensor

Anggaplah sensor menunjukkan kategori Tinggi.

Pertanyaannya: berapa peluang motor berada dalam kondisi Panas setelah kita menerima pengamatan tersebut?

Sebelum melihat hasil sensor, peluang awal yang kita gunakan adalah:

P(Normal) = 0.8
P(Panas)  = 0.2

Probabilitas sensor menunjukkan Tinggi pada masing-masing kondisi adalah:

P(Tinggi | Normal) = 0.20
P(Tinggi | Panas)  = 0.75

Kita mulai dengan menghitung probabilitas gabungan keadaan dan pengamatan:

P(Normal dan Tinggi)
= 0.8 x 0.20
= 0.16

P(Panas dan Tinggi)
= 0.2 x 0.75
= 0.15

Jumlah probabilitas memperoleh pengamatan Tinggi adalah:

P(Tinggi)
= 0.16 + 0.15
= 0.31

Dengan Teorema Bayes, kita dapat memperbarui perkiraan kondisi motor:

P(Panas | Tinggi)
= 0.15 / 0.31
= 0.48387

Jadi, setelah sensor menunjukkan Tinggi, peluang motor berada pada keadaan Panas menjadi sekitar 48,39%.

Sementara itu:

P(Normal | Tinggi)
= 0.16 / 0.31
= 0.51613

Peluang Normal menjadi sekitar 51,61%.

Hasil tersebut mungkin tampak mengejutkan. Sensor menunjukkan suhu Tinggi, tetapi peluang Normal masih sedikit lebih besar daripada peluang Panas.

Hal ini terjadi karena distribusi probabilitas awal juga memengaruhi hasil perhitungan.

Pengamatan baru memang meningkatkan peluang Panas dari 20% menjadi sekitar 48,39%, tetapi tidak otomatis menjadikannya keadaan yang paling mungkin.

Inilah salah satu gagasan penting dalam inferensi probabilistik: informasi baru digunakan untuk memperbarui keyakinan yang telah dimiliki sebelumnya.

6. Bagaimana Jika Sensor Dibaca Berulang Kali?

Sekarang persoalannya menjadi lebih menarik.

Anggaplah kita memiliki tiga hasil pembacaan sensor secara berurutan:

Waktu 1 : Tinggi
Waktu 2 : Tinggi
Waktu 3 : Rendah

Apakah kita harus menghitung setiap pembacaan secara terpisah?

Tidak. Kita perlu mempertimbangkan probabilitas perubahan keadaan internal motor dari waktu ke waktu.

Sebuah pembacaan Tinggi pada waktu kedua harus dianalisis dengan mempertimbangkan kemungkinan motor berada pada kondisi Normal atau Panas pada waktu sebelumnya.

Dengan demikian, setiap pengamatan baru tidak hanya dipengaruhi oleh probabilitas emisi, tetapi juga oleh probabilitas transisi.

Persoalan tersebut dapat diselesaikan menggunakan Forward Algorithm.

7. Mengenal Forward Algorithm

Forward Algorithm menghitung probabilitas suatu rangkaian pengamatan berdasarkan model HMM.

Selain itu, nilai perantara dalam algoritma ini dapat digunakan untuk menghitung distribusi peluang keadaan tersembunyi pada waktu tertentu berdasarkan pengamatan yang tersedia hingga waktu tersebut.

Kita mulai dari pembacaan pertama, yaitu Tinggi.

Normal = 0.8 x 0.20 = 0.16

Panas = 0.2 x 0.75 = 0.15

Untuk pembacaan kedua yang juga Tinggi, nilai Forward untuk keadaan Normal adalah:

Normal =
(0.16 x 0.9 + 0.15 x 0.3)
x 0.20

= (0.144 + 0.045) x 0.20

= 0.0378

Sementara nilai Forward untuk keadaan Panas adalah:

Panas =
(0.16 x 0.1 + 0.15 x 0.7)
x 0.75

= (0.016 + 0.105) x 0.75

= 0.09075

Jumlah kedua nilai tersebut adalah:

0.0378 + 0.09075 = 0.12855

Angka 0,12855 adalah probabilitas memperoleh dua pengamatan Tinggi secara berurutan berdasarkan model dan distribusi awal yang telah kita tetapkan.

Jika ingin memperkirakan keadaan motor pada waktu kedua, kita dapat menormalisasi nilai Forward tersebut.

P(Panas pada waktu 2
  | Tinggi, Tinggi)

= 0.09075 / 0.12855

= 0.70595

Artinya, setelah dua pengamatan Tinggi berturut-turut, peluang motor berada dalam kondisi Panas pada waktu kedua menjadi sekitar 70,59%.

Perhatikan bahwa kita tidak sekadar menghitung rata-rata suhu. Kita sedang menggabungkan probabilitas perubahan kondisi motor dengan probabilitas munculnya hasil pengamatan.

Secara umum, langkah rekursif Forward Algorithm dapat dituliskan:

alpha[t][j] =
    jumlah untuk semua i dari:
    alpha[t-1][i] x A[i][j]
    kemudian dikalikan B[j][observasi_t]

Di sini alpha[t][j] adalah probabilitas gabungan seluruh pengamatan hingga waktu t dan keadaan tersembunyi j pada waktu tersebut.

Untuk rangkaian pengamatan yang sangat panjang, perkalian berulang dapat menghasilkan angka yang amat kecil. Implementasi HMM yang lebih lanjut biasanya menggunakan normalisasi bertahap atau perhitungan logaritmik agar hasil numeriknya stabil.

8. Praktikum Python: Membuat HMM Tanpa Pustaka Tambahan

Sekarang kita akan menerapkan perhitungan sebelumnya menggunakan Python.

Tujuan praktikum ini bukan sekadar menghasilkan angka, melainkan memahami bagaimana setiap nilai probabilitas diperoleh.

Program berikut sengaja menggunakan struktur data dictionary dan perulangan dasar agar alur perhitungannya dapat dipelajari.

# Hidden Markov Model sederhana
# Kondisi internal motor dan sensor suhu

states = ["Normal", "Panas"]

observations = [
    "Tinggi",
    "Tinggi",
    "Rendah"
]

# Distribusi probabilitas awal
initial = {
    "Normal": 0.8,
    "Panas": 0.2
}

# Probabilitas transisi
transition = {
    "Normal": {
        "Normal": 0.9,
        "Panas": 0.1
    },
    "Panas": {
        "Normal": 0.3,
        "Panas": 0.7
    }
}

# Probabilitas emisi
emission = {
    "Normal": {
        "Rendah": 0.80,
        "Tinggi": 0.20
    },
    "Panas": {
        "Rendah": 0.25,
        "Tinggi": 0.75
    }
}

# Inisialisasi Forward
forward = {}

first = observations[0]

for state in states:
    forward[state] = (
        initial[state]
        * emission[state][first]
    )

def tampilkan(waktu, observasi, nilai):
    total = sum(nilai.values())

    print(
        f"Waktu {waktu}, "
        f"Sensor: {observasi}"
    )

    for state in states:
        probabilitas = nilai[state] / total

        print(
            f"  P({state}) = "
            f"{probabilitas:.4f}"
        )

    print()

tampilkan(1, first, forward)

# Mengolah pengamatan selanjutnya
for t in range(1, len(observations)):

    observation = observations[t]

    next_forward = {}

    for current_state in states:

        total = 0.0

        for previous_state in states:

            total += (
                forward[previous_state]
                * transition[previous_state][current_state]
            )

        next_forward[current_state] = (
            total
            * emission[current_state][observation]
        )

    forward = next_forward

    tampilkan(
        t + 1,
        observation,
        forward
    )

# Probabilitas seluruh rangkaian pengamatan
likelihood = sum(forward.values())

print(
    "Peluang rangkaian pengamatan:",
    f"{likelihood:.8f}"
)

Program tersebut menghasilkan distribusi peluang keadaan tersembunyi setelah setiap hasil pengamatan diterima.

Hasil yang diharapkan, dengan pembulatan empat angka desimal, adalah:

Waktu 1, Sensor: Tinggi
  P(Normal) = 0.5161
  P(Panas) = 0.4839

Waktu 2, Sensor: Tinggi
  P(Normal) = 0.2940
  P(Panas) = 0.7060

Waktu 3, Sensor: Rendah
  P(Normal) = 0.7444
  P(Panas) = 0.2556

Peluang rangkaian pengamatan: 0.06582225

Angka pada baris terakhir adalah probabilitas memperoleh rangkaian pengamatan Tinggi, Tinggi, Rendah menurut model tersebut. Angka ini bukan probabilitas bahwa motor berada dalam keadaan Panas.

Perhatikan bagaimana perkiraan kondisi motor berubah ketika informasi baru masuk.

Setelah dua kali membaca suhu Tinggi, peluang Panas meningkat. Ketika pembacaan ketiga menunjukkan Rendah, peluang Normal kembali meningkat.

Program tersebut memperlihatkan mekanisme yang menjadi dasar banyak metode estimasi keadaan dalam sistem probabilistik.

9. Mengapa Hasil Sensor Tidak Boleh Langsung Dianggap sebagai Diagnosis?

Dalam praktik elektronika dan IoT, terdapat perbedaan penting antara pembacaan sensor dan kesimpulan mengenai kondisi sebuah perangkat.

Sensor suhu mengukur besaran fisis tertentu pada lokasi pengukuran. Sensor tidak secara langsung mengukur seluruh kondisi internal motor.

Begitu pula sensor arus. Kenaikan arus dapat berkaitan dengan peningkatan beban, perubahan kondisi operasi, atau kemungkinan adanya gangguan.

Untuk menyusun model yang dapat dipertanggungjawabkan, kita perlu mengetahui karakteristik perangkat, ketelitian sensor, frekuensi pengambilan sampel, serta kondisi ketika data dikumpulkan.

Dalam contoh kita, kategori Rendah dan Tinggi sengaja digunakan untuk menyederhanakan pembahasan.

Pada penerapan nyata, batas suhu harus ditentukan berdasarkan spesifikasi motor, kondisi lingkungan, dan tujuan pemantauan. Nilai probabilitas juga sebaiknya diperkirakan dari data pengamatan atau hasil pengujian yang relevan.

Dengan demikian, HMM tidak secara ajaib mengetahui apakah motor rusak. Model menghasilkan perkiraan berdasarkan asumsi dan parameter yang diberikan kepadanya.

Keandalan hasilnya sangat bergantung pada kesesuaian model terhadap sistem yang sebenarnya.

10. Menghubungkan HMM dengan ESP32 dan Sensor Suhu

Prinsip perhitungan tadi dapat dikembangkan menjadi sebuah praktikum IoT.

Misalnya, kita menggunakan ESP32 untuk membaca sensor suhu secara berkala. Data tersebut kemudian dikirim ke komputer atau server untuk diolah menggunakan Python.

Alur sistemnya dapat digambarkan sebagai berikut:

Motor Listrik
      |
      v
Sensor Suhu
      |
      v
ESP32
      |
      v
Data Pengamatan Berkala
      |
      v
Program Python
      |
      v
Hidden Markov Model
      |
      v
Estimasi Kondisi Internal
      |
      v
Visualisasi / Peringatan

Dalam eksperimen sederhana, kita dapat memulai dengan membaca suhu lingkungan atau sebuah benda yang aman dipanaskan pada suhu rendah sebelum mencoba sistem motor listrik.

Pengujian dengan motor sesungguhnya membutuhkan perhatian terhadap tegangan kerja, arus, karakteristik beban, perlindungan kelistrikan, dan keselamatan pengukuran.

Kita juga perlu menentukan apakah pengamatan dilakukan setiap detik, setiap menit, atau pada interval lain. Interval pengamatan merupakan bagian dari definisi model, karena probabilitas transisi berkaitan dengan jarak waktu antar-pengamatan.

Matriks transisi untuk pengukuran setiap satu detik tidak dapat begitu saja dianggap sama dengan matriks transisi untuk pengukuran setiap sepuluh menit.

11. Bagaimana Jika Kita Menggunakan Lebih Banyak Sensor?

Model yang baru kita buat hanya menggunakan satu hasil pengamatan, yaitu kategori suhu.

Namun, sebuah motor listrik dapat menghasilkan berbagai jenis data yang relevan:

  • Suhu permukaan motor.
  • Arus listrik yang dikonsumsi.
  • Getaran pada rumah motor.
  • Kecepatan putaran.
  • Suara atau karakteristik akustik.

Dengan lebih banyak pengamatan, kita berpotensi memperoleh informasi yang lebih kaya mengenai keadaan sistem.

Namun, menambahkan sensor tidak selalu berarti model otomatis menjadi lebih akurat.

Kita harus memperhatikan keterkaitan antar-pengukuran, kualitas data, kesalahan sensor, serta kemungkinan bertambahnya jumlah parameter yang perlu diperkirakan.

Untuk tahap pengenalan, HMM dengan dua keadaan tersembunyi dan dua kategori pengamatan sudah cukup untuk memahami prinsip matematisnya.

Setelah itu, model dapat dikembangkan untuk observasi gabungan atau menggunakan distribusi emisi yang bekerja pada nilai pengukuran kontinu, bukan hanya kategori Rendah dan Tinggi.

12. Apakah HMM Bisa Mencari Urutan Keadaan Tersembunyi?

Sejauh ini, kita menghitung probabilitas pengamatan serta peluang keadaan tersembunyi pada setiap waktu berdasarkan informasi yang sudah diterima.

Namun, ada pertanyaan lain yang tidak kalah penting.

Jika kita mempunyai rangkaian pembacaan sensor selama satu jam, dapatkah komputer memperkirakan urutan kondisi internal motor yang paling mungkin sepanjang periode tersebut?

Misalnya:

Hasil sensor:
Tinggi → Tinggi → Rendah → Tinggi

Perkiraan kondisi:
   ?   →   ?    →   ?    →   ?

Persoalan tersebut berbeda dari sekadar memilih keadaan dengan probabilitas terbesar pada setiap waktu.

Kita perlu mencari satu urutan keadaan tersembunyi yang memiliki probabilitas gabungan terbesar untuk seluruh rangkaian pengamatan.

Salah satu algoritma yang digunakan untuk menyelesaikan persoalan tersebut adalah Algoritma Viterbi.

Algoritma tersebut tidak menjumlahkan seluruh kemungkinan jalur seperti pada perhitungan Forward. Sebaliknya, Viterbi mempertahankan jalur dengan nilai probabilitas terbesar yang dapat mencapai setiap keadaan pada langkah tertentu.

Pendekatan ini merupakan contoh penerapan dynamic programming, yaitu teknik menyelesaikan persoalan kompleks dengan menyimpan hasil perhitungan subpersoalan agar tidak perlu mengulang seluruh kemungkinan dari awal.

Pembahasan Algoritma Viterbi akan menjadi materi lanjutan yang menarik, karena kita dapat mempelajari secara langsung hubungan antara probabilitas, struktur data, algoritma, dan efisiensi komputasi.

13. Latihan dan Eksperimen

Untuk memperdalam pemahaman, cobalah beberapa eksperimen berikut.

  1. Ubah distribusi awal menjadi Normal 50% dan Panas 50%, kemudian bandingkan hasilnya.
  2. Ubah probabilitas emisi sensor agar pembacaan Tinggi lebih sering muncul ketika motor Panas.
  3. Jalankan program dengan urutan pengamatan Rendah, Rendah, Tinggi.
  4. Tambahkan lebih banyak data pengamatan dan periksa perubahan distribusi peluang.
  5. Buat tiga keadaan tersembunyi: Normal, Panas, dan Gangguan.
  6. Bandingkan hasil model dengan data pengujian yang kondisi internalnya telah diketahui melalui metode pemeriksaan lain.

Ketika melakukan eksperimen, perhatikan bahwa mengubah nilai probabilitas berarti mengubah asumsi tentang perilaku sistem.

Nilai yang tampak masuk akal belum tentu mencerminkan kondisi sebenarnya. Dalam penelitian atau pengembangan perangkat, parameter tersebut perlu diperoleh dan diuji menggunakan data yang sesuai.

14. Penutup

Hidden Markov Model menunjukkan bahwa komputer dapat menggunakan informasi yang tidak sempurna untuk memperkirakan keadaan suatu sistem yang tidak dapat diamati secara langsung.

Dalam pembahasan ini, kita telah mempertemukan beberapa konsep penting: Rantai Markov untuk memodelkan perpindahan keadaan, probabilitas emisi untuk menjelaskan hubungan antara keadaan tersembunyi dan hasil pengamatan, Teorema Bayes untuk memperbarui perkiraan, serta Forward Algorithm untuk mengolah rangkaian pengamatan.

Contoh motor listrik dan sensor suhu memperlihatkan bahwa matematika probabilitas memiliki hubungan yang nyata dengan persoalan elektronika, IoT, dan komputasi.

Namun, nilai penting dari pembelajaran ini bukan sekadar kemampuan menjalankan program Python. Kita perlu memahami apa yang diwakili oleh setiap probabilitas, bagaimana parameter diperoleh, mengapa suatu asumsi diperlukan, dan bagaimana hasil model diuji terhadap keadaan sebenarnya.

Pada seri berikutnya, kita akan mempelajari Algoritma Viterbi secara lebih mendalam, termasuk bagaimana komputer mencari urutan keadaan tersembunyi yang paling mungkin dari serangkaian pengamatan sensor.

Referensi

  1. Rabiner, L. R. (1989). A Tutorial on Hidden Markov Models and Selected Applications in Speech Recognition. Proceedings of the IEEE, 77(2), 257–286. DOI: 10.1109/5.18626.
  2. Hidden Markov Model: Tutorial. Dokumentasi Hidden Markov. Baca dokumentasi.