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())
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
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))
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 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')
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})])
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')
(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)
Reviewed by sdiik
on
February 11, 2020
Rating:
No comments: