作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我不太明白这个马尔可夫...它需要两个词的前缀和后缀保存它们的列表并生成随机词?
/* 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);
}
}
最佳答案
根据维基百科,马尔可夫链是一个随机过程,其中下一个状态取决于前一个状态。这有点难以理解,所以我会尝试更好地解释它:
您看到的似乎是一个生成基于文本的马尔可夫链的程序。本质上,该算法如下:
例如,如果您查看此解决方案的第一句话,您可以得出以下频率表:
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 写了一个程序来做这件事。你可以阅读它here .
关于algorithm - 深入浅出地解释马尔可夫链算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4081662/
我在学习道路上遇到了一项任务。 对于均值 μ=np 和方差 σ**2=np(1−p) 的二项式分布 X∼Bp,n,我们希望上限概率 P (X≥c⋅μ) 对于 c≥1。三界介绍: Formulas 任务
给定以下马尔可夫矩阵: import numpy, scipy.linalg A = numpy.array([[0.9, 0.1],[0.15, 0.85]]) 平稳概率存在且等于[.6, .4]。
我是一名优秀的程序员,十分优秀!