Входной файл: | test.py | Ограничение времени: | 1 сек | |
Выходной файл: | Стандартный выход | Ограничение памяти: | 512 Мб | |
Максимальный балл: | 1 |
Требуется реализовать на языке программирования Python функцию
from typing import TypeVar
from collections.abc import Generator, Hashable
S = TypeVar('S', bound=Hashable) # state type
O = TypeVar('O', bound=Hashable) # observation type
def hmm_forward(
initial_probability: dict[S, float],
transition_probability: dict[S, dict[S, float]],
observation_probability: dict[S, dict[O, float]]
) -> Generator[S, O, dict[S, float]]:
"""Implements [forward alogirthm](https://en.wikipedia.org/wiki/Forward_algorithm) for a hidden markov model.
Each iteration the generator output the most porbable state of the model, receiving new observations through `send` method.
Iteration stops after `None` value has been received and the generator outputs a dictionary mapping each state to its propability.
Arguments:
initial_probability: initial state probabilitites
transition_probability: probabilities of transition from one state to another
observation_probability: probabilities to observe each of the observations at each of the states
Yields:
most probable state
Returns
a mapping from each state to its propability
"""
pass
Функция выполняет Forward algorithm для заданной скрытой марковской модели с начальными вероятностями initial_probability
, вероятностями перехода transition_probability
и вероятностями наблюдений observation_probability
. Функция возвращает объект типа генератор, производящий на каждой итерации наиболее вероятное состояние модели. Генератор получает новые наблюдения через метод send
. При получении значения None
генератор останавливается и возвращает словарь вероятностей каждого состояния.
Код решения должен содержать только импортируемые модули, определение и реализацию функции.
№ | Входной файл (test.py ) |
Стандартный выход |
---|---|---|
1 | observations = ['umbrella', 'umbrella', 'no umbrella', 'umbrella', 'umbrella']
initial_probability = { 'rain': 0.7, 'sun': 0.3 }
transition_probability = {
'rain': { 'rain': 0.7, 'sun': 0.3 },
'sun': { 'rain': 0.3, 'sun': 0.7 }
}
observation_probability = {
'rain': { 'umbrella': 0.9, 'no umbrella': 0.1 },
'sun': { 'umbrella': 0.2, 'no umbrella': 0.8 }
}
it = iter(hmm_forward(
initial_probability,
transition_probability,
observation_probability
))
print(next(it))
for s in observations:
print(it.send(s))
try:
next(it)
except StopIteration as e:
for i in sorted(e.value.keys()):
print(i, f'{e.value[i]:.3f}')
|
|