Hidden Markov Model pada Python (Part 1)


Pagi ini kita akan  mengulik ... 😙
Ups jangan dikira kita akan mengulik mengenai sepatu lokal yang lagi trending topik di negara +62 😅, sampai - sampai para peminat rela mengantri untuk mendapatkannya, walau tidak sedikit yang kecewa karena stok habis. Tapi itu tak apa selagi masih cinta produk indonesia .

Pada kesempatan kali ini kita akan mengulik tentang Hidden Markov Model, Hidden Markov model adalah salah satu algoritma  untuk mengetahui kejadian yang akan datang dengan membandingkan kondisi sekarang.  Kita akan mencoba Hidden Markov Model pada python, dengan permisalan seekor kucing gemuk, suka makan dan pemalas.  Dengan kondisi seperti diatas kita dapat mengatur probabilitas kondisi awal 35%, 35% dan 30%. Probabilitas awal kita tetapkan sebagai probabilitas pasti sehingga jumlahnya menjadi 1

gemuk : 35 %
suka makan : 35%
pemalas : 30%

total probabilitas : 1

Mari kita buat probabilitas dengan output seperti diatas dengan python, jangan lupa . untuk menginstall dan importkan library pandas dan numpy  python3.

import pandas as pd
import numpy as np

selanjutkan kita buat codingan untuk menghitung probabilitas diatas :

states = ['gemuk', 'suka makan', 'pemalas']
pi = [0.35, 0.35, 0.3]
state_place = pd.Series(pi, index = states, name = 'states')

print('------ state place -----\n', state_place)
print('------ sum state place ---\n', state_place.sum())

output :

------- state place ------
gemuk : 0.35

suka makan : 0.35
pemalas : 0.3
Name: states, dtype: float64
------- sum state place -------
1.0

Langkah selanjutkan kita menentukan probabilitas transisi, probabilitas transisi adalah  perubahan dari satu status ke status yang lain pada periode  berikutnya dalam proses yang random.

kucing tadi memiliki tiga karakter : gemuk, suka makan dan pemalas
kita kasih probabilitas dalam tiga :
- gemuk : 0.4, 0.2 dan 0.4
- suka makan: 0.45, 0.45 dan 0.1
- pemalas : 0.45, 0.25, 0.3

Dengan model data diatas , kita buat kodingan dengan struktur data seperti diatas :

q_df = pd.DataFrame(columns = states, index = states)
q_df.loc[states[0]] = [0.4, 0.2, 0.4]
q_df.loc[states[1]] = [0.45, 0.45, 0.1]
q_df.loc[states[1]] = [0.45, 0.25, 0.3]

print(------------ Data Frame From States -----------, q_df)

output :

------------ Data Frame From States -----------
          gemuk    suka makan     pemalas
gemuk      0.4         0.2         0.4
suka makan 0.45        0.45        0.1
pemalas    0.45        0.25        0.3


Untuk mengetahui matrix dari data diatas kita dapat menggunakan  model berikut :

nilaimatrik = q_df.values
bentukmetrik = nilaimatrik.shape
nilaidariprobabilitas = q_df.sum(axis=1)

print(------------ Nilai Matrik -----------, nilaimatrik)
print(------------ Bentuk Matrik -----------, bentukmetrik)
print(------------ Nilai Probabilitas -----------, nilaidariprobabilitas)

output :

------------ Nilai Matrik -----------
[[0.4 0.2 0.4]
[0.45 0.45 0.1]
[0.45 0.25 0.3 ]]

------------ Bentuk Matrik -----------
(3,3)

------------ Nilai Probabilitas -----------
gemuk      1.0
suka makan 1.0
pemalas    1.0
dtype: float64

Dengan begitu kita sudah mengetahui probabilitas awal dan transisi, Kemudian setelah itu kita buat diagram markov menggunakan Networkx dan jangan lupa kita install pprint juga agar bisa menampilkan diagram, perlu diingat pprint support pada python3 saja :

import networkx as nx
from pprint import pprint

Setelah menginstall networkx , kita tambahkan di function kita dengan cara import networkx. Kemudian kita buat function untuk  menampilkan diagram markov dengan Networkx sebagai berikut :

def _get_markov_edge(Q):
    edges = {}
    for col in Q.columns:
        for idx in Q.index:
            edges[(idx,col)] = Q.loc[idx,col]
    return  edges

edges_wts = _get_markov_edge(q_df)
pprint(f'markov edge :')
pprint(edges_wts)


G.add_nodes_from(states)
print(f'Nodes:\n{G.nodes()}\n')

# tepi dari transisi probabilitas
for k, v in edges_wts.items():
    tmp_origin, tmp_destination = k[0], k[1]
    G.add_edge(tmp_origin, tmp_destination, weight=v, label=v)
print(f'Edges:')
pprint(G.edges(data=True))

pos = nx.drawing.nx_pydot.graphviz_layout(G, prog='dot')
nx.draw_networkx(G, pos)

# kemudian untuk menampilkan imagenya grafiknya hanya bisa di tampilkan di anaconda saja
edge_labels = {(n1,n2):d['label'] for n1,n2,d in G.edges(data=True)}
nx.draw_networkx_edge_labels(G , pos, edge_labels=edge_labels)
nx.drawing.nx_pydot.write_dot(G, 'pet_dog_markov.dot')

output :

----------- markov edge --------------
{('gemuk','gemuk'):0.4
('gemuk', 'Pemalas') : 0.4
('gemuk', 'suka makan') : 0.2
('pemalas', 'gemuk') : 0.45
('pemalas', 'pemalas') : 0.3
('pemalas', 'suka makan') : 0.25
('suka makan', 'gemuk') : 0.45
('suka makan', 'pemalas') : 0.1
('suka makan', 'suka makan') : 0.45}
Nodes:
['gemuk', 'suka makan', 'pemalas']

Edges :
OutMultiEdgeDataView([('gemuk', 'gemuk', {'weight': 0.4, 'label': 0.4}),('gemuk', 'suka makan', {'weight': 0.2, 'label': 0.2}),('gemuk', 'pemalas', {'weight': 0.4, 'label': 0.4}),('suka makan', 'gemuk', {'weight': 0.45, 'label': 0.45}),('suka makan', 'suka makan', {'weight': 0.45, 'label': 0.45}),('suka makan', 'pemalas', {'weight': 0.1, 'label': 0.1}),('pemalas', 'gemuk', {'weight': 0.45, 'label': 0.45}),('pemalas', 'suka makan', {'weight': 0.25, 'label': 0.25}),('pemalas', 'pemalas', {'weight': 0.3, 'label': 0.3})])

kita dapat  merubah .dot ke bentuk .png dengan cara berikut ini :

dot -Tpng pet_dog_markov.dot -o output3.png

output :



Sampai disini dulu, nanti setelah saya pelajari kembali akan update yang Part2 nya. Semoga bermanfaat, terima kasih 😙



Hidden Markov Model pada Python (Part 1) Hidden Markov Model pada Python (Part 1) Reviewed by sdiik on February 05, 2020 Rating: 5

No comments:

Powered by Blogger.