Hidden Markov Model pada Python (Part 2)



Setelah beberapa hari yang lalu kita mempelajari probabilitas pasti dari suatu kejadian, sampai kita mencari probabilitas dalam jangka waktu yang ditentukan dengan nilai yang tidak pasti  ( klik disini ).

Kali ini kita membuat Marko Model Hidden pada kejadian kucing kita kemarin. Kucing kita kemarin memiliki karakter gemuk, suka makan dan malas. Dari karakter diatas apakah kucing kita tergolong kucing yang sehat atau kucing yang sakit. Dalam hal ini kondisi kucing bisa kita masukkan menjadi hidden_state. dengan perbandingan 0.5 pada tiap kodisi

sehat : 0.5
sakit : 0.5

Dari kondisi diatas, mari kita buat function dengan menggunakan python :

hidden_states = ['sehat', 'sakit']
pi : [0.5, 0.5]
state_space = pd.Series(pi, index= hidden_state, name='hidden states')
print(state_space)
print('----- total prob ---->', state_space.sum())

output :

-------------- Hidden State -----------
sehat   0.5
sakit   0.5

Name: hidden states, dtype: float64
------- total prob -----> 1

Itu terjadi bila kondisi kucing selamanya akan sehat atau sakit, tapi disini kita coba membuat kemungkinan seberapa besar kesehatan yang dimiliki dan seberapa sakit yang kucing derita. Misal kita buat perumpamaan kejadian pada dua hari. Hari pertama kucing sehat dengan kondisi 0.7 persen dan sakit 0.4  persen, sedangkan hari berikut kucing sakit dengan kondisi 0.6 persen dan sehat 0.3 persen. Mari kita jabarkan agar lebih mudah :

sehat : 0.7, 0.3
sakit : 0.4, 0.6

Dari kondisi diatas, mari kita buat function dengan menggunakan python :

a_df : pd.DataFrame(columns = hidden_states, index = 'hidden_state')
a_df.loc[hidden_states[0]] = [0.7, 0.3]
a_df.loc[hiddem_states[1]] = [0.4, 0.6]
a = a_df.values

print('----- model a_df ----', a_df)
print('----- shape a_df ----', a.shape)
print('----- pro value -----', a_df.sum(axis=1))
print('----- hidden markov edge ----',hide_edges_wts = _get_markov_edge(a_df))

output :

-------------- model a_df -----------
         sehat      sakit
sehat     0.7        0.3 
sakit     0.4        0.6

----- shape a_df ----
[[0.7 0.3]
[[0.4 0.6]] 

----- pro value -----
(2,2)

----- hidden markov edge ----
{('sehat', 'sehat'): 0.7,
 ('sehat', 'sakit'): 0.3,
 ('sakit', 'sehat'): 0.4,
 ('sakit', 'sakit'): 0.6}

Mari kita gabungkan karakter kucing dengan kondisinya, masih ingatkan kondisi kucing kita 😅. dalam keadaan sehat kondisi kucing kita kegemukannanya 0.2 , tingkat kesukaan makannya 0.6 sedangkan tingkat kemalasannya 0.2 . Tetapi disaat kondisi sakit kegemukan kucing kita 0.4, tingkat kesukaan makannya 0.1 dan kemalasannya 0.5. Mari kita buat function python untuk mengimplementasikan kondisi diatas.

observable_states = states
b_df : pd.DataFrame(columns = observable_states, index = 'hidden_states')
b_df.loc[hidden_states[0]] = [0.2, 0.6, 0.2]
b_df.loc[hiddem_states[1]] = [0.4, 0.1, 0.5]
b = b_df.values
G = nx.MultiDiGraph()
G.add_nodes_from(hidden_states)


print('----- model aktifitas kucing ----', b_df)
print('----- bentuk matrik aktifitas kucing ----', b.shape)
print('----- pro value -----', b_df.sum(axis=1))
print('----- hidden markov edge ----',emit_edges_wts = _get_markov_edge(b_df))
print(f'Nodes:\n{G.nodes()}\n')

output :

------------- model aktifitas kucing ------------
        gemuk suka makan   malas
sehat :  0.2     0.6        0.2
sakit :  0.4     0.1        0.5

------------- bentuk matrik aktifitas kucing --------
[[0.2 0.6 0.2]
[0.4 0.1 0.5]] (2,3)

----- pro value -----
sehat : 1
sakit : 1
dtype: float64

----- hidden markov edge ----
{('sehat', 'gemuk'): 0.6,
 ('sehat', 'suka makan'): 0.2,
 ('sehat', 'malas'): 0.2,
 ('sakit', 'gemuk'): 0.1,
 ('sakit', 'suka makan'): 0.5,
 ('sakit', 'malas'): 0.4}

Nodes:

['healthy', 'sick']


Setelah itu kita buat grafik untuk menggambarkan data diatas dalam format .dot :

for k, v in hide_edges_wts.items():
    tmp_origin, tmp_destination = k[0], k[1]
    G.add_edge(tmp_origin, tmp_destination, weight=v, label=v)

for k , v in emit_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='neato')
nx.draw_networkx(G, pos)

emit_edges_label = {(n1, n2): d['label'] for n1, n2, d in G.edges(data=True)}
nx.draw_networkx_edge_labels(G, pos, edge_labels= emit_edges_label)
nx.drawing.nx_pydot.write_dot(G, 'Pet_cat_hidden_markov.dot')

# 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_cat_hidden_markov.dot')

Output :

Edges:
OutMultiEdgeDataView([('sehat', 'sehat', {'weight': 0.7, 'label': 0.7}), ('sehat', 'sakit', {'weight': 0.3, 'label': 0.3}), ('sehat', 'gemuk', {'weight': 0.2, 'label': 0.2}), ('sehat', 'suka makan', {'weight': 0.6, 'label': 0.6}), ('sehat', 'pemalas', {'weight': 0.2, 'label': 0.2}), ('sakit', 'sehat', {'weight': 0.4, 'label': 0.4}), ('sakit', 'sakit', {'weight': 0.6, 'label': 0.6}), ('sakit', 'gemuk', {'weight': 0.4, 'label': 0.4}), ('sakit', 'suka makan', {'weight': 0.1, 'label': 0.1}), ('sakit', 'pemalas', {'weight': 0.5, 'label': 0.5})])

Kemudian kita convert data .dot ke bentuk png :

import pydot
(graph,) = pydot.graph_from_dot_file('Pet_cat_hidden_markov.dot')
graph.write_png('somefile.png')

Output :


 Seperti itulah Hidden Markov Model pada Python , Semoga bermanfaat 😊



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

No comments:

Powered by Blogger.