如何将最小二乘估计应用于稀疏系数估计?

信息处理 有限脉冲响应 移动平均线 最小二乘 参数估计
2022-02-22 04:15:07

该模型表示为,

(1)y(n)=i=0p1r(i)x(ni)+v(n)
在哪里 r=[r1,r2,,rp]T是长度的稀疏通道系数p,x=[x1,x2,...,xnp]T是一维输入,v是零均值的加性高斯白噪声。y = filter(.)命令用于对上述方程进行建模,从而创建 FIR 滤波器或移动平均 (MA) 模型。MA 模型的阶数为p=3

所以,y=[y(1),y(2),....,y(100)]是 100 个元素的向量。我正在生成方差噪声0.1我想使用 LASSO 估计稀疏通道系数。由于有p通道系数,我应该得到p估计。

根据 LASSO 方程,||rx - y||_2^2 + lambda * ||r||_1我正在估计稀疏系数,r由于真正的系数数组包含p元素,我应该得到p估计的元素。我不太确定这是否是可行的方法。我还没有找到任何关于 LASSO 应用于单变量时间序列模型(如 ARMA)的示例。我不知道如何使用适当的算法估计稀疏系数,需要帮助。

方程的第一部分:||rxy||22是一个最小二乘公式,我可以使用最小二乘法求解。为了实现 LS,我必须根据回归量来安排输入。但是,如果系数,r是稀疏的,那么我应该使用 LASSO 方法。我尝试过使用 Matlab 的 LASSO 函数。对于 LASSO,我重新排列了输入数据x就回归量而言,但我不知道这是否是正确的方法。

我需要帮助。有没有办法在 LS 中包含稀疏项?

请在下面找到使用 Matlab 函数的 LASSO 代码。作为一个玩具示例,我只是假设模型顺序为滞后 3,但我知道 LASSO 可以有效地应用于大型模型。我可以测试滞后 > 3 的大阶 MA 模型。


% Code for LASSO estimation technique for 
%MA system, L = 3 is the order,  

%Generate input
 x = -5:.1:5;

r = [1    0.0   0.0];% L elements of the channel coefficients     
%Data preparation into regressors    
X1 = [ ones(length(x),1) x' x']; %first column treated as all ones since    x_1=1

y = filter(r,1,x); % Generate the MA model
[r_hat_lasso, FitInfo] = lasso(X1, y, 'alpha', 1, 'Lambda', 1, 'Standardize', 1);

输出 :

返回的估计是r_hat_lasso = 0, 0.657002829714982, 0

问:这与实际相差很大r这是错的吗?

1个回答

我不完全确定 matlab 的 LASSO 例程是做什么的,所以我从普通最小二乘法 (OLS) 开始并向后工作。从 OLS 的角度来看,您所拥有的 X1 是行不通的。您有一个与所有回归量一样的回归量,但您为示例数据 (r) 输入的参数不包含偏移量。本质上,您的模型不适合您的数据,这就是为什么您会得到一个奇怪的答案。

其次,你有重复的回归,这会让事情变得更加混乱。我已经重写了您的代码,以将您的回归量转换为使用 p = 3 将 MA 产生的三个输入对齐。

您可以对数据 X1 和 y 执行常规旧 OLS 以获得准确的输入 r。如果我使用 matlab 的 LASSO 函数,我可以获得 r 的正确分量,但它们被标量关闭。

    % Code for LASSO estimation technique for 
    %MA system, L = 3 is the order,  

    %Generate input
    x = -5:.1:5;
    xm = circshift(x,[0,1]);
    xm2 = circshift(x,[0,2]);

    r = 0.5*[1.0    1.0   0.0]'; % L elements of the channel coefficients     

    %Data preparation into regressors    
    X1 = [ x' xm' xm2'];

    y = X1*r;
    y1 = filter(r,1,x); % Generate the MA model, so I can plot and check.

    r_hat = X1'*X1\(X1'*y);

    [r_hat_lasso, FitInfo] = lasso(X1, y, 'alpha', 1, 'Lambda', 1, 'Standardize', 1);

输出:

    r_hat =
    0.5000
    0.5000
    0.0000

    r_hat_lasso =
    0.3235
    0.3231
         0