⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mfa.m

📁 基于matlab的bayes net toolbox,希望对大家能有些帮助
💻 M
字号:
% function [Lh,Ph,Mu,Pi,LL]=mfa(X,M,K,cyc,tol);% % Maximum Likelihood Mixture of Factor Analysis using EM%% X - data matrix% M - number of mixtures (default 1)% K - number of factors in each mixture (default 2)% cyc - maximum number of cycles of EM (default 100)% tol - termination tolerance (prop change in likelihood) (default 0.0001)%% Lh - factor loadings % Ph - diagonal uniquenesses matrix% Mu - mean vectors% Pi - priors% LL - log likelihood curve%% Iterates until a proportional change < tol in the log likelihood % or cyc steps of EM function [Lh, Ph,  Mu, Pi, LL] = mfa(X,M,K,cyc,tol)if nargin<5   tol=0.0001; end;if nargin<4   cyc=100; end;if nargin<3   K=2; end;if nargin<2   M=1; end;N=length(X(:,1));D=length(X(1,:));tiny=exp(-700);%rand('state',0);fprintf('\n');if (M==1)  [Lh,Ph,LL]=ffa(X,K,cyc,tol);  Mu=mean(X);  Pi=1;else  if N==1    mX = X;  else    mX=mean(X);  end  cX=cov(X);  scale=det(cX)^(1/D);  randn('state',0);   Lh=randn(D*M,K)*sqrt(scale/K);  Ph=diag(cX)+tiny;  Pi=ones(M,1)/M;  %randn('state',0);   Mu=randn(M,D)*sqrtm(cX)+ones(M,1)*mX;  oldMu=Mu;  I=eye(K);  lik=0;  LL=[];  H=zeros(N,M); 	% E(w|x)   EZ=zeros(N*M,K);  EZZ=zeros(K*M,K);  XX=zeros(D*M,D);  s=zeros(M,1);  const=(2*pi)^(-D/2);  %%%%%%%%%%%%%%%%%%%%  for i=1:cyc;    %%%% E Step %%%%    Phi=1./Ph;    Phid=diag(Phi);    for k=1:M      Lht=Lh((k-1)*D+1:k*D,:);      LP=Phid*Lht;      MM=Phid-LP*inv(I+Lht'*LP)*LP';      dM=sqrt(det(MM));      	      Xk=(X-ones(N,1)*Mu(k,:));       XM=Xk*MM;      H(:,k)=const*Pi(k)*dM*exp(-0.5*rsum(XM.*Xk)); 	      EZ((k-1)*N+1:k*N,:)=XM*Lht;    end;        Hsum=rsum(H);    oldlik=lik;    lik=sum(log(Hsum+(Hsum==0)*exp(-744)));    Hzero=(Hsum==0); Nz=sum(Hzero);     H(Hzero,:)=tiny*ones(Nz,M)/M;     Hsum(Hzero)=tiny*ones(Nz,1);        H=rdiv(H,Hsum); 				    s=csum(H);    s=s+(s==0)*tiny;    s2=sum(s)+tiny;        for k=1:M        kD=(k-1)*D+1:k*D;      Lht=Lh(kD,:);      LP=Phid*Lht;      MM=Phid-LP*inv(I+Lht'*LP)*LP';      Xk=(X-ones(N,1)*Mu(k,:));       XX(kD,:)=rprod(Xk,H(:,k))'*Xk/s(k);       beta=Lht'*MM;      EZZ((k-1)*K+1:k*K,:)=I-beta*Lht +beta*XX(kD,:)*beta';     end;    %%%% log likelihood %%%%    LL=[LL lik];    fprintf('cycle %g   \tlog likelihood %g ',i,lik);        if (i<=2)      likbase=lik;    elseif (lik<oldlik)       fprintf(' violation');    elseif ((lik-likbase)<(1 + tol)*(oldlik-likbase)|~finite(lik))       break;    end;    fprintf('\n');        %%%% M Step %%%%        % means and covariance structure        Ph=zeros(D,1);    for k=1:M      kD=(k-1)*D+1:k*D;      kK=(k-1)*K+1:k*K;      kN=(k-1)*N+1:k*N;      T0=rprod(X,H(:,k));      T1=T0'*[EZ(kN,:) ones(N,1)];      XH=EZ(kN,:)'*H(:,k);      T2=inv([s(k)*EZZ(kK,:) XH; XH' s(k)]);      T3=T1*T2;      Lh(kD,:)=T3(:,1:K);      Mu(k,:)=T3(:,K+1)';      T4=diag(T0'*X-T3*T1')/s2;      Ph=Ph+T4.*(T4>0);     end;    Phmin=exp(-700);    Ph=Ph.*(Ph>Phmin)+(Ph<=Phmin)*Phmin; % to avoid zero variances    % priors    Pi=s'/s2;      end;  fprintf('\n');end;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -