Confus par l'implémentation de Ridge par MATLAB

8

J'ai deux implémentations différentes de ridgeMATLAB. L'un est tout simplement

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

    (comme on le voit sur la page de régression de crête de Wikipedia ), avecI étant la matrice d'identité des colonnes de taille (A) × Colonnes(A), et

  2. J'appelle simplement la "crête" de Matlab avec

    x = ridge(A, b, lambda)

Mon problème est que les deux retournent des résultats différents. (1) renvoie les résultats que je veux (je le sais en comparant les résultats avec d'autres personnes) mais pourquoi (2) ne renvoie pas les mêmes résultats?

Ma matrice Aest rare, il est rempli de 1% 1 et 99% 0. Certaines colonnes ne contiennent presque pas de 1. La plus grande différence semble être que le coefficient pour les colonnes avec très peu de 1 est très proche de 0 dans (1), mais peut être assez loin de 0 dans (2)

Quelqu'un a-t-il une idée de pourquoi c'est différent et comment je peux modifier l'appel dans (2) pour donner les mêmes résultats que (1)?

Susie G.
la source
4
Ma conjecture : vous calculez (1) sur une matrice non centrée et non mise à l' échelle , tandis que l'appel à ridge(selon la documentation MATLAB) indique que (comme c'est la norme): Par défaut, b est calculé après centrage et mise à l'échelle des prédicteurs pour avoir une moyenne 0 et écart-type 1. Le modèle n'inclut pas de terme constant et X ne doit pas contenir de colonne de 1. .
Cardinal
Si le centrage et la mise à l'échelle en sont la raison, puis-je modifier "A" et "b" pour que l'appel Matlab donne le même résultat que (1)?
Susie
1
Salut, Susie. Oui, vous pouvez. D'abord s'il y a une colonne toute constante (non nulle) dansA, retirez-le. Maintenant, il suffit de centrer et de mettre à l'échelleAavant d'appeler ridge. Vous ne devriez rien faire pourb.
Cardinal
(J'ai ignoré les détails de la rareté. Lors du centrage, la rareté sera cassée. Pour les très gros Acela peut introduire des problèmes de calcul.)
Cardinal

Réponses:

6

Ceci est un programme matlab pour valider ce que le cardinal a dit, il est en fait dû au centrage et à la mise à l'échelle

% 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 alors égal à x2

user2874944
la source
0

Vous devez spécialiser l'échelle de la crête à 0, de sorte qu'elle ressemble à x = crête (A, b, lambda, 0). Dans ce cas, la première ligne de x est constante et les autres sont les coefficients. En d'autres termes, x (2: end, :) devrait être le même résultat que celui obtenu en utilisant (1). Ceci est clairement indiqué dans la documentation de mathlab. En espérant que cela aide.

吴 京城
la source