1 votos

Ayuda en la ampliación de mínimos cuadrados para coeficientes dispersos

Mi observación y se obtiene del modelo, $y(n) = \sum_{i=0}^{p-1} r(i) x(n-i) + v(n)$ donde r son los coeficientes del canal disperso, x es la entrada unidimensional y v es un ruido gaussiano blanco aditivo de media cero. y = filter(.) se utiliza para modelar la ecuación anterior y así crear un filtro FIR o un modelo de media móvil (MA). El orden del modelo MA es p=3 .

Así que, $y = [y(1),y(2),....,y(100)]$ es un vector de 100 elementos. Estoy generando ruido de varianza 0.1 Quiero estimar los coeficientes del canal disperso utilizando LASSO. Como hay p los coeficientes de los canales, debería obtener p estimaciones.

Según la ecuación de LASSO, ||rx - y||_2^2 + lambda * ||r||_1 Estoy estimando los coeficientes dispersos, r . Como la matriz de coeficientes reales contiene p elementos, debería obtener p elementos estimados. No estoy muy seguro de que esta sea la forma de hacerlo. No he encontrado ningún ejemplo sobre la aplicación de LASSO a un modelo de serie temporal univariante como ARMA. No sé cómo estimar los coeficientes dispersos utilizando el algoritmo apropiado y necesito ayuda.

La primera parte de la ecuación : $||rx - y||_2^2$ es una formulación de mínimos cuadrados que puedo resolver utilizando el enfoque de mínimos cuadrados. Para aplicar el enfoque de mínimos cuadrados, tengo que organizar la entrada en términos de regresores. Sin embargo, si los coeficientes $\mathbf{r}$ son escasas, entonces debería utilizar el enfoque LASSO. He intentado utilizar la función LASSO de Matlab. Para LASSO, he reordenado los datos de entrada $x$ en términos de regresores, pero no sé si este es el enfoque correcto.

Necesito ayuda. ¿Existe un enfoque para incluir el término de escasez en el LS?

A continuación se muestra el código de LASSO utilizando la función de Matlab. Como ejemplo de juguete estoy asumiendo que el orden del modelo es de lag 3 pero sé que LASSO puede ser aplicado eficientemente a un modelo grande. Puedo probar para un modelo MA de mayor orden que tenga un retardo > 3.


% 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);

SALIDA :

Las estimaciones devueltas son r_hat_lasso = 0, 0.657002829714982, 0

Pregunta : Esto difiere mucho de la realidad r . ¿Estoy entendiendo mal?


ACTUALIZACIÓN : Basándome en la respuesta, he intentado aplicar LASSO a un modelo MA grande con 89 rezagos. Estoy tratando de encontrar lambda utilizando la validación cruzada. He dividido los datos en muestra de entrenamiento y muestra de retención denotada por las variables iTr y iHo respectivamente. Quiero calcular el error cuadrático medio de predicción entre las muestras retenidas en y y la predicción y obtenidos con las estimaciones. Estoy obteniendo valores erróneos para el MSE y no puedo entender qué coeficientes estimados utilizar con las muestras retenidas en las líneas [r_hat_lasso, FitInfo] = lasso(X1(iTr,1:end), y(iTr));

[rhatLASSO,stats] = lasso(X1(iTr,2:end),y(iTr),'CV',10);

yLasso = X1(iHo,:)*rLasso;

Estoy recibiendo NaN como el error. ¿Necesita ayuda con el método correcto para utilizar la validación cruzada y calcular el MSE? El código está abajo:

clear all
clc
    %Generate input
    N=200;
   x=(randn(1,N)*100);
    L = 90;
    Num_lags = 1:89;
    r = 1+randn(L,1);
    %Data preparation into regressors    
    r(rand(L,1)<.7)=0; % 70 of the coefficients are zero
    X1 = lagmatrix(x, [0 Num_lags]);

     y=X1*r ;

% %Estimation
 iTr = rand(N,1)<0.5; %training
 iHo = ~iTr;  % holdout

% %LASSO
 [r_hat_lasso, FitInfo] = lasso(X1(iTr,1:end), y(iTr));
 [rhatLASSO,stats] = lasso(X1(iTr,2:end),y(iTr),'CV',10);

% %Picking the hyper parameter, lambda
lassoPlot(rhatLASSO,stats,'PlotType','CV');
rLasso = [stats.Intercept(stats.Index1SE);rhatLASSO(:,stats.Index1SE)];

 stats.Index1SE
% 
% %ans =
% 
%  %   87
%  %Evaluate predictions on holdout  samples
  yLasso = X1(iHo,:)*rLasso;

%  %Assess prediction error
 fprintf('---MSE in holdout sample---\n');

  fprintf('MSE LASSO:  %f\n',mean((y(iHo)-yLasso).^2));

SALIDA : MSE LASSO: NaN

2voto

beOn Puntos 820

En primer lugar:

¿Existe algún método para incluir el término de escasez en las LS?

Bueno, has escrito correctamente la función de costes: ||rx - y||_2^2 + lambda * ||r||_1 Esto se suele resolver con un método llamado descenso de coordenadas que Matlab utiliza en la función LASSO. Aparte de eso, no se puede utilizar una solución analítica de forma cerrada como en el caso de los mínimos cuadrados (también conocido como mínimos cuadrados ordinarios, y el método es mediante el uso de la función pseudoinverso ).

Ahora, para responder a su pregunta real, sí que hizo algo mal en la forma en que está construyendo el matriz de diseño ( X1 en su código). Esta matriz debe contener para cada fila el valor de cada regresor, es decir, para la fila n:

  • la primera columna debe ser x(n)
  • la segunda columna debe ser x(n-1)
  • tercera columna x(n-2)

Así que tendrás valores indefinidos para n < 3, puedes sustituirlos por nan o 0 o descartar que sean válidos.

Para crear esta matriz:

X1 = lagmatrix(x, [0 1 2]);
% If you also want to have intercept uncommment following line:
% X1 = [ones(length(x),1) X1];

Esta es la matriz que necesitas para encontrar el coeficiente de dichos modelos (ARMA). Contiene una columna para x, y la otra para las versiones desplazadas de x . El desfase máximo es el orden de su modelo MA.

NOTA : La matriz X1 contendrá entonces filas con NaN Por lo general, es mejor eliminarlos. Aunque aquí, el Matlab lasso se encarga de ello.

A continuación, ajuste para varios valores de lambda, utilizando la opción por defecto:

[r_hat_lasso, FitInfo] = lasso(X1, y);

r_hat_lasso contendrá valores de r para 39 lambdas diferentes en este caso. Y quieres elegir la que tiene el menor MSE (mira en FitInfo.MSE El primer elemento será el más bajo aquí: 0.0069 ). La lambda correspondiente es FitInfo.Lambda(1) = 0.0833 . Y:

r_hat_lasso(:,1)
% ans =
%   0.9708
%   0.0000
%   0.0000

O simplemente utilizar la lambda correcta directamente:

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

Finalmente para resolver este mismo problema con El mínimo cuadrado simplemente puedes hacerlo:

% Removing NaNs:
X1(1:2,:) = []; y(1:2) = [];

% Now LS solution using psuedo-inverse, here with Matlab's backslash:
r_hat_ls = X1\y(:);

Le dará r_hat_ls = [1 0 0] .


ACTUALIZACIÓN:

También olvidé que el lasso añadir el término de intercepción automáticamente para que no tenga que X1 = [ones(length(x),1) X1]; antes de llamar a lasso . Le aconsejo que media cero su y de todos modos, de manera que cualquier intercepción sería 0 .

En cuanto a su NaN viene del hecho de que X1 contiene filas con NaN (89 en su caso), por lo que y también los contiene al principio. Básicamente hay que imaginar que se trata de predictores que spann el tiempo 0 a t=0-89 donde, obviamente, no se sabe lo que viene antes de 0, por lo que los primeros 89 valores son ficticios. Simplemente hazlo:

%Generate input
N=200;
x=(randn(1,N)*100);
L = 90;
Num_lags = 1:L-1;
r = 1+randn(L,1);
%Data preparation into regressors    
r(rand(L,1)<.7)=0; % 70 of the coefficients are zero
X1 = lagmatrix(x, [0 Num_lags]);

% NOW REMOVING NANS:
X1(1:L-1,:) = [];
y=X1*r ; % Note that now: length(y) = N - 89 

%Estimation
iTr = rand(N-L+1,1)<0.5; %training
iHo = ~iTr;  % holdout

%LASSO
[rhatLASSO,stats] = lasso(X1(iTr,:),y(iTr),'CV',10); % also 'CV' here does the cross validation for you so you do not really have to redo it...

%Picking the hyper parameter, lambda
lassoPlot(rhatLASSO,stats,'PlotType','CV');
% To use intercept
X1_withIntercept = [ones(length(y),1) X1];
rLasso_withIntercept = [stats.Intercept(stats.Index1SE);rhatLASSO(:,stats.Index1SE)];

%Evaluate predictions on holdout  samples
yLasso1 = X1_withIntercept(iHo,:)*rLasso_withIntercept;
% Or without intercept:
yLasso2 = X1(iHo,:)*rhatLASSO(:,stats.Index1SE);

%Assess prediction error
fprintf('---MSE in holdout sample---\n');
fprintf('MSE LASSO with Intercept:  %f\nMSE LASSO without Intercept:  %f\n',mean((y(iHo)-yLasso1).^2), mean((y(iHo)-yLasso2).^2));

Considere también la posibilidad de tener N lo suficientemente grande como para entrenar de forma significativa (9 décimas, si hace una validación cruzada de 10 veces, de N debe ser significativamente mayor que su número de predictores, L ).

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X