将数据拟合到线性模型的问题

时间:2013-07-30 09:54:52

标签: matlab linear-regression

假设无噪声AR(1)过程y(t)= a*y(t-1)。我有以下概念性问题,并且很乐意澄清。

Q1 - 数学公式与实现之间的差异 - AR模型的数学公式为y(t) = - summmation over i=1 to p[a*y(t-p)] + eta(t),其中p =模型阶,eta(t)是白高斯噪声。但是当使用任何方法(如arburg()或最小二乘法)估算系数时,我们只需调用该函数。我不知道是否隐含地添加了白高斯噪声。然后,当我们用估计的系数解析AR方程时,我已经看到不考虑负号,也没有添加噪声项。

AR模型的正确表示是什么?当我只有1000个数据点的单个样本时,如何找到k次试验的平均系数?

Q2 - 如何为k次试验模拟fits_data然后找到残差的编码问题 - 我拟合了从未知系统生成的数据“数据”并通过

获得系数
load('data.txt');

for trials = 1:10

    model = ar(data,1,'ls');
    original_data=data;

    fitted_data(i)=coeff1*data(i-1); %  **OR**
    data(i)=coeff1*data(i-1); 

    fitted_data=data;

    residual= original_data - fitted_data;
    plot(original_data,'r'); hold on; plot(fitted_data);

end

当计算残差时,通过用获得的系数α解析AR方程,如上获得的fits_data? Matlab有这样做的功能,但我想做自己的。那么,在从原始数据中找到系数后,我该如何解决?上面的编码是不正确的。附件是原始数据和fits_data的图。Plot of original vs fitted data

2 个答案:

答案 0 :(得分:2)

如果您只使用标量y(n)= a*y(n-1)建模a,那么这就是解决方案。

y = randn(10, 1);
a = y(1 : end - 1) \ y(2 : end);

y_estim = y * a;
residual = y - y_estim;

当然,您应该将数据分成训练测试,并对测试数据应用a。您可以将此方法概括为y(n)= a*y(n-1) + b*y(n-2)等。

请注意,\代表mldivide()函数:mldivide

修改:

% model: y[n] = c + a*y(n-1) + b*y(n-2) +...+z*y(n-n_order)
n_order = 3;
allow_offset = true; % alows c in the model

% train
y_train = randn(20,1); % from your data
[y_in, y_out] = shifted_input(y_train, n_order, allow_offset);
a = y_in \ y_out;

% now test
y_test = randn(20,1); % from your data
[y_in, y_out] = shifted_input(y_test, n_order, allow_offset);
y_estim = y_in * a; % same a
residual = y_out - y_estim;

这里是shifted_input():

function [y_in, y_out] = shifted_input(y, n_order, allow_offset)
y_out = y(n_order + 1 : end);
n_rows = size(y, 1) - n_order;
y_in = nan(n_rows, n_order);
for k = 1 : n_order    
    y_in(:, k) = y(1 : n_rows);
    y = circshift(y, -1);
end
if allow_offset
    y_in = [y_in, ones(n_rows, 1)];
end
return

答案 1 :(得分:1)

AR型模型可用于多种目的,包括线性预测,线性预测编码,滤波噪声。 eta(t)不是我们感兴趣保留的东西,而是算法的一部分要点是通过在数据中寻找持久模式来尽可能地消除它们的影响。

我有教科书,在线性预测的上下文中,不包括总和之前表达式中包含的负号。另一方面,Matlab的函数lpc确实:

Xp(n) = -A(2)*X(n-1) - A(3)*X(n-2) - ... - A(N+1)*X(n-N)

我建议您查看函数lpc(如果尚未查看),并在文档中的examples处查看以下内容:

randn('state',0);
noise = randn(50000,1);  % Normalized white Gaussian noise
x = filter(1,[1 1/2 1/3 1/4],noise);
x = x(45904:50000);
% Compute the predictor coefficients, estimated signal, prediction error, and autocorrelation sequence of the prediction error: 
p = lpc(x,3);
est_x = filter([0 -p(2:end)],1,x);    % Estimated signal
e = x - est_x;                        % Prediction error
[acs,lags] = xcorr(e,'coeff');        % ACS of prediction error

估算的x计算为est_x。请注意该示例如何使用filter。再次引用matlab文档,filter(b,a,x)“是标准差分方程的”直接形式II转置“实现:

a(1)*y(n) = b(1)*x(n) + b(2)*x(n-1) + ... + b(nb+1)*x(n-nb)
                      - a(2)*y(n-1) - ... - a(na+1)*y(n-na)

表示在前面的示例中est_x(n)计算为

  est_x(n) = -p(2)*x(n-1) -p(3)*x(n-2) -p(4)*x(n-3)

这是你所期望的!

修改

关于函数ar,matlab documentation解释了输出系数与上面讨论的lp场景具有相同的含义。

评估AR模型输出的正确方法是计算

data_armod(i)= -coeff(2)*data(i-1) -coeff(3)*data(i-2) -coeff(4)*data(i-3) 

其中coeff是随

返回的系数矩阵
 model = ar(data,3,'ls');
 coeff = model.a;