Scikit aprende el modelo oculto de Markov
En este tutorial de Python, aprenderemos Cómo crear un modelo scikit learn Markov en pitón y también cubriremos estos ejemplos relacionados con el modelo de Markov. Y, cubriremos estos temas.
¿Qué es el modelo de Markov de scikit learn?
En esta sección aprenderemos sobre la Scikit aprende el modelo de Markov en python y cómo funciona.
Un modelo de Markov se define como un proceso estocástico, mientras que la probabilidad considerada del estado futuro depende del estado actual del proceso.
Ejemplo:
Considere que quiere hacer un modelo de probabilidad futura de que nuestro gato esté en los tres estados dado su estado actual.
Consideramos al gato que hemos sido muy vagos. Definimos su estado durmiendo comiendo, Pooping. Establecemos las probabilidades iniciales en 45%, 35% y 20% resp.
Código:
import numpy as np
import pandas as pd
import networkx as nx
import matplotlib.pyplot as plot
%matplotlib inline
states = ['sleeping', 'eating', 'pooping']
pi = [0.45, 0.35, 0.2]
state_space = pd.Series(pi, index=states, name="states")
print(state_space)
print(state_space.sum())
Después de ejecutar el código anterior, obtenemos el siguiente resultado en el que podemos ver que la probabilidad del supuesto estado del gato.
El siguiente paso es definir la probabilidad simplemente en el mismo estado o moviéndose a un estado diferente dado el estado actual.
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.40, 0.40, 0.2]
q_df.loc[states[2]] = [0.40, 0.20, .4]
print(q_df)
q_f = q_df.values
print('\n', q_f, q_f.shape, '\n')
print(q_df.sum(axis=1))
scikit aprende el proceso de transición del modelo de Markov
Después de realizar el proceso anterior, tenemos probabilidades iniciales y de transición y ahora estamos creando un diagrama de Markov utilizando el paquete Networkx.
from pprint import pprint
def _get_markov_edges(Q):
edge = {}
for column in Q.columns:
for index in Q.index:
edge[(index,column)] = Q.loc[index,column]
return edge
edge_wt = _get_markov_edges(q_df)
pprint(edge_wt)
scikit aprende el modelo de Markov usando networkx
Ahora podemos crear un gráfico de modelo de Markov de scikit learn.
- Graph.add_nodes_from(estados) se utiliza para crear nodos correspondientes a los estados.
- Graph.add_edge(tmp_origin, tmp_destination, peso=v, etiqueta=v) los bordes representan las probabilidades de transición.
Graph = nx.MultiDiGraph()
Graph.add_nodes_from(states)
print(f'Nodes:\n{Graph.nodes()}\n')
for k, v in edge_wt.items():
tmp_origin, tmp_destination = k[0], k[1]
Graph.add_edge(tmp_origin, tmp_destination, weight=v, label=v)
print(f'Edges:')
pprint(Graph.edges(data=True))
position = nx.drawing.nx_pydot.graphviz_layout(Graph, prog='dot')
nx.draw_networkx(Graph, position)
edge_labels = {(n1,n2):d['label'] for n1,n2,d in Graph.edges(data=True)}
nx.draw_networkx_edge_labels(Graph , position, edge_labels=edge_labels)
nx.drawing.nx_pydot.write_dot(Graph, 'pet_dog_markov.dot')
Scikit aprende el gráfico del modelo de Markov
Lo que hizo que Scikit aprendiera el modelo oculto de Markov
En esta sección aprenderemos sobre la scikit aprender modelo oculto y quién ocultó el modelo de Markov.
Consideremos que nuestro gato está actuando de manera extraña y nos encontramos con que por qué actúa así nuestro comportamiento de gato se debe a una enfermedad o simplemente actúa así.
Código:
En este creamos un espacio en el que podemos ver que nuestro gato está sano o enfermo.
hidden_state = ['healthy', 'sick']
pi = [0.55, 0.45]
state_space = pd.Series(pi, index=hidden_state, name="states")
print(state_space)
print('\n', state_space.sum())
scikit aprende el espacio de estado oculto de Markov
En el siguiente paso, estamos creando una matriz de transición para el estado oculto.
a1_df = pd.DataFrame(columns=hidden_state, index=hidden_state)
a1_df.loc[hidden_state[0]] = [0.7, 0.3]
a1_df.loc[hidden_state[1]] = [0.4, 0.6]
print(a1_df)
a1 = a1_df.values
print('\n', a1, a1.shape, '\n')
print(a1_df.sum(axis=1))
scikit aprende el estado oculto de la matriz de transición
Aquí, en este paso, creamos una matriz de emisión y observación. La matriz que estamos creando es del tamaño de axb. a es el número de estados ocultos y b es el número de estados observables.
observable_state = states
b1_df = pd.DataFrame(columns=observable_state, index=hidden_state)
b1_df.loc[hidden_state[0]] = [0.3, 0.5, 0.2]
b1_df.loc[hidden_state[1]] = [0.3, 0.3, 0.4]
print(b1_df)
b1 = b1_df.values
print('\n', b1, b1.shape, '\n')
print(b1_df.sum(axis=1))
scikit aprender matriz de emisión y observable
En este paso, estamos creando los bordes del gráfico y el objeto gráfico a partir del cual podemos crear un gráfico completo.
hide_edges_wt = _get_markov_edges(a1_df)
pprint(hide_edges_wt)
emit_edges_wt = _get_markov_edges(b1_df)
pprint(emit_edges_wt)
scikit aprender gráfico de estado oculto
Aquí podemos trazar el gráfico completo del modelo oculto de Markov.
G = nx.MultiDiGraph()
G.add_nodes_from(hidden_state)
print(f'Nodes:\n{G.nodes()}\n')
for k, v in hide_edges_wt.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_wt.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)
scikit aprende el modelo oculto de Markov
Scikit aprende el ejemplo del modelo oculto de Markov
En esta sección, aprenderemos sobre el ejemplo de modelo oculto de Markov de scikit learn en python.
El modelo oculto de Markov de scikit learn es un proceso, mientras que la probabilidad futura del futuro depende del estado actual.
Código:
En el siguiente código, importaremos algunas bibliotecas a partir de las cuales estamos creando un modelo oculto de Markov.
state_space = pd.Series(pi, index=states, name=’states’) se utiliza para crear un espacio de estado y una probabilidad de espacio de estado inicial.
borde[(index,column)] = Q.loc[index,column] se utiliza para crear una función que mapea el marco de datos de probabilidad de transición.
Graph.add_nodes_from(estados) se utiliza para agregar el nodo correspondiente a los datos cuadro.
Graph.add_edge(tmp_origin, tmp_destination, peso=v, etiqueta=v) edge se utiliza para representar la propiedad de transición.
import numpy as np
import pandas as pd
import networkx as nx
import matplotlib.pyplot as plot
%matplotlib inline
states = ['sleeping', 'eating', 'pooping']
pi = [0.45, 0.35, 0.2]
state_space = pd.Series(pi, index=states, name="states")
print(state_space)
print(state_space.sum())
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.40, 0.40, 0.2]
q_df.loc[states[2]] = [0.40, 0.20, .4]
print(q_df)
q_f = q_df.values
print('\n', q_f, q_f.shape, '\n')
print(q_df.sum(axis=1))
from pprint import pprint
def _get_markov_edges(Q):
edge = {}
for column in Q.columns:
for index in Q.index:
edge[(index,column)] = Q.loc[index,column]
return edge
edge_wt = _get_markov_edges(q_df)
pprint(edge_wt)
Graph = nx.MultiDiGraph()
Graph.add_nodes_from(states)
print(f'Nodes:\n{Graph.nodes()}\n')
for k, v in edge_wt.items():
tmp_origin, tmp_destination = k[0], k[1]
Graph.add_edge(tmp_origin, tmp_destination, weight=v, label=v)
print(f'Edges:')
pprint(Graph.edges(data=True))
position = nx.drawing.nx_pydot.graphviz_layout(Graph, prog='dot')
nx.draw_networkx(Graph, position)
edge_labels = {(n1,n2):d['label'] for n1,n2,d in Graph.edges(data=True)}
nx.draw_networkx_edge_labels(Graph , position, edge_labels=edge_labels)
nx.drawing.nx_pydot.write_dot(Graph, 'pet_dog_markov.dot')
Producción:
Después de ejecutar el código anterior, obtenemos el siguiente resultado en el que podemos ver que el modelo de Markov se representa en la pantalla.