马尔可夫链预测
一、直观理解:下一步只依赖当前状态
马尔可夫链把研究对象看成在有限个状态之间跳转。核心假设是:
已知现在处于哪个状态,未来如何转移只与现在有关,与更早的历史无关。
例如空气质量可分成“优、良、轻度污染、中度污染”四个等级。若今天是“良”,则明天落到各等级的概率由一张转移表给出,而不再细究“前天、大前天”的路径。
这与 ARIMA 等连续值模型不同:马尔可夫链直接对离散状态的概率分布做预测,天然适合等级预报、景气区间、设备工况切换等问题。若原始数据是连续的,需要先按阈值或业务规则离散化成状态。
一阶马尔可夫假设往往是近似。若真实过程有较长记忆,应考虑高阶马尔可夫,或改用时间序列模型。
二、适用场景与优缺点
| 类型 | 说明 |
|---|---|
| 适用场景 | 状态本身是离散等级;需要预测下一期状态概率而非精确数值;样本足以估计转移频率;系统在中短期内转移机制相对稳定。 |
| 核心优点 | 形式简单、可解释性强;输出是完整的概率分布;便于与决策阈值结合(如“进入高风险状态的概率”);对短期状态切换很直观。 |
| 局限与缺点 | 连续信息在离散化时损失;强依赖平稳转移假设;状态划分主观;样本少时转移概率估计很不稳定;不直接给出连续数值的点预测。 |
使用前应确认:
- 状态定义是否有业务含义,边界是否清晰;
- 历史序列是否长到让多数转移都出现过若干次;
- 是否存在明显的制度变迁(政策、季节结构大变);
- 评价时用的是状态命中率、对数似然,还是还原后的数值误差。
三、核心原理:状态分布按转移矩阵演进
设状态空间为 。一阶齐次马尔可夫链的转移概率为
每一行满足 ,。
若 时刻的状态分布(行向量)为 ,则
当链不可约、非周期且正常返时,存在平稳分布 。长期预测会趋向平稳分布,这提醒我们:马尔可夫链的多步预测会逐渐“忘掉”初值,不宜做过长外推。
1. 用频率估计转移矩阵
对训练期状态序列 ,记 为从 一步到 的次数,,则
若某状态从未出现,需要合并状态、贝叶斯平滑(加伪计数)或扩大样本。
2. 由连续变量构造状态
常见做法:
- 按分位数分成 档(如低/中/高);
- 按业务阈值(优良标准、警戒线);
- 按残差符号与幅度(见灰色–马尔可夫组合)。
离散化越粗,估计越稳,但信息损失越大;越细,则转移矩阵越稀疏。
四、预测步骤与评价
- 定义状态并得到状态序列;
- 仅用训练期估计 ;
- 以测试期起点的真实状态为 (独热向量),计算 ;
- 点预测可取 ,同时报告前几名概率;
- 若需要数值,可用各状态代表值(组中值)做概率加权:
评价建议:
- 状态预测:准确率、平衡准确率、混淆矩阵;
- 概率预测: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); % 注意边界与右端点处理
六、如何解释结果
论文中建议报告:
- 状态定义与划分依据(分位数 / 国标 / 残差区间);
- 训练期长度、各状态样本量、转移计数矩阵 ;
- 估计的 及是否使用平滑;
- 一步/多步预测准确率或对数损失,以及基线对比;
- 若做数值还原,代表值如何选取、误差多少;
- 平稳分布(可解 )与长期含义;
- 对非齐次可能(如旺季/淡季两套 )的讨论。
解释转移概率时,用自然语言写清:“若当前为中,则下一步仍为中的概率约 0.60,升至高的概率约 0.20”。避免把估计噪声当成稳定规律。
七、常见误区
1. 状态分得过细
太大时许多 ,矩阵不可靠。优先保证每个状态有足够出发次数。
2. 用全样本估计 再回头“预测”样本内状态
这会严重乐观。转移矩阵必须在训练期估计,在后续期评价。
3. 忽视非平稳转移
季节、政策、疫情等会使 随时间变。可分段估计,或引入体制转移模型,不能假装一张 永远成立。
4. 把多步预测当成精确路径
给出的是分布,不是唯一路径。应展示概率,而非只给一个 。
5. 连续预测问题强行套马尔可夫
若需要精确数值且序列有平滑动态,ARIMA/指数平滑通常更合适;马尔可夫更适合等级与区间修正场景。
八、小结
马尔可夫链预测的核心是:
把系统离散成有限状态,用转移矩阵把当前状态分布推到未来,输出概率而非只输出一个标签。
它结构清晰、解释友好,但离散化损失与平稳转移假设是硬约束。竞赛中应认真设计状态、在训练期外验证,并与简单基线比较;需要连续轨迹时,优先考虑时间序列模型,或采用“灰色/回归 + 马尔可夫残差修正”的组合策略。