跳到主要内容

马尔可夫链预测

一、直观理解:下一步只依赖当前状态​

马尔可夫链把研究对象看成在有限个状态之间跳转。核心假设是:

已知现在处于哪个状态,未来如何转移只与现在有关,与更早的历史无关。

例如空气质量可分成“优、良、轻度污染、中度污染”四个等级。若今天是“良”,则明天落到各等级的概率由一张转移表给出,而不再细究“前天、大前天”的路径。

这与 ARIMA 等连续值模型不同:马尔可夫链直接对离散状态的概率分布做预测,天然适合等级预报、景气区间、设备工况切换等问题。若原始数据是连续的,需要先按阈值或业务规则离散化成状态。

一阶马尔可夫假设往往是近似。若真实过程有较长记忆,应考虑高阶马尔可夫,或改用时间序列模型。

二、适用场景与优缺点​

类型说明
适用场景状态本身是离散等级;需要预测下一期状态概率而非精确数值;样本足以估计转移频率;系统在中短期内转移机制相对稳定。
核心优点形式简单、可解释性强;输出是完整的概率分布;便于与决策阈值结合(如“进入高风险状态的概率”);对短期状态切换很直观。
局限与缺点连续信息在离散化时损失;强依赖平稳转移假设;状态划分主观;样本少时转移概率估计很不稳定;不直接给出连续数值的点预测。

使用前应确认:

  1. 状态定义是否有业务含义,边界是否清晰;
  2. 历史序列是否长到让多数转移都出现过若干次;
  3. 是否存在明显的制度变迁(政策、季节结构大变);
  4. 评价时用的是状态命中率、对数似然,还是还原后的数值误差。

三、核心原理:状态分布按转移矩阵演进​

设状态空间为 {1,2,…,m}\{1,2,\ldots,m\}。一阶齐次马尔可夫链的转移概率为

pij=P(Xt+1=j∣Xt=i),P=(pij)m×mp_{ij}=P(X_{t+1}=j\mid X_t=i),\quad P=(p_{ij})_{m\times m}

每一行满足 ∑j=1mpij=1\sum_{j=1}^{m}p_{ij}=1,pij≥0p_{ij}\ge 0。

若 tt 时刻的状态分布(行向量)为 πt\pi_t,则

πt+1=πtP,πt+h=πtPh\pi_{t+1}=\pi_t P,\quad \pi_{t+h}=\pi_t P^h

当链不可约、非周期且正常返时,存在平稳分布 π=πP\pi=\pi P。长期预测会趋向平稳分布,这提醒我们:马尔可夫链的多步预测会逐渐“忘掉”初值,不宜做过长外推。

1. 用频率估计转移矩阵​

对训练期状态序列 s1,…,sTs_1,\ldots,s_T,记 nijn_{ij} 为从 ii 一步到 jj 的次数,ni⋅=∑jnijn_{i\cdot}=\sum_j n_{ij},则

p^ij=nijni⋅(ni⋅>0)\hat p_{ij}=\frac{n_{ij}}{n_{i\cdot}} \quad (n_{i\cdot}>0)

若某状态从未出现,需要合并状态、贝叶斯平滑(加伪计数)或扩大样本。

2. 由连续变量构造状态​

常见做法:

  • 按分位数分成 mm 档(如低/中/高);
  • 按业务阈值(优良标准、警戒线);
  • 按残差符号与幅度(见灰色–马尔可夫组合)。

离散化越粗,估计越稳,但信息损失越大;越细,则转移矩阵越稀疏。

四、预测步骤与评价​

  1. 定义状态并得到状态序列;
  2. 仅用训练期估计 PP;
  3. 以测试期起点的真实状态为 π0\pi_0(独热向量),计算 π1,π2,…\pi_1,\pi_2,\ldots;
  4. 点预测可取 s^t+h=arg⁡max⁡jπt+h(j)\hat s_{t+h}=\arg\max_j \pi_{t+h}(j),同时报告前几名概率;
  5. 若需要数值,可用各状态代表值(组中值)做概率加权:
y^t+1=∑j=1mπt+1(j) cj\hat y_{t+1}=\sum_{j=1}^{m}\pi_{t+1}(j)\,c_j

评价建议:

  • 状态预测:准确率、平衡准确率、混淆矩阵;
  • 概率预测:Brier 分数、对数损失;
  • 还原数值:RMSE/MAE,并与“永远预测众数状态”的基线比较。

五、MATLAB 示例​

下面用一段合成的等级序列估计转移矩阵,并做一步与多步概率预测。

%% 1. 构造示例状态序列(1=低, 2=中, 3=高)
rng(7);
T = 200;
Ptrue = [
0.70 0.25 0.05
0.20 0.60 0.20
0.10 0.30 0.60
];
s = zeros(T,1);
s(1) = 2;
for t = 1:T-1
s(t+1) = randsample(1:3, 1, true, Ptrue(s(t),:));
end

%% 2. 训练/测试划分(按时间)
T0 = 160;
sTrain = s(1:T0);
sTest = s(T0+1:end);

%% 3. 估计转移矩阵(加伪计数平滑,避免零概率)
m = 3;
alpha = 0.5; % Dirichlet 伪计数
N = alpha * ones(m, m);
for t = 1:numel(sTrain)-1
N(sTrain(t), sTrain(t+1)) = N(sTrain(t), sTrain(t+1)) + 1;
end
P = N ./ sum(N, 2);

disp("估计的转移矩阵 P:");
disp(P);

%% 4. 一步预测:用测试期每个真实状态预测下一状态
pi0 = full(sparse(1, sTest(1:end-1), 1, 1, m)); % 每行一个独热
% 更直观的循环写法:
yhat = zeros(numel(sTest)-1, 1);
yprob = zeros(numel(sTest)-1, m);
for i = 1:numel(sTest)-1
pi_next = zeros(1,m);
pi_next(sTest(i)) = 1;
pi_next = pi_next * P;
yprob(i,:) = pi_next;
[~, yhat(i)] = max(pi_next);
end

acc = mean(yhat == sTest(2:end));
fprintf("测试集一步状态准确率 = %.3f\n", acc);

%% 5. 从测试起点做 h 步分布演进
h = 5;
pi = zeros(1,m); pi(sTest(1)) = 1;
PI = zeros(h,m);
for k = 1:h
pi = pi * P;
PI(k,:) = pi;
end
disp("未来 1..5 步的状态概率:");
disp(array2table(PI, "VariableNames", ["低","中","高"]));

%% 6. 若状态对应数值代表值,可做数值预测
c = [10; 20; 30]; % 各状态代表值
y_num_hat = yprob * c;
y_num_true = c(sTest(2:end));
rmse = sqrt(mean((y_num_true - y_num_hat).^2));
fprintf("还原数值 RMSE = %.3f\n", rmse);

对真实题目,把 s 换成你的等级序列即可;连续变量可先用 discretize 分箱。

edges = quantile(yTrain, [0 1/3 2/3 1]); % 仅用训练集分位数
sAll = discretize(yAll, edges); % 注意边界与右端点处理

六、如何解释结果​

论文中建议报告:

  1. 状态定义与划分依据(分位数 / 国标 / 残差区间);
  2. 训练期长度、各状态样本量、转移计数矩阵 NN;
  3. 估计的 PP 及是否使用平滑;
  4. 一步/多步预测准确率或对数损失,以及基线对比;
  5. 若做数值还原,代表值如何选取、误差多少;
  6. 平稳分布(可解 π=πP\pi=\pi P)与长期含义;
  7. 对非齐次可能(如旺季/淡季两套 PP)的讨论。

解释转移概率时,用自然语言写清:“若当前为中,则下一步仍为中的概率约 0.60,升至高的概率约 0.20”。避免把估计噪声当成稳定规律。

七、常见误区​

1. 状态分得过细​

mm 太大时许多 nij=0n_{ij}=0,矩阵不可靠。优先保证每个状态有足够出发次数。

2. 用全样本估计 PP 再回头“预测”样本内状态​

这会严重乐观。转移矩阵必须在训练期估计,在后续期评价。

3. 忽视非平稳转移​

季节、政策、疫情等会使 PP 随时间变。可分段估计,或引入体制转移模型,不能假装一张 PP 永远成立。

4. 把多步预测当成精确路径​

PhP^h 给出的是分布,不是唯一路径。应展示概率,而非只给一个 arg⁡max⁡\arg\max。

5. 连续预测问题强行套马尔可夫​

若需要精确数值且序列有平滑动态,ARIMA/指数平滑通常更合适;马尔可夫更适合等级与区间修正场景。

八、小结​

马尔可夫链预测的核心是:

把系统离散成有限状态,用转移矩阵把当前状态分布推到未来,输出概率而非只输出一个标签。

它结构清晰、解释友好,但离散化损失与平稳转移假设是硬约束。竞赛中应认真设计状态、在训练期外验证,并与简单基线比较;需要连续轨迹时,优先考虑时间序列模型,或采用“灰色/回归 + 马尔可夫残差修正”的组合策略。