系统模型阶选择问题
就是决定模型有多少自由度——太少拟合不好(欠拟合),太多就抓住噪声(过拟合)。
6.3.1概念
常见使用到选阶的模型如AR(p),MA(q),ARMA(p,q)等模型的阶p,q在实际中, 是一个待确定的参数,怎样确定最优的p值,是模型阶的确定问题。最优阶的选择也可以通过确定一定的目标准则得到最优解,Akaike较早研究了这个问题,并导出几个准则
1、最终预测误差准则(Final PredictionError,FPE),常用于 AR 模型选择,思路接近 AIC。

2、Akaike信息准则(Akaike Information Criterion,AIC),AIC=−2logL+2k,L 是模型的似然,k是参数数。倾向于稍复杂一点的模型(惩罚弱)。

3、最小描述长度准则(Minimizes The Description Length,MDL),信息论角度,类似 BIC。使准则函数最小的阶,确定为模型阶。

4、传输函数准则(Criterion Autoregressive Transfer Function,CAT),最小化准则函数的阶选为模型的阶。

遗憾的是,这几个模型阶的准则并不能总给出相同的模型阶估计,在缺乏先验信息的情况下,可以实验用不同准则确定的阶,并对最终的谱估计结果进行分析和选择。
6.3.2 最终预测误差准则(Final PredictionError,FPE)
1、背景及介绍
FPE 是由日本统计学家 赤池弘次(Hirotugu Akaike) 在 1969 年提出的。
他当时在研究时间序列的自回归模型(AR 模型),想找到一个可以定量衡量模型预测能力的指标。
FPE 是 一种模型阶数选择方法。当你用一个数学模型(比如自回归 AR 模型)去描述信号时,会遇到一个问题:我要用多少阶?也就是,用多少个过去的样本来预测现在的样本最合适?
阶太低 → 模型太笨,抓不住规律;阶太高 → 模型太聪明,连噪声也学进去。
FPE 准则的目的就是:
在“拟合得好”和“不过度复杂”之间找到平衡点。估计“这个模型在未来预测新数据时的平均误差有多大”,选最小的那个阶。
2、基本形式(以AR模型为例)
考虑一个 p 阶自回归模型:

其中:
-
xt 是信号;
-
et 是误差项(白噪声);
-
N是样本长度;
-
是残差的均方误差(模型拟合后留下的噪声能量)。
FPE 公式是:

1. 第一部分:![]()
它代表模型在训练数据上的拟合误差。
越小说明模型拟合得越好。
但是!模型复杂(高阶)时,残差方差总会更小,因为模型参数多,可以“强行”贴合数据。
这就是过拟合的危险。
2. 第二部分:![]()
这是惩罚项。
当 p 变大(模型更复杂)时,这个比值会迅速增大,对复杂模型进行惩罚。
总的来说:
-
若模型太简单 → 拟合误差大,FPE 大;
-
若模型太复杂 → 惩罚项变大,FPE 也大;
-
只有在最合适的阶数时,FPE 最小。
3、怎么选阶
1.设定一个可能的阶数范围,比如 p = 1 到 10
2.对每个 p:
-
拟合 AR(p) 模型;
-
计算残差方差
; -
套入公式
;
-
找到 FPE 最小的 p,就是最佳阶数。
4、matlab实现
1、思路流程
-
生成一个已知阶数的时间序列(例如 AR(3) 模型);
-
让 MATLAB 自动去尝试不同的阶;
-
计算每个模型的 FPE;
-
找到 FPE 最小的位置,就是“最佳阶数”
2、具体代码
%% -------------------------------
% 最终预测误差准则 (FPE) 自动选阶实战
% 作者:木夕水
% -------------------------------
clc; clear; close all;
% Step 1: 生成一个已知阶的 AR(3) 信号
N = 2500; % 样本长度
a_true = [1, -0.75, 0.5, -0.25]; % AR(3) 系数, 注意a1,a2,a3
noise = randn(N,1)*0.5; % 白噪声
x = filter(1, a_true, noise); % 生成信号
% Step 2: 设置候选阶数范围
maxOrder = 10; % 最大测试阶数
FPE_values = zeros(maxOrder,1); % 存放每个阶的 FPE
% Step 3: 逐阶拟合并计算 FPE
for p = 1:maxOrder
model = ar(x, p, 'ls'); % 使用最小二乘法拟合 AR(p)
FPE_values(p) = fpe(model); % MATLAB自带函数 fpe(model)
end
% Step 4: 绘制结果
figure;
plot(1:maxOrder, FPE_values, 'bo-','LineWidth',1.5);
xlabel('模型阶数 p');
ylabel('最终预测误差 (FPE)');
title('FPE 准则选阶结果');
grid on;
% Step 5: 找出FPE最小点
[~, bestOrder] = min(FPE_values);
hold on;
plot(bestOrder, FPE_values(bestOrder), 'r*', 'MarkerSize',10, 'LineWidth',2);
text(bestOrder+0.3, FPE_values(bestOrder), sprintf(' 最佳阶数 p = %d', bestOrder));
fprintf('基于 FPE 准则,最佳阶数为 p = %d\n', bestOrder);
3、代码讲解
Step 1:生成信号
filter(1, a_true, noise) 创建一个 AR(3) 信号。
这里的真实模型是:

(注意 MATLAB 的滤波器系数顺序与公式符号的关系。)
Step 2:定义候选阶数范围
我们打算从 1 阶到 10 阶试一遍,看哪个最合适。
Step 3:拟合模型并计算 FPE
ar(x,p,'ls') 使用最小二乘法估计 AR 模型参数。fpe(model) 是 MATLAB 内置函数,会根据 Akaike 公式计算:

这一步完全自动完成。
Step 4:绘制结果
FPE 随着阶数的变化一般呈“先下降后上升”的趋势,最低点就是最佳阶。
Step 5:输出结果
打印并标记出最佳阶数,通常应该接近我们生成信号时的真实阶(这里是 3)。
4、运行结果

运行后,你会看到一张折线图:
-
横轴:模型阶数 p
-
纵轴:对应的 FPE 值
FPE 曲线一般会在低阶时下降(模型越复杂拟合越好),
到某个点后上升(过拟合导致泛化能力下降)(数据量较少)。
曲线最低点对应的 p,就是最佳阶。
5、优缺点
| 优点 | 缺点 |
|---|---|
| 思想直观,计算简单 | 假设模型是线性、高斯、平稳的 |
| 能很好地处理中等样本量 | 当样本太小(N≈p)时会不稳定(分母接近 0) |
| 与预测性能直接相关 | 对非线性或非平稳序列效果有限 |
6.3.3 Akaike信息准则(Akaike Information Criterion,AIC)
1、背景及介绍
AIC与FPE都是通过计算“未来预测误差的估计”来选阶,只是FPE 从“预测误差”的角度看,AIC 从“信息量”角度看。FPE 关注“误差的大小”,AIC 关注“信息的损失”,结果指向一样,既不太傻也别太精。
AIC不是凭空蹦出来的“神秘公式”,而是对“模型在未来样本上的平均预测误差”的一种数学近似。Akaike 当年(1973 年)从统计推断的角度,把“预测”问题变成了一个关于信息量的度量。
Akaike 认为,一个模型的优劣在于它和真实系统之间的信息距离。如果你有一个真实的数据生成过程 f(x),和一个你自己假设的模型 g(x∣θ),那模型越接近真相越好。
AIC 本质上是 FPE 的统计推广版。只是 FPE 针对线性高斯模型推导,而 AIC 是更一般的形式(用信息论表述)。
2、基本形式
假设模型是线性高斯的,例如

AIC准则为:

L:模型的似然(likelihood),就是模型对数据的拟合好坏。拟合越好,L 越大。
−2ln(L):把“拟合好坏”换成一个“误差形式”的分数,越小越好。
k:模型中要估计的参数个数(模型阶数相关)。
2k:惩罚项——模型越复杂,惩罚越重。
AIC = 拟合误差 + 模型复杂度惩罚
AIC常见公式形式

其中
N:样本点个数。
:当模型阶数为 p 时的残差方差。
p:模型的阶数,也就是参数数目。
3、如何选阶
我们试探模型该多复杂,可以从 1 阶、2 阶、3 阶……一直到10 阶,每试一个阶,就计算它的 AIC。然后选出 AIC 最小 的那个阶数。那一阶的模型,就被认为是“既不过拟合又不欠拟合”的最优模型。
4、matlab实现
1、思路流程
-
生成一个已知阶数的时间序列(例如 AR(3) 模型);
-
让 MATLAB 自动去尝试不同的阶;
-
计算每个模型的 AIC;
-
找到 AIC 最小的位置,就是“最佳阶数”
2、完整代码
%% -------------------------------
% AIC准则 ( AIC) 自动选阶实战
% 作者:木夕水
% -------------------------------
clear; clc; close all;
% 1. 生成一个明显的 AR(3) 信号
N = 1000; % 样本点数足够长
rng(1); % 固定随机数种子
a_true = [1, -0.75, 0.5, -0.25]; % 真实AR(3)系数
e = randn(N,1); % 高斯白噪声
y = filter(1, a_true, e); % 生成信号
% 2. 设置要尝试的最大阶数
maxOrder = 15;
aic_values = zeros(maxOrder,1);
% 3. 用更鲁棒的Burg方法计算每个阶的AIC
for p = 1:maxOrder
model = ar(y, p, 'burg'); % Burg方法估计
noise_var = model.NoiseVariance; % 残差方差
N = length(y);
aic_values(p) = N * log(noise_var) + 2 * p; % AIC公式
end
% 4. 找出AIC最小对应的最优阶
[~, bestOrder] = min(aic_values);
% 5. 绘制AIC曲线
figure;
plot(1:maxOrder, aic_values, 'o-', 'LineWidth', 1.5, 'MarkerSize', 7);
hold on;
plot(bestOrder, aic_values(bestOrder), 'rp', 'MarkerFaceColor', 'r', 'MarkerSize', 12);
text(bestOrder+0.5, aic_values(bestOrder), ...
[' 最优阶 = ', num2str(bestOrder)], 'FontSize', 12, 'Color', 'r');
xlabel('模型阶数 p');
ylabel('AIC 值');
title('基于 AIC 的模型自动选阶');
grid on;
3、代码讲解
第一步,生成一个AR(3)信号
第二步,设置最大尝试阶数15
第三步,用burg方法计算每个阶的AIC
第四步,找出最小AIC值,并绘制曲线表示
4、运行结果

运行后,你会看到一张折线图:
-
横轴:模型阶数 p
-
纵轴:对应的AIC值
AIC 曲线通常呈“U”型。左边模型太简单,右边太复杂,谷底位置就是最佳阶数。
5、优缺点
| 优点 | 缺点 |
|---|---|
| 通用性强 | 容易过拟合 |
| 计算简单 | 依赖模型假设 |
| 预测性能良好 | 对小样本表现不佳 |
6.3.4 最小描述长度准则(Minimizes The Description Length,MDL)
1、背景及介绍
MDL 其实是AIC,更严格更保守的版本,MDL更严谨、更偏向真实模型选择,而不是单纯预测性能。哲学思想是:用一个模型把数据压缩得更短,那么这个模型更接近真实。让模型 + 残差的总描述长度最小。
一个好的模型应该:
-
不要太复杂(否则你要花很多字节描述模型本身);
-
要能解释数据(否则还得额外花字节描述误差部分)。
2、基本形式
对于AIC公式:

他有两个部分:
第一个部分
:模型拟合数据的好坏。越小越好;
第二个部分2p:模型复杂度惩罚。参数越多,惩罚越大。
MDL和AIC很想,只是惩罚更严格,MDL公式为:

它和 AIC 几乎一模一样,只是把惩罚项从固定的 2p 改成了随样本量增长的
。
这意味着:(1)当 N 很小时,AIC 和 MDL 差不多。(2)当 N 很大时,MDL 的惩罚会更强,更倾向于选更简单的模型。
其中:
-
N:样本长度
-
:该阶模型的残差方差 -
p:模型阶数
3、如何选阶
选出最优阶数
:
![]()
4、matlab实现
1、思路流程
-
生成一个已知阶数的时间序列(例如 AR(3) 模型);
-
让 MATLAB 自动去尝试不同的阶;
-
计算每个模型的 MDL;
-
找到 MDL 最小的位置,就是“最佳阶数”
2、完整代码
%% ----------------------------------------
% 基于 MDL(最小描述长度准则)的自动选阶实战
% 作者:木夕水
% ----------------------------------------
clear; clc; close all;
%% 1. 生成一个已知的 AR(3) 信号
N = 1000; % 信号长度(样本点数)
rng(1); % 固定随机数种子,保证结果可重复
a_true = [1, -0.75, 0.5, -0.25]; % 真实AR(3)系统参数
e = randn(N,1); % 生成白噪声(高斯随机数)
y = filter(1, a_true, e); % 根据AR系数生成信号
%% 2. 设置搜索范围:假设最大阶数为15
maxOrder = 15;
mdl_values = zeros(maxOrder,1); % 预分配数组用于存放MDL值
%% 3. 对每个候选阶数p计算MDL值
for p = 1:maxOrder
model = ar(y, p, 'burg'); % 用Burg算法估计AR(p)模型
noise_var = model.NoiseVariance; % 取出残差的方差
mdl_values(p) = N * log(noise_var) + p * log(N); % MDL公式
end
%% 4. 找出MDL最小值对应的最优阶
[~, bestOrder] = min(mdl_values);
%% 5. 绘制MDL曲线
figure;
plot(1:maxOrder, mdl_values, 'o-', 'LineWidth', 1.5, 'MarkerSize', 7);
hold on;
plot(bestOrder, mdl_values(bestOrder), 'rp', 'MarkerFaceColor', 'r', 'MarkerSize', 12);
text(bestOrder + 0.4, mdl_values(bestOrder), ...
['最优阶 = ', num2str(bestOrder)], 'FontSize', 12, 'Color', 'r');
xlabel('模型阶数 p');
ylabel('MDL 值');
title('基于 MDL 准则的模型自动选阶');
grid on;
3、代码讲解
1、生成信号,这一段用 filter 函数生成一个自回归信号(AR(3)):

2、搜索阶数范围,我们不知道信号真正的阶数是多少,所以从 1 阶、2 阶、…、15 阶都试一遍。每次都会计算一个 MDL 值,然后找最小的。
3、计算每个阶的MDL
ar(y, p, 'burg'):使用 Burg 方法 估计 AR(p) 模型,Burg 方法的优点是稳定、抗噪声好,它不会生成不稳定多项式(保证模型合理)。
noise_var:就是模型残差的方差(预测误差大小);
mdl_values(p) 按 MDL 公式计算。
4、选出最优阶,绘图显示。
找到 MDL 曲线的最小值所对应的阶数,这个 bestOrder 就是自动选出的最佳模型阶。曲线的最低点就是最佳阶。因为 MDL 惩罚更强,更偏好简单模型。
4、结果分析

运行后,你会看到一张折线图:
-
横轴:模型阶数 p
-
纵轴:对应的MDL值
MDL 曲线通常曲线略靠左,选出的阶数略小一点,因为MDL惩罚更强,更偏好简单模型。
5、优缺点
| 优点 | 缺点 |
|---|---|
| 理论坚实 | 可能欠拟合 |
| 惩罚更合理 | 若涉及非线性或非高斯模型,需要复杂编码估计过程 |
| 模型稳定性好 | 假设噪声独立同分布、模型族正确 |
6.3.5 传输函数准则(Criterion Autoregressive Transfer Function,CAT)
1、背景及介绍
这个准则不像 FPE、AIC、MDL 那样常出现在入门教材里,它是 Akaike 在研究线性动态系统(尤其是ARMAX模型)时提出的一种更广义的信息准则,主要用于在传递函数模型的辨识中自动选阶。我们可以把它理解为:AIC 的“传递函数版本”。
当我们用信号去辨识系统时,往往得到的是类似这样的传递函数:

也就是:

在实际操作中,并不知道分子多项式
的阶数是多少,也不知道分母
的阶数是多少。
CAT 准则就是用来自动选择这些阶数的。
它的思想跟 AIC、MDL 是一脉相承的——同样在平衡“拟合误差”和“模型复杂度”之间,但它特别针对传递函数模型的结构辨识问题。
如果要描述一个系统的输入–输出关系。系统越复杂(阶数越高),你就能更准确地拟合数据,但模型参数会越来越多。应该该取多高的阶数,既能很好地拟合系统,又不会让模型过于复杂。CAT从信息论的角度出发,把传递函数的参数个数当成“描述系统所需的信息量”,并引入一个惩罚项去控制模型复杂度。
2、基本形式
CAT 准则的形式与 AIC 类似,只不过考虑了传递函数模型的特点(输入–输出、噪声模型同时存在):

其中:
-
N:样本点数
-
:模型残差方差(拟合误差大小) -
:系统分母的阶数(反馈部分) -
:系统分子的阶数(输入部分) -
:输入输出之间的延迟阶数(dead time)
可以看到,CAT其实是 AIC 的自然扩展版,只是把“参数个数”改成了传递函数模型的三个关键维度。
3、matlab实现
1、完整代码
%% =====================================================
% 基于 CAT(传输函数准则)的自动选阶实战示例
% 作者:木夕水
% 说明:通过直观的热力图和误差趋势展示选阶结果
% =====================================================
clear; clc; close all;
%% 1. 构造一个已知系统:ARX(2,2,1)
N = 20000;
rng(2); % 固定随机数以保证复现性
u = randn(N,1); % 输入信号(白噪声)
a_true = [1, -0.5, 0.4]; % 分母系数 A(z)
b_true = [0, 0.8, -0.3]; % 分子系数 B(z)(延迟1)
e = 0.1 * randn(N,1); % 噪声信号
y = filter(b_true, a_true, u) + e; % 系统输出
data = iddata(y, u, 1); % 转为 System ID 格式
%% 2. 设置搜索范围
na_max = 6; % 分母阶数上限
nb_max = 6; % 分子阶数上限
nk = 1; % 输入延迟固定为1
CAT_val = zeros(na_max, nb_max); % 存放 CAT 值
%% 3. 遍历每一种模型结构,计算 CAT 值
for na = 1:na_max
for nb = 1:nb_max
% 估计ARX模型
model = arx(data, [na nb nk]);
% 用“一步预测误差”计算残差方差(避免过拟合)
y_pred = predict(model, data, 1);
residual = y - y_pred.y;
sigma2 = var(residual);
% 计算 CAT 准则
N = length(y);
CAT_val(na, nb) = N * log(sigma2) + 2 * (na + nb + nk);
end
end
%% 4. 找出 CAT 最小对应的模型阶数
[min_val, idx] = min(CAT_val(:));
[best_na, best_nb] = ind2sub(size(CAT_val), idx);
fprintf('最优模型阶数:na = %d, nb = %d, nk = %d\n', best_na, best_nb, nk);
fprintf('真实模型阶数:na = %d, nb = %d, nk = %d\n', ...
length(a_true)-1, length(b_true)-1, 1);
%% 5. 可视化结果一:热力图
figure;
imagesc(1:nb_max, 1:na_max, CAT_val);
set(gca, 'YDir', 'normal');
colorbar;
xlabel('分子阶数 nb');
ylabel('分母阶数 na');
title('基于 CAT 准则的模型阶数选择');
text(best_nb, best_na, '★', 'Color','r','FontSize',20, ...
'HorizontalAlignment','center','VerticalAlignment','middle');
grid on;
%% 6. 可视化结果二:CAT 值随阶数变化的趋势
figure;
plot(1:na_max, CAT_val(:, best_nb), 'o-', 'LineWidth', 1.5, 'MarkerSize', 7);
hold on;
plot(best_na, CAT_val(best_na, best_nb), 'rp', 'MarkerFaceColor', 'r', 'MarkerSize', 12);
xlabel('分母阶数 na');
ylabel('CAT 值');
title(['CAT随na变化趋势(nb固定为 ', num2str(best_nb), ')']);
grid on;
2、代码讲解
生成信号部分
用一个二阶传递函

模拟系统的输入输出关系,并加入少量高斯噪声。
搜索范围设定
我们让 na 和 nb 从 1 到 6 自动遍历(即最多允许 6 阶模型),
让 CAT 去判断在哪个点“信息量最优”。
模型拟合与残差计算
使用 arx() 拟合线性模型,再通过 predict() 得到一步预测输出。
预测误差的方差 sigma2 反映了模型的拟合优劣。
计算 CAT 值
用公式:
CAT = N * log(sigma2) + 2 * (na + nb + nk)
前半部分衡量误差大小,后半部分惩罚模型复杂度。
找出最优模型阶数
取 CAT 值最小的组合 (na, nb),认为是最佳结构。
4、结果分析

如图所示
最优模型阶数:na = 5, nb = 6, nk = 1
真实模型阶数:na = 2, nb = 2, nk = 1
CAT准则出现了欠拟合的情况。
4、优缺点
| 优点 | 缺点 |
|---|---|
| 对预测性能敏感 | 可能欠拟合 |
| 计算简洁 | 在噪声低时仍可能轻微过拟合 |
| 适合ARX系统 | 受模型结构影响大 |
更多推荐
所有评论(0)