Publié par : ecome | octobre 13, 2010

Quelques liens MATLAB

Je reprend du service avec Matlab et j’ai récolté quelques liens au passage que j’ai décidé de publier ici en me disant que cela pourrait peut être servir à quelqu’un. C’est assez divers, les deux premiers concernent une fonction Matlab que j’ai toujours cherchée et que j’ai enfin trouvée grâce à cet article (Loren and the art of Matlab).

Cette fonction permet de convertir des indices de matrice en index linéaire. Cela permet par exemple d’aller chercher tous les éléments d’une matrice correspondant à un vecteur d’indice ‘i’ et à un vecteur d’indice ‘j’ de même taille (pourvu que l’on connaisse la taille de la matrice). Plus d’info dans la doc (Convert subscripts to linear indices – MATLAB).

J’ai également trouvé cette illustration pédagogique intitulée « Simple illustration of the Jacobian determinant as a geometric scaling factor » assez bien faite et intéressante en particulier pour illustrer le changement de variable par transformation linéaire (ou non linéaire) d’une variable aléatoire (cf « http://en.wikipedia.org/wiki/Integration_by_substitution« ).

Enfin, le dernier liens concerne les méthodes de calculs de probas en échelles logarithmique afin d’éviter les problème de précision. C’est ce qu’il faut faire lorsque l’on code un EM lors de l’étape E pour calculer les probabilités a posteriori. Pour bien faire les choses, celles ci doivent en effet êtres stockées sur une échelle logarithmique afin d’éviter des problèmes de précision machine pouvant entrainer des division par zéros imaginaires. Alex smola explique assez bien l’astuce calculatoire dans ce post.

Et voila un extrait de code matlab pour utiliser cette astuce dans le cadre d’un mélange de Gaussienne.

% Calcul de log(p(y|k)) pour tous les k
% Solution.mu{i} moyenne de la classe i
% Solution.sigma{i} matrice de variance covariance de la classe i
% Solution.isigma{i} inverse de la matrice de variance covariance de la classe i
% Solution.pi{i} proportion de la classe i
% Xc{i} données centrées par rapport à Solution.mu{i}
for i=1:nbC
    llM(:,i)=-0.5*log(det(Solution.sigma{i}))...
               -d*0.5*log(2*pi)-0.5*sum(Xc{i}*Solution.isigma{i}.*Xc{i},2);
end
% Prise en compte des proportions
lTm = repmat(log([Solution.pi{:}]),N,1)+llM;
logfik2  = sort(lTm,2,'descend');
logsumfk = (logfik2(:,1) + log(ones(N,1) + ...
     sum(exp(logfik2(:,2:nbC) - logfik2(:,1)*ones(1,nbC-1)),2)))';
logtik   = lTm - logsumfk'*ones(1,nbC);
% calcul des probas a posteriori (n x k)
T  = exp(logtik);
Publicités

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

Catégories