J'ai besoin de votre aide pour résoudre un petit problème qui concerne la décomposition en valeurs singulières SVD. Considérons la SVD d'une matrice connue
Où
Maintenant, considérons que les matrices
Merci.
fatal_error a écrit:slt,
ya un truc que je comprends pas, sur wiki
U(mxm) et V(nxn)
comment peux-tu écrire le produit UV (ou UV') ?
edit: ah: M est carrée
Du coup, si on part de la def, on a
M(m,n)=U(m,m)S(m,n)V'(n,n)
or M est carrée donc m==n, on a donc
M(n,n)=U(n,n)S(n,n)V'(n,n)
M=USV'
MV=US
MVU'=USU'
or (UV')=(VU')' donc si on pose K=UV', on a
MVU'=M(UV')'=MK', et si on pose A=MK', il reste à trouver
A=USU', avec S diagonale.
c'est juste une diagonalisation classique, plus orthonormalisation de U après!
Enfin, je pense
fatal_error a écrit:mais si tu fais une SVD, ta matrice S est censee etre composee des valeurs singulieres sur la diagonale nan?
M=[1 2;
3 4];
[U S V]=svd(M);
% USV'==M
K=U*V';
A=M*K';
[P lambda]=eig(A);
% il faut respecter l'ordre des valeurs propres de S
% lambda contient les meme valeurs mais pas forcement dans le meme ordre
[s, s_orderedIndex]=sort(diag(S));
[p, p_orderedIndex]=sort(diag(lambda));
n=length(orderedIndex);
U=zeros(n);
for i=1:n
% vector associated to lambda_i of S
s_vector_index=s_orderedIndex(i);
% vector associated to lambda_i of lambda
p_vector_index=p_orderedIndex(i);
U(:,s_vector_index)=P(:,p_vector_index);
U(:,s_vector_index)/=norm(U(:,s_vector_index)); %normalisation
end
expect0ForUOrthogonal=U-U'
%K'=VU'
%V'=U'inv(K')
%V=inv(K' )'U
V=inv(K' )'*U;
expect0ForUAndVFound=M-U*S*V'
fatal_error a écrit:un exemple simpliste avec octave:
je decompose M avec U et V.
Je cree K=UV'
et je pars du principe que je connais que :
K, S et M.
Puis on retrouve bien U et V
- Code: Tout sélectionner
M=[1 2;
3 4];
[U S V]=svd(M);
% USV'==M
K=U*V';
A=M*K';
[P lambda]=eig(A);
% il faut respecter l'ordre des valeurs propres de S
% lambda contient les meme valeurs mais pas forcement dans le meme ordre
[s, s_orderedIndex]=sort(diag(S));
[p, p_orderedIndex]=sort(diag(lambda));
n=length(orderedIndex);
U=zeros(n);
for i=1:n
% vector associated to lambda_i of S
s_vector_index=s_orderedIndex(i);
% vector associated to lambda_i of lambda
p_vector_index=p_orderedIndex(i);
U(:,s_vector_index)=P(:,p_vector_index);
U(:,s_vector_index)/=norm(U(:,s_vector_index)); %normalisation
end
expect0ForUOrthogonal=U-U'
%K'=VU'
%V'=U'inv(K')
%V=inv(K' )'U
V=inv(K' )'*U;
expect0ForUAndVFound=M-U*S*V'
expect0ForUOrthogonal =
0 0
0 0
expect0ForUAndVFound =
-1.0000 -6.0000
1.0000 -4.0000
U =
1.0000 1.0000
1.0000 1.0000
V =
0.3430 0.3430
1.3720 1.3720
M=[1 2;3 4];
[U S V]=svd(M);
K = U*V';
A = M*K';
[P lambda] = eig(A);
[s, s_orderedIndex] = sort(diag(S));
[p, p_orderedIndex] = sort(diag(lambda));
n = length(s_orderedIndex);
U = zeros(n);
for i=1:n
s_vector_index=s_orderedIndex(i);
p_vector_index=p_orderedIndex(i);
U(:,s_vector_index)=P(:,p_vector_index);
end
test=U-U'
V=inv(K' )'*U
expect0ForUAndVFound=M-U*S*V'
fatal_error a écrit:ben c'est clair que U est pas bonne parce que elle est pas orthogonale.
Moi j'ai runné le code sous octave et les résultats m'ont l'air ok.
Normaliser une matrice c'est pas censer rendre les vecteurs colinéaires!
Et sinon, pour me donner M,S et UV' j'étais obligé de me créer S puis la decomp U et V.
Libre à toi de te créer une [U V] reverseCrypt(M,S,K) mais à priori t'as l'essentiel dans le script!
fatal_error a écrit:non je ne revois pas mon code, c'est juste pour te donner une idée de la manière comment faire.
qui plus est parce que j'ai l'impression que t'essaies même pas de comprendre ce qui se passe.
ton code contient des erreurs de calcul et de compilation, mais la solution proposée est correcte
je t'ai demander de corriger ton code pour qu'on soit d'accord sur l'idée qu'on a pas besoin de normalisation
Drole de façon amicale d'aider les autres, je suis un informaticien expérimenté
fatal_error a écrit:si tu es d'accord avec la solution proposée, alors c'est bon. :lol3: Que mon code contient des erreurs de calculs, c'est pas important.
Ben non, le code ne montre rien. Si tu veux vérifier le besoin de normalisation c'est pas avec du code mais avec des maths.
Maintenant, si tu considères toujours la normalisation tu vois que dans une diagonalisation quelconque, tu cherches les vecteurs propres qui vont constituer U: Ax=lambda x, et que tout multiple de x est solution. Donc oui il faut la normalisation. C'est juste de la chance s'il s'avère que dans la décomposition d'octave, eig te retourne des vecteurs propres normés. Donc plutot voir l'API d'octave concernant eig pour t'assurer que les vecteurs sont normés auquel cas tu n'as pas besoin de les normer une fois de plus..
Ben je t'ai proposé une solution. Un code pour illustrer. Tout ce que tu fais c'est dire: ton code ne marche pas. Tu checkes pas si la décomposition de eig est correcte. Tu checkes pas si la matrice U construite est correcte (vecteurs othogonaux). Et l'erreur glissée dans le script est tellement grosse que mon petit doigt me dit que t'as pas bien regardé longtemps le problème!
PS: je suis aussi informaticien, c'est ptet pour ca que ca m'a fait ticker.
PS2: ya une différence entre: tu as une idée? et tu peux revoir ton code?
la deuxième question est passive.
je te concède que j'étais peut etre un peu abrupte. :hum:
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 65 invités
Tu pars déja ?
Identification
Pas encore inscrit ?
Ou identifiez-vous :