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
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())
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
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)
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
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 ]]
[[0.4 0.2 0.4]
[0.45 0.45 0.1]
[0.45 0.25 0.3 ]]
------------ Bentuk Matrik -----------
(3,3)
(3,3)
------------ Nilai Probabilitas -----------
gemuk 1.0
suka makan 1.0
pemalas 1.0
dtype: float64
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})])
{('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)
Reviewed by sdiik
on
February 05, 2020
Rating:
No comments: