Применяете машинное обучение к игре в догадки? - PullRequest
22 голосов
/ 09 ноября 2011

У меня проблема с игрой, которую я делаю.Я думаю, что знаю решение (или какое решение применить), но не уверен, как все «кусочки» сочетаются друг с другом.

Как работает игра:

(от Как подойти к алгоритму игры в угадайку чисел (с изюминкой)? )

пользователям будут предоставлены элементы со значением (значения меняются каждый день, и программа знает об изменении цены),Например,

Apple = 1
Pears = 2
Oranges  = 3

Затем они получат возможность выбрать любую понравившуюся им комбинацию (например, 100 яблок, 20 груш и 1 апельсин).Единственный вывод, который получает компьютер, - это общая стоимость (в данном примере это $ 143).Компьютер попытается угадать, что у них есть.Который, очевидно, не сможет правильно получить первый ход.

         Value  quantity(day1)  value(day1)
Apple    1      100             100
Pears    2      20              40
Orange   3      1               3
Total           121             143

В следующий ход пользователь может изменить свои числа, но не более 5% от общего количества (или какой-то другой процент, который мы можемвыбрал. Я буду использовать 5%, например.).Цены на фрукты могут изменяться (случайным образом), поэтому общая стоимость также может изменяться в зависимости от этого (для простоты в этом примере я не изменяю цены на фрукты).Используя приведенный выше пример, во второй день игры пользователь возвращает значение $ 152 и $ 164 в третий день. Вот пример.

quantity(day2)  %change(day2)   value(day2) quantity(day3)  %change(day3)   value(day3)
104                             104         106                             106
21                              42          23                              46
2                               6           4                               12
127             4.96%           152         133             4.72%           164

* (надеюсь, таблицы отображаются правильно, у меня былоНадеюсь, что они будут размещены вручную, поэтому не просто делать это на моем экране, если это не сработает, дайте мне знать, и я попытаюсь загрузить скриншот).

Я пытаюсь понять, смогу ли я понятьузнать, какие количества есть со временем (при условии, что у пользователя будет терпение продолжать вводить числа).Я знаю, что сейчас мое единственное ограничение - это общее значение не может превышать 5%, поэтому я не могу быть в пределах 5% точности, поэтому пользователь будет вводить его всегда.

То, что я сделал до сих пор:

Я взял все значения фруктов и общую стоимость корзины фруктов, которые мне дали, и создал большую таблицувсе возможности.После того, как у меня есть список всех возможностей, я использовал теорию графов и создал узлы для каждого возможного решения.Затем я создаю ребра (связи) между узлами из каждого дня (например, от дня 1 до дня 2), если его изменение не превышает 5%.Затем я удаляю все узлы, которые не имеют ребер (ссылки на другие узлы), и, поскольку пользователь продолжает играть, я также удаляю целые пути, когда путь становится тупиком.Это здорово, потому что это сужает выбор, но теперь я застрял, потому что я хочу сузить этот выбор еще больше.Мне сказали, что это скрытая проблема Маркова, но более хитрая версия, потому что состояния меняются (как вы можете видеть выше, новые узлы добавляются каждый ход, а старые / не вероятные удаляются).

** если это поможет, я получил удивительный ответ (с примером кода) о реализации на python модели baum-welch (используется для обучения данных) здесь: Пример реализации Baum-Welch **

Что я думаю нужно сделать (это может быть неправильно):

Теперь, когда я сузил результаты, я в основном пытаюсь разрешить программупопытаться правильно спрогнозировать, основываясь на суженной базе результатов.Я думал, что это невозможно, но несколько человек предлагают решить эту проблему с помощью скрытой модели Маркова.Я думаю, что могу выполнить несколько итераций над данными (используя модель Баума-Уэлча), пока вероятности не стабилизируются (и не должны улучшаться с большим количеством поворотов от пользователя).Способ, которым скрытые марковские модели могут проверять орфографию или почерк и улучшать их при возникновении ошибок (в данном случае ошибки - это выбрать корзину, которая будет удалена на следующем ходу как маловероятная).вопросы:

  1. How вычислить ли матрицу перехода и эмиссии, если все состояния сначала равны? Например, поскольку все состояния одинаково вероятны, необходимо использовать что-то, чтобы выделить вероятность изменения состояний. Я думал об использовании графика, который я сделал, чтобы взвесить узлы с наибольшим числом ребер как часть расчета переходных / эмиссионных состояний? Это имеет смысл или есть лучший подход?

  2. Как я могу отслеживать все изменения в состояниях? Когда добавляются новые корзины и удаляются старые, возникает проблема отслеживания корзин. Я думал, что мне нужна модель скрытого марковского процесса иерархического процесса Дирихле (hdp-hmm), но я не совсем уверен, как ее применить.

(извините, если я звучу немного разочарованно ... это немного сложно, зная, что проблема разрешима, но не в состоянии концептуально понять, что нужно сделать).

Как всегда, спасибо за ваше время и любые советы / предложения будут с благодарностью.

1 Ответ

16 голосов
/ 09 ноября 2011

Как вы сказали, эту проблему можно описать с помощью HMM.По сути, вы заинтересованы в поддержании распределения по скрытым или скрытым состояниям, которые будут истинными величинами в каждый момент времени.Однако, кажется, вы путаете проблему изучения параметров для HMM, в отличие от простого вывода в известном HMM.У вас есть последняя проблема, но вы предлагаете использовать решение (Baum-Welch), предназначенное для решения первой.То есть у вас уже есть модель, вам просто нужно ее использовать.

Интересно, что если вы проходите кодирование дискретного HMM для своей задачи, вы получаете алгоритм, очень похожий на тот, который вы описываете в своем решении теории графов.Большая разница в том, что ваше решение отслеживает то, что возможно , тогда как правильный алгоритм вывода, такой как алгоритм Виртерби , будет отслеживать то, что вероятно .Разница очевидна, когда в области 5% перекрытия в домене, то есть когда несколько возможных состояний потенциально могут перейти в одно и то же состояние.Ваш алгоритм может добавить 2 ребра к точке, но я сомневаюсь, что когда вы вычисляете следующий день, это будет иметь эффект (по сути, он должен рассчитываться дважды).

В любом случае, вы можете использовать алгоритм Витерби, если вас интересует только лучшее предположение за последний день, я просто дам вам краткое представление о том, как вы можете просто изменить свое решение теории графов.Вместо сохранения границ между состояниями следует поддерживать дробь, представляющую вероятность того, что состояние является правильным (это распределение иногда называют состоянием веры).В каждый новый день распространяйте свое состояние веры вперед, увеличивая каждое ведро на вероятность его родителя (вместо добавления ребра добавляя число с плавающей запятой).Вы также должны убедиться, что ваше состояние убеждения правильно нормализовано (суммы 1), поэтому просто делите его на сумму после каждого обновления.После этого вы можете взвешивать каждое состояние по своему наблюдению, но поскольку у вас нет шумного наблюдения, вы можете просто пойти и установить все невозможные состояния равными нулю вероятности, а затем повторно нормализовать.Теперь у вас есть распределение по базовым величинам, обусловленное вашими наблюдениями.

Я пропускаю здесь много статистических деталей, просто чтобы дать вам идею.

Редактировать (повторно: вопросы): Ответ на ваш вопрос действительно зависит от того, что вы хотите, если вы хотите получить только рассылку за самый последний день , тогда вы можете выбрать одинпройти алгоритм, как я описал.Однако, если вы хотите иметь правильное распределение по количествам в каждый день , вам также потребуется выполнить обратный проход.Следовательно, метко названный алгоритм прямого-обратного .У меня есть ощущение, что, поскольку вы хотите вернуться на шаг назад и удалить ребра, вы, вероятно, захотите распределение на все дни (в отличие от того, что я изначально предполагал).Конечно, вы заметили, что есть информация, которую можно использовать, чтобы, так сказать, «будущее могло информировать прошлое», и это как раз та причина, по которой вам нужно сделать обратный проход, это не так сложно, у вас просто естьзапустить точно такой же алгоритм, начиная с конца цепочки.Для хорошего обзора ознакомьтесь с 6-частным руководством Кристофера Бишопа на videolectures.net.

Поскольку вы упомянули добавление / удаление ребер, позвольте мне пояснить алгоритм, который я описал ранее, имейте в виду, что это для одного прямого прохода.Пусть будет в общей сложности N возможных перестановок величин, поэтому у вас будет состояние убеждения, которое состоит из разреженного вектора длиной N элементов (называемого v_0).На первом этапе вы получаете наблюдение за суммой, и вы заполняете вектор, устанавливая все возможные значения с вероятностью 1,0, а затем повторно нормализуете.На следующем шаге вы создаете новый разреженный вектор (v_1) всех 0, перебираете все ненулевые записи в v_0 и увеличиваете (по вероятности в v_0) все записи в v_1, которые находятся в пределах 5%.Затем обнулите все записи в v_1, которые невозможны в соответствии с новым наблюдением, затем повторно нормализуйте v_1 и отбросьте v_0.повторить навсегда, v_1 ​​всегда будет правильным распределением возможностей.

Кстати, все может стать намного сложнее, чем это, если у вас есть шумные наблюдения или очень большие состояния или непрерывные состояния.По этой причине довольно сложно прочитать некоторые материалы по статистическому выводу;это довольно общее.

...