Есть ли способ заставить зацикленное распространение убеждений вычислить максимальные маргиналы?
По-видимому, существует два стандартных способа передать сообщение при распространении убеждений: найти суммарное произведение (предельное распределение) переменной и найти максимальное произведение переменной.
Я нашел этот код в Интернете, сделанный пользователем krashkov , который вычисляет сумму-произведение переменной с использованием нециклического и циклического распространения убеждений (и обрисовывает в общих чертах детали реализации и теории распространения убеждений), но у меня возникли проблемы с настройкой кода так что он вычисляет максимальное произведение переменной, используя зацикленное распространение убеждений.
Я внес следующие изменения в код:
Я изменил строку в
factor_marginalization()
функция для вычисленияres_distribution = np.max(x.get_distribution(), tuple(np.where(np.isin(x.get_variables(), variables))[0]))
вместоres_distribution = np.sum(x.get_distribution(), tuple(np.where(np.isin(x.get_variables(), variables))[0]))
Я изменил строку в каждом из
__normalize_msg()
функции вbelief_propagation()
а такжеloopy_belief_propagation()
классы дляreturn factor(message.get_variables(), message.get_distribution())
вместоreturn factor(message.get_variables(), message.get_distribution()/np.sum(message.get_distribution()))
При попытке вычислить максимальные маргиналы с использованием циклического распространения убеждений кажется, что увеличение количества итераций в циклическом убеждении приводит к взрыву максимальных маргинальных значений, а не к вычислению фактических максимальных маргиналов. Может ли кто-нибудь помочь мне немного изменить код, чтобы он вычислял точные максимальные предельные значения?