Confuso com a implementação de cume do MATLAB

8

Eu tenho duas implementações diferentes ridgeno MATLAB. Um é simplesmente

  1. x=(AA+Iλ)1Ab

    (como visto na página de regressão de cume da Wikipedia ), com sendo a matriz de identidade das colunas de tamanho ( ) column ( ) eIA×A

  2. Estou simplesmente chamando o "cume" de Matlab com

    x = ridge(A, b, lambda)

Meu problema é que ambos retornam resultados diferentes. (1) retorna os resultados que eu quero (sei disso comparando resultados com outras pessoas), mas por que (2) não retorna os mesmos resultados?

Minha matriz é esparsa, é preenchida com 1% 1 e 99% 0. Algumas colunas contêm quase nenhum número 1. A maior diferença parece ser que o coeficiente para as colunas com muito poucos 1s está muito próximo de 0 em (1), mas pode estar bem longe de 0 em (2)A

Alguém tem alguma idéia de por que é diferente e como posso modificar a chamada em (2) para fornecer os mesmos resultados que (1)?

Susie G.
fonte
4
Meu palpite : Você está cálculo (1) em um uncentered e unscaled matriz, enquanto a chamada para ridge(de acordo com a documentação do MATLAB) indica que (como é padrão): Por padrão, b é calculado após a centralização e escalar os preditores de ter média 0 e desvio padrão 1. O modelo não inclui um termo constante e X não deve conter uma coluna de 1s. .
cardeal
Se a centralização e a escala forem o motivo, posso modificar "A" e "b" para que a chamada do Matlab dê o mesmo resultado que (1)?
21812 Susie G.
1
Oi Susie. Sim você pode. Primeiro, se houver uma coluna todo-constante (diferente de zero) em , remova-a. Agora, simplesmente centralize e dimensione antes de fazer a chamada . Você não precisa fazer nada para . AAridgeb
cardeal
(I têm ignorado detalhes de sparsity Quando centralização, a dispersão será quebrado por muito grande.. isto pode apresentar problemas computacionalmente.)A
cardeal

Respostas:

6

Este é um programa matlab para validar o que o cardeal disse, na verdade é devido à centralização e escalonamento

% Create A(10 by 3 matrix) and b(10 by 1 matrix)
A=rand(10,3);
b=rand(10,1);
lambda=0.01
% centering and scaling A 
s=std(A,0,1);
s=repmat(s,10,1);
A=(A-repmat(mean(A),10,1))./s;

%check the result
X1=inv(A'*A+eye(3)*lambda)*A'*b;
X2=ridge(b,A,lambda,1);

x1 então igual x2

user2874944
fonte
0

Você deve especializar a escala no cume como 0, para que pareça x = cume (A, b, lambda, 0). Nesse caso, a primeira linha de x é constante e o restante são os coeficientes. Em outras palavras, x (2: end, :) deve ser o mesmo resultado obtido com o uso de (1). Isto está claramente indicado na documentação do mathlab. Esperando que isso ajude.

吴 京城
fonte