Ugaon2 (обсуждение | вклад) (Содержимое страницы заменено на «'''{{PAGENAME}}''' - пассивный педераст. Категория:Жопа») Метка: sourceedit |
м (Откат правок Ugaon2 (обсуждение) к версии Tac14) |
||
Строка 1: | Строка 1: | ||
+ | {{сирота}} |
||
− | '''{{PAGENAME}}''' - пассивный педераст. |
||
+ | '''Алгоритм «sum-product»''' — [[Алгоритм|алгоритм]] [[Маргинализация|маргинализации]] с помощью двунаправленной передачи сообщений на [[Граф (математика)|графе]] |
||
⚫ | |||
+ | |||
+ | == Постановка задачи == |
||
+ | Рассмотрим функцию: |
||
+ | |||
+ | :<math>p^*(X) = \prod^m_{j=1}f_j(X_j)</math>, где <math>X_j = \{x_i\}_{i = 1}^n</math> |
||
+ | |||
+ | Чтобы получить вероятность, необходимо ее нормализовать: |
||
+ | |||
+ | :<math>p(X) = \frac{1}{Z} \prod^m_{j=1}f_j(X_j), Z = \sum_X \prod^m_{j=1}f_j(X_j)</math> |
||
+ | |||
+ | Нас интересуют следующие задачи: |
||
+ | * 1. Задача [[Нормализация|нормализации]] |
||
+ | |||
+ | :найти <math>Z = \sum_X \prod^m_{j=1}f_j(X_j)</math> |
||
+ | |||
+ | * 2. Задача [[Маргинализация|маргинализации]] |
||
+ | |||
+ | :найти <math>p^*_i(x_i) = \sum_{k \neq i}p^*(X)</math> |
||
+ | |||
+ | * 3. Задача нормализованной маргинализации |
||
+ | |||
+ | :найти <math>p_i(x_i) = \sum_{k \neq i}p(X)</math> |
||
+ | |||
+ | Все эти задачи являются [[Класс NP|''NP'']]-[[NP-трудная задача|трудными]], так что сложность их решения в худшем случае возрастает экспоненциально. |
||
+ | Однако некоторые частные случаи можно решить быстрее, чем и занимается данный алгоритм. |
||
+ | |||
+ | == Структура графа == |
||
+ | [[Граф (математика)|Граф]], используемый алгоритмом, состоит из вершин, соответствующих переменным, и вершин, соответствующих функциям. |
||
+ | Функции соединены с переменными, от которых они зависят. |
||
+ | |||
+ | === Пример === |
||
+ | Например функции |
||
+ | |||
+ | :<math>p^*(X) = f_1(x_1)f_2(x_2)f_3(x_3)f_4(x_1, x_2)f_5(x_2, x_3)</math> |
||
+ | |||
+ | соответствует следующий граф: |
||
+ | |||
+ | :[[Изображение:SumProduct_ExampleGraph.png]] |
||
+ | |||
+ | == Передача сообщений == |
||
+ | В графе пересылаются сообщения двух видов: от функций к переменным и от переменных к функциям. |
||
+ | |||
+ | От переменной <math>x_i</math> к функции <math>f_j</math>: |
||
+ | |||
+ | :<math>q_{i \to j}(x_i) = \prod_{k \in ne(i) \setminus j} r_{k \to i}(x_i)</math> (здесь <math>ne(i)</math> — множество вершин, соседних с i) |
||
+ | |||
+ | |||
+ | От функции <math>f_j</math> к переменной <math>x_i</math>: |
||
+ | |||
+ | :<math>r_{i \to j}(x_i) = \sum_{X_i \setminus x_i}(f_j(X_j) \prod_{k \in ne(i) \setminus j}q_{k \to j}(x_k)</math> |
||
+ | |||
+ | При этом пустое произведение считаем равным единице. |
||
+ | Из этих формул видно, что если у вершины всего один сосед, то ее сообщение можно вычислить не зная входящих сообщений. |
||
+ | |||
+ | == Алгоритм == |
||
+ | Существует два подхода, в зависимости от характера полученного графа. |
||
+ | |||
+ | === Подход 1 === |
||
+ | Предположим, что [[Граф (математика)|граф]] является [[Дерево (теория графов)|деревом]]. |
||
+ | Начиная с листьев будем постепенно обходить все вершины и вычислять сообщения (при этом применяется стандартное правило передачи сообщений: сообщение можно передавать только если его можно полностью построить). |
||
+ | |||
+ | Тогда за количество шагов, равное [[Диаметр графа|диаметру графа]], работа алгоритма закончится. |
||
+ | |||
+ | === Подход 2 === |
||
+ | Если [[Граф (математика)|граф]] не является [[Дерево (теория графов)|деревом]], то можно начать с того, что все переменные передают сообщение 1, а потом уже его модифицируют, когда до них доходят сообщения от функций. |
||
+ | |||
+ | Такой алгоритм в общем случае работает неверно и делает много лишнего, но все же полезен на практике. |
||
+ | |||
+ | == Вычисление маргиналов == |
||
+ | Когда рассылка сообщений закончена, маргиналы вычисляются по следующей формуле: |
||
+ | |||
+ | :<math>p^*_i(x_i) = \prod_{j \in ne(i)}r_{j \to i}(x_i)</math> |
||
+ | |||
+ | :<math>Z = \sum_i p^*_i(x_i), p(x_i) = \frac{1}{Z}p^*_i(x_i)</math> |
||
+ | |||
+ | == Нормализация на лету == |
||
+ | Если нужно рассчитать только нормализованные маргиналы (настоящие вероятности), то можно на каждом шаге нормализовать сообщения от переменных к функциям: |
||
+ | |||
+ | :<math>q_{i \to j}(x_i) = \alpha_{ij} \prod_{k \in ne(i) \setminus j} r_{k \to i}(x_i)</math>, |
||
+ | |||
+ | где <math>\alpha_{ij}</math> подобраны так, чтобы |
||
+ | |||
+ | :<math>\sum_i q_{i \to j}(x_i) = 1</math> |
||
+ | |||
+ | == Математическое обоснование алгоритма == |
||
+ | С математической точки зрения алгоритм изначальное разложение |
||
+ | |||
+ | :<math>p^*(X) = \prod^m_{j=1}f_j(X_j)</math> |
||
+ | |||
+ | перераскладывает в произведение |
||
+ | |||
+ | :<math>p^*(X) = \prod^m_{j=1}\phi_j(X_j) \prod^m_{i=1}\psi_i(x_i)</math>, |
||
+ | |||
+ | где <math>\phi_j</math> соответствует узлам-функциям, а <math>\psi_i</math> — узлам-переменным. |
||
+ | |||
+ | Изначально, до передачи сообщений <math>\phi_j(X_j) = f_j(X_j)</math> и <math>\psi_i(x_i) = 1</math> |
||
+ | |||
+ | Каждый раз, когда приходит сообщение <math>r_{j \to i}</math> из функции в переменную, <math>\phi</math> и <math>\psi</math> пересчитываются: |
||
+ | |||
+ | :<math>\psi_i(x_i) = \prod_{j \in ne(i)}r_{j \to i}(x_i)</math>, |
||
+ | |||
+ | :<math>\phi_j(X_i) = \frac{f_j(X_j)}{\prod_{i \in ne(j)}r_{j \to i}(x_i)}</math> |
||
+ | |||
+ | Очевидно, что общее произведение от этого не меняется, а <math>\psi_i</math> по окончании передачи сообщений станет маргиналом <math>p^*(x_i)</math>. |
||
+ | |||
+ | == Ссылки == |
||
+ | [http://logic.pdmi.ras.ru/~sergey/index.php?page=mlbayes С. Николенко. Курс «Вероятностное обучение»] |
||
+ | |||
⚫ | |||
+ | [[Категория:Теория вероятностей]] |
||
+ | {{нет интервики}} |
Текущая версия от 04:29, 11 марта 2017
На эту статью не ссылаются другие статьи Википедии. Пожалуйста, воспользуйтесь [http://toolserver.org/~lvova
/cgi-bin/suggest.sh?interface=ru&title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC+sum-product подсказкой] и установите ссылки в соответствии с принятыми рекомендациями.
|
Алгоритм «sum-product» — алгоритм маргинализации с помощью двунаправленной передачи сообщений на графе
Постановка задачи
Рассмотрим функцию:
- , где
Чтобы получить вероятность, необходимо ее нормализовать:
Нас интересуют следующие задачи:
- 1. Задача нормализации
- найти
- 2. Задача маргинализации
- найти
- 3. Задача нормализованной маргинализации
- найти
Все эти задачи являются NP-трудными, так что сложность их решения в худшем случае возрастает экспоненциально. Однако некоторые частные случаи можно решить быстрее, чем и занимается данный алгоритм.
Структура графа
Граф, используемый алгоритмом, состоит из вершин, соответствующих переменным, и вершин, соответствующих функциям. Функции соединены с переменными, от которых они зависят.
Пример
Например функции
соответствует следующий граф:
Передача сообщений
В графе пересылаются сообщения двух видов: от функций к переменным и от переменных к функциям.
От переменной к функции :
- (здесь — множество вершин, соседних с i)
От функции к переменной :
При этом пустое произведение считаем равным единице. Из этих формул видно, что если у вершины всего один сосед, то ее сообщение можно вычислить не зная входящих сообщений.
Алгоритм
Существует два подхода, в зависимости от характера полученного графа.
Подход 1
Предположим, что граф является деревом. Начиная с листьев будем постепенно обходить все вершины и вычислять сообщения (при этом применяется стандартное правило передачи сообщений: сообщение можно передавать только если его можно полностью построить).
Тогда за количество шагов, равное диаметру графа, работа алгоритма закончится.
Подход 2
Если граф не является деревом, то можно начать с того, что все переменные передают сообщение 1, а потом уже его модифицируют, когда до них доходят сообщения от функций.
Такой алгоритм в общем случае работает неверно и делает много лишнего, но все же полезен на практике.
Вычисление маргиналов
Когда рассылка сообщений закончена, маргиналы вычисляются по следующей формуле:
Нормализация на лету
Если нужно рассчитать только нормализованные маргиналы (настоящие вероятности), то можно на каждом шаге нормализовать сообщения от переменных к функциям:
- ,
где подобраны так, чтобы
Математическое обоснование алгоритма
С математической точки зрения алгоритм изначальное разложение
перераскладывает в произведение
- ,
где соответствует узлам-функциям, а — узлам-переменным.
Изначально, до передачи сообщений и
Каждый раз, когда приходит сообщение из функции в переменную, и пересчитываются:
- ,
Очевидно, что общее произведение от этого не меняется, а по окончании передачи сообщений станет маргиналом .
Ссылки
С. Николенко. Курс «Вероятностное обучение»