Сарказм

Пока я не начал активно использовать социальные сети, я не знал, что смайлик с улыбкой может быть саркастичным. Я сам много раз использовал смайлик с улыбкой, чтобы выразить выражение «хорошо!». Я видел, как другие тоже часто использовали их, чтобы выразить похожие выражения. Наблюдения и состояния разные. То, что мы видим или наблюдаем, может не дать реального представления о состоянии. Как говорится в цитате «у слона одни зубы, чтобы показать, а другие зубы, чтобы жевать», наблюдения и состояния иногда могут противоречить друг другу. Сарказм настоящий!

Бинита и смайлики

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

Итак, я могу сделать следующие наблюдения: смеяться, улыбаться и плакать, а состояния - счастливые и грустные. Наблюдения по мне видны, а состояний нет. Состояния скрыты от меня.

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

Код и моделирование

Давайте поместим то, что мы знаем до сих пор, в различные структуры данных Python.

States = («счастливый», «грустный»)

Теперь я предполагаю, что состояние счастья / грусти удовлетворяет свойству Маркова. Таким образом, ее состояние завтра зависит только от ее состояния сегодня, а не от ее вчерашнего и / или предыдущего состояния. Кроме того, я также предполагаю вероятности перехода и вероятности выбросов. Вероятности перехода дают вероятности перехода между различными состояниями. И вероятности выбросов дают вероятности наблюдений с учетом состояний.

Графическое представление скрытой марковской модели показано ниже:

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

наблюдения = («улыбка», «смех», «улыбка», «плач», «смех»)

Теперь моя задача - узнать состояния из наблюдений и вероятностей.

Первый день

Посмотрим на первый день. В первый день она прислала мне смайлики «улыбка». Она могла улыбаться, будучи счастливой или грустной. Смайлик «улыбка» может быть двояким. Либо она счастлива, и свое состояние она выразила с помощью смайлика «улыбка». Или она саркастична и присылает мне смайлики «улыбка».

Таким образом, вероятность того, что она счастлива в первый день, - это вероятность того, что она не саркастична в первый день, то есть она улыбнулась и счастлива в первый день. Точно так же вероятность того, что она грустит в первый день, - это вероятность того, что она саркастична в первый день, то есть она улыбнулась, хотя в первый день ей было грустно.

Итак, вероятность того, что она будет счастлива = вероятность того, что она улыбнется и будет счастлива
= вероятность того, что она будет счастлива * вероятность того, что она улыбнется после того, как будет счастлива
= 0,5 * 0,2
= 0,1

Точно так же
вероятность того, что ей будет грустно = вероятность того, что она улыбнется и будет грустно
= вероятность того, что ей будет грустно * вероятность того, что она улыбнется после того, как она станет грустной
= 0,5 * 0,3
= 0,15

Интересно! Согласно нашим предположениям, в первый день ей грустно. Боже, я должен был рассчитать вероятность только в этот день. Я мог бы попытаться изменить ее настроение: |

Давайте реализуем условие первого дня в коде Python. Однако одна деталь реализации: поскольку мы умножаем вероятности, мы можем получить очень и очень маленькие вероятности по мере продвижения. Мы применяем к ним логарифмы и вычисляем логарифмические вероятности, чтобы не иметь дело с экстремальными значениями.

Клавиша prev показывает ее состояние за предыдущий день. Поскольку в первый день нет предыдущего дня, мы пишем его как Нет.

За пределами первого дня

Теперь мы делаем то же самое в другие дни. Итак, мы используем цикл со второго до последнего дня. На каждый день прилагаем словарь. Словарь конкретного дня содержит все состояния в качестве ключа и вероятности, связанные со всеми состояниями, в качестве значения. У него есть одна пара "ключ-значение", заданная ключом prev, который дает состояние за предыдущий день. Клавиша prev может быть полезна для вычисления сложных вероятностей (в нашем случае логарифмических вероятностей).

Давайте возьмем пример второго дня и разберемся с алгоритмом.

Мы знаем ее состояние в первый день, перебирая все состояния в первый день и находя, какое состояние имеет максимальную логарифмическую вероятность. Сохраняем состояние в клавише prev. Затем мы переходим к вычислению вероятностей сложного логарифма всех состояний на второй день. Для этого мы используем вероятности перехода и выброса. В нашем примере мы видели, что она грустна в первый день. Итак, для расчета вероятности того, что она будет счастлива на второй день (с учетом того, что она издала смайлик смех), мы сначала вычисляем произведение вероятности ее перехода из состояния грустного состояние в состояние счастья и вероятность ее смеха, если она счастлива. Первую вероятность мы получили бы из матрицы вероятностей перехода, а вторую вероятность мы получили бы из матрицы вероятностей выбросов. В нашем случае первая вероятность, вероятность того, что она перейдет из состояния грустное в состояние счастливое, задается как transition_p ['sad'] ['happy '], а вторая вероятность, вероятность того, что она рассмеется, если она счастлива, дается выражением selection_p [' happy '] [' смех ']. Затем произведение умножается на наивысшую вероятность предыдущего дня (вероятность быть грустным в нашем случае, которая имела значение 0,15), и мы получаем вероятность перехода к текущему состоянию на второй день. Процесс продолжается до последнего дня, и у нас будет ее состояние на все дни.

Давайте запустим код и посмотрим, какие (логарифмические) вероятности мы получим.

Итак, мы видим список logprobabilities, который дает (log) вероятности всех состояний. Состояние первого дня можно определить по значению в prev клавише второго элемента. Здесь состояния первого, второго, третьего и четвертого дня: грустный, счастливый, счастливый и грустный соответственно. Состояние последнего (пятого) дня можно найти, посмотрев, какое состояние имеет наибольшую вероятность регистрации в последнем элементе списка. Как мы видим, состояние «счастливы» имеет наибольшую вероятность регистрации, она была счастлива в последний день.

Из пяти дней она была счастлива три дня и грустила два дня. Лучше, чем ее первоначальные вероятности, поэтому я доволен ее состояниями;)

Приложения

Здесь мы использовали алгоритм Витерби. Алгоритм представляет собой алгоритм динамического программирования для поиска наиболее вероятной последовательности скрытых состояний. Последовательность скрытых состояний называется путем Витерби. Использовать алгоритм для определения состояния супруга - это весело. Почему бы вам тоже не попробовать с вашим супругом, или BF, или GF, или лучшим другом, или любым другом?

Алгоритм можно использовать и во многих других приложениях. В школьные годы мне задавали вопрос на непальском экзамене, чтобы найти часть речи в предложении - पदवर्ग छुट्याउ. Это также можно сделать с помощью алгоритма Витерби - POS-тегов. Другие приложения включают распознавание речи, синтез речи, вычислительную лингвистику и многое другое.

Скоро будет больше информации об алгоритмах, следите за обновлениями! А пока дайте мне знать, что вы думаете об этой статье в разделе комментариев. Оставайся в безопасности, оставайся здоровым. :)