注意: 这是另一个用户一直试图(未成功)提出的问题。因为从本质上来说,问的多个问题要么被我删除(因为它们彼此重复),要么被用户删除,所以我试图以对用户有所帮助的方式提出问题,并且是非常适合该网站。
假设我有一个数据测量向量,,我想为该数据拟合一个模型:
其中每个sinusoids 参数化为和是具有零均值和方差的 iid 高斯白噪声过程.
我的问题是:我们如何使用AIC(或BIC或MDL)来估计模型顺序,?
维基百科条目只是说:
在哪里是似然函数。
我如何计算给定?
注意: 这是另一个用户一直试图(未成功)提出的问题。因为从本质上来说,问的多个问题要么被我删除(因为它们彼此重复),要么被用户删除,所以我试图以对用户有所帮助的方式提出问题,并且是非常适合该网站。
假设我有一个数据测量向量,,我想为该数据拟合一个模型:
我的问题是:我们如何使用AIC(或BIC或MDL)来估计模型顺序,?
维基百科条目只是说:
我如何计算给定?
多色调估计问题的 PDF(似然函数)为:
Djuric 的论文将 AIC 和 MDL 值引用为:
最后的代码尝试:
情节为是:
通常,AIC会高估模型阶数。在这种特殊情况下,AIC 得到 7,MDL 得到 5(正确值)。绘制每条曲线的最小值(如o
AIC 曲线+
上的 a 和 MDL 曲线上的 a)。
Djuric, PM,“高斯白噪声中正弦曲线的模型选择规则”,信号处理,IEEE Transactions on(第 44 卷,第 7 期),第 1744 - 1751 页。
scilab
代码仅在下面
P = 5;
f = [ 0.1 0.12 0.231 0.333 0.478634];
phi = [0.329847 5.90324 3.09834 4.907983 1.984];
a = [ 1 1 2 2 3];
sigma = 1;
N = 100;
x = cos(2*%pi*[0:N-1]'*f + ones(N,1)* phi )*a';
xn = x + sigma*rand(N,1,'normal');
function [L,LL] = likelihood(data,ahat,fhat,phihat,sigmahat)
N = length(data);
datahat = cos(2*%pi*[0:N-1]'*fhat + ones(N,1)* phihat )*ahat';
L = 1/(2*%pi*sigmahat*sigmahat)^(N/2) * exp(-1/(2*sigmahat*sigmahat)*sum((data - datahat).^2));
LL = - log(2*%pi*sigmahat*sigmahat)*N/2 - -1/(2*sigmahat*sigmahat)*sum((data - datahat).^2);
endfunction
function [a,m] = aic(p,L,N)
a = 3*p - log(L);
m = 3*p/2*log(N) - log(L);
endfunction
function [ahat,fhat,phihat,regr] = sin_estimate(data)
PAD = 10;
N = length(data);
DATA = fft([data; zeros((PAD-1)*N,1)],-1);
[mx,ix] = max(abs(DATA(1:N*PAD/2,1)));
ahat = mx/(N/2);
fhat = (ix-1)/N/PAD;
phihat = atan(imag(DATA(ix)),real(DATA(ix)));
regr = data - cos(2*%pi*[0:N-1]'*fhat + ones(N,1)* phihat )*ahat
endfunction
pValues = [1:60];
likeValues = [];
loglikeValues = [];
aicValues = [];
mdlValues = [];
for p=pValues,
signal = xn;
a_est = zeros(1,p);
f_est = zeros(1,p);
phi_est = zeros(1,p);
for pp=1:p
[a_est(pp),f_est(pp),phi_est(pp),signal] = sin_estimate(signal);
end
[l,ll] = likelihood(xn,a_est,f_est,phi_est,sigma);
likeValues = [likeValues l];
loglikeValues = [loglikeValues ll];
[aicv,mdlv] = aic(p,likeValues(p));
aicValues = [aicValues; aicv]
mdlValues = [mdlValues; mdlv]
end
clf;
plot(aicValues);
plot(mdlValues,'r');
title('AIC and MDL plots');