Nano Hash - криптовалюты, майнинг, программирование

Объясните алгоритм цепи Маркова простым языком.

Я не совсем понимаю этого Маркова... он берет два слова префикс и суффикс, копит их список и делает случайное слово?

    /* Copyright (C) 1999 Lucent Technologies */
/* Excerpted from 'The Practice of Programming' */
/* by Brian W. Kernighan and Rob Pike */

#include <time.h>
#include <iostream>
#include <string>
#include <deque>
#include <map>
#include <vector>

using namespace std;

const int  NPREF = 2;
const char NONWORD[] = "\n";    // cannot appear as real line: we remove newlines
const int  MAXGEN = 10000; // maximum words generated

typedef deque<string> Prefix;

map<Prefix, vector<string> > statetab; // prefix -> suffixes

void        build(Prefix&, istream&);
void        generate(int nwords);
void        add(Prefix&, const string&);

// markov main: markov-chain random text generation
int main(void)
{
    int nwords = MAXGEN;
    Prefix prefix;  // current input prefix

    srand(time(NULL));
    for (int i = 0; i < NPREF; i++)
        add(prefix, NONWORD);
    build(prefix, cin);
    add(prefix, NONWORD);
    generate(nwords);
    return 0;
}

// build: read input words, build state table
void build(Prefix& prefix, istream& in)
{
    string buf;

    while (in >> buf)
        add(prefix, buf);
}

// add: add word to suffix deque, update prefix
void add(Prefix& prefix, const string& s)
{
    if (prefix.size() == NPREF) {
        statetab[prefix].push_back(s);
        prefix.pop_front();
    }
    prefix.push_back(s);
}

// generate: produce output, one word per line
void generate(int nwords)
{
    Prefix prefix;
    int i;

    for (i = 0; i < NPREF; i++)
        add(prefix, NONWORD);
    for (i = 0; i < nwords; i++) {
        vector<string>& suf = statetab[prefix];
        const string& w = suf[rand() % suf.size()];
        if (w == NONWORD)
            break;
        cout << w << "\n";
        prefix.pop_front(); // advance
        prefix.push_back(w);
    }
}
02.11.2010

Ответы:


1

Согласно Википедии, цепь Маркова — это случайный процесс, в котором следующее состояние зависит от предыдущего состояния. Это немного сложно понять, поэтому я попытаюсь объяснить это лучше:

То, на что вы смотрите, похоже, является программой, которая генерирует текстовую цепь Маркова. Собственно алгоритм действий такой:

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

Например, если вы посмотрите на самое первое предложение этого решения, вы можете получить следующую таблицу частот:

According: to(100%)
to:        Wikipedia(100%)
Wikipedia: ,(100%)
a:         Markov(50%), random(50%)
Markov:    Chain(100%)
Chain:     is(100%)
is:        a(33%), dependent(33%), ...(33%)
random:    process(100%)
process:   with(100%)
.
.
.
better:    :(100%)

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

Shameless Plug. Некоторое время назад я написал для этого программу на Perl. Вы можете прочитать об этом здесь.

02.11.2010
  • @user432495: прочитайте статью в Википедии (en.wikipedia.org/wiki/Markov_chain) , особенно его использование. Эти текстовые генераторы могут использоваться спамерами, например, для того, чтобы обмануть детекторы. 04.11.2010
  • так что в основном это эвристика для создания базы данных словосочетаний или n-грамм последовательных событий для целей прогнозирования/моделирования? 05.11.2013

  • 2

    Цепи Маркова — это машины состояний, в которых переходы между состояниями являются вероятностями.

    Слово: Курица; возможные следующие слова : 10% - есть ; 30% - было; 50% - ноги; 10% - бегает;

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

    01.08.2013
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..