Daniel@0: % function [lik, likv]=mfa_cl(X,Lh,Ph,Mu,Pi); Daniel@0: % Daniel@0: % Calculates log likelihoods of a data set under a mixture of factor Daniel@0: % analysis model. Daniel@0: % Daniel@0: % X - data matrix Daniel@0: % Lh - factor loadings Daniel@0: % Ph - diagonal uniquenesses matrix Daniel@0: % Mu - mean vectors Daniel@0: % Pi - priors Daniel@0: % Daniel@0: % lik - log likelihood of X Daniel@0: % likv - vector of log likelihoods Daniel@0: % Daniel@0: % If 0 or 1 output arguments requested, lik is returned. If 2 output Daniel@0: % arguments requested, [lik likv] is returned. Daniel@0: Daniel@0: function [lik, likv]=mfa_cl(X,Lh,Ph,Mu,Pi); Daniel@0: Daniel@0: N=length(X(:,1)); Daniel@0: D=length(X(1,:)); Daniel@0: K=length(Lh(1,:)); Daniel@0: M=length(Pi); Daniel@0: Daniel@0: if (abs(sum(Pi)-1) > 1e-6) Daniel@0: disp('ERROR: Pi should sum to 1'); Daniel@0: return; Daniel@0: elseif ((size(Lh) ~= [D*M K]) | (size(Ph) ~= [D 1]) | (size(Mu) ~= [M D]) ... Daniel@0: | (size(Pi) ~= [M 1] & size(Pi) ~= [1 M])) Daniel@0: disp('ERROR in input matrix sizes'); Daniel@0: return; Daniel@0: end; Daniel@0: Daniel@0: tiny=exp(-744); Daniel@0: const=(2*pi)^(-D/2); Daniel@0: Daniel@0: I=eye(K); Daniel@0: Phi=1./Ph; Daniel@0: Phid=diag(Phi); Daniel@0: for k=1:M Daniel@0: Lht=Lh((k-1)*D+1:k*D,:); Daniel@0: LP=Phid*Lht; Daniel@0: MM=Phid-LP*inv(I+Lht'*LP)*LP'; Daniel@0: dM=sqrt(det(MM)); Daniel@0: Xk=(X-ones(N,1)*Mu(k,:)); Daniel@0: XM=Xk*MM; Daniel@0: H(:,k)=const*Pi(k)*dM*exp(-0.5*sum((XM.*Xk)'))'; Daniel@0: end; Daniel@0: Daniel@0: Hsum=rsum(H); Daniel@0: Daniel@0: likv=log(Hsum+(Hsum==0)*tiny); Daniel@0: lik=sum(likv); Daniel@0: