Как стать автором
Обновить

Как мы используем цепи Маркова в оценке решений и поиске багов. Со скриптом на Python

Время на прочтение6 мин
Количество просмотров12K
Всего голосов 18: ↑18 и ↓0+18
Комментарии7

Комментарии 7

А инструменты для process mining — это из категории «специализированные, весьма дорогие инструменты с закрытым кодом»?
Зависит, для process mining большинство решений коммерческие, хотя есть и бесплатные опенсорсные — Apromore, например.
Но даже в них порог входа всё-таки повыше — пусть не финансовый, но экспертный.
Хотя если хочется, можно сказать, что эта статья про «process-mining на минималках».
А можете рассказать, какими инструментами сами пользуетесь, какие задачи решаете? Было бы интересно узнать
Огонь! Спасибо большое!
Я хотел занятся этой темой, но вы опередили.
Марков, оказывается, полезен не только для SEO.
Мы используем Маркова для отслеживания траекторий идентичных объектов в его вариации — методе Монте-Карло для марковских цепей (MCMC) :)
Можно чекнуть в посте здесь: habr.com/en/post/520628
Честно говоря, я по статье вообще не понял, к чему тут цепи Маркова. Мне показалось, что вы просто строите карту переходов по сайту, я даже решил, что это кликбейт какой-то, типа сделали тривиальную вещь, но вставили красивый термин. И только прочитав код я понял, что вы и правда строите матрицу переходов за N шагов и считаете вероятность попасть в определенные конечные состояния, так что да, цепь присутствует. И даже прикольная идея, спасибо.

Я выложил свой Python-скрипт для обучения цепей Маркова в открытый доступ

Простите, что встреваю с советами, но наверняка у вас в компании найдется python-разработчик, который сможет сделать код-ревью. Допилите с ним ваш код, это очень поможет и коду, и вам. Сейчас там есть как стилистические проблемы (копипаста вместо объявления переменных; вы не используете enumerate для итерирования по массивам, и много по мелочи), так и алгоритмические: для вычисления матрицы переходов вместо прохода циклом по всему массиву данных следовало бы загнать данные в pandas dataframe, дальше задублировать в нем второй столбец со сдвигом на одну строку вверх (чтобы у вас в одной строке датафрейма оказалось как предыдущее, так и новое состояние студента), и потом сделать просто groupby-aggregate по паре текущее-новое (удалив, естественно, строки, где окажутся события от разных студентов). Если в ваш код засунуть много данных, он будет работать долго, а пандас посчитает матрицу мгновенно.

АПД: да вы же просто неверно вычисляете матрицу переходов, потому что не обрабатываете последние строки. Вот тут:
    if data01[i][0] == data01[i+1][0]: #if the student is the same
        calc_matrix[states.index(data01[i][1])][states.index(data01[i+1][1])] += 1

надо еще сделать +1 в ячейке матрицы «из последнего состояния в себя», если student is not the same. Представьте себе терминальное состояние (1), в котором 99 юзеров умерло (больше мы их не видели), а один юзер случайно перешел в другое состояние (2). Вы должны были бы записать в TransitionMatrix строку (0.99 0.01), а вместо этого вы запишете (0 1).
Возможно, на ваших данных это как-то и работает (например, если у вас нет терминальных состояний, кроме end_states), но если в открытый доступ выкладываете, то так не годится.
Вот написал этот комментарий и вдруг увидел, что статье-то уже полтора года…
Зарегистрируйтесь на Хабре, чтобы оставить комментарий