1. 上图是要编的内容,图片中的 f 为log(1+lambda^T*(x_1 -mu)) +......+ log(1+lambda^T*(x_n -mu))
2.下面是我的两个程序,第一个是针对一维的,第二个是针对的多维的,按理说,在x是一维情况下,二者应该输出一样的结果。但是第一个很快可以运行出结果,第二个却不能;比如x=normrnd(0,1,10,1);EL1(x,0)很快出结果,但是第二个EL(x,0)却不能很快出来,事实上我也不知道第二个程序能不能运行出结果,想请教高手帮忙看看是不是第二个程序遍错了,有没有可以改进的地方?
多谢了,十分感谢!
第一个程序如下
- function [logelr,lambda,grad,pelrmu1,pelrmu2]=EL1(x,mu)lambda=0; k=0; gamma=1; y=1;while (abs(y)>(10^-8)) [F1,F2,F3,F4,F5]=f1(x,mu,lambda); y1=sum(F1); y2=sum(F2); y3=sum(F3); y4=sum(F4); y5=sum(F5); y=y2/y3; delta=gamma*y;while (sum(f1(x,mu,lambda-delta))< sum(f1(x,mu,lambda))) gamma=0.5*gamma; delta=gamma*y;endk=k+1;lambda=lambda-delta;gamma=1/sqrt(k+1);end lambda; logelr=2*y1; grad=y2; pelrmu1=y4; pelrmu2=y5;
其中函数f1如下
- function [F1,F2,F3,F4,F5]=f1(x,mu,lambda)
- w1=x-mu;
- w2=1+lambda.*(x-mu);
- F1=log(w2);
- F2=w1./w2;
- F3=-w1.*w1./(w2.*w2);
- F4=lambda./w2;
- F5=-lambda.*lambda./w2.*w2;
- end
- function [logelr,lambda,grad,pelrmu1,pelrmu2]=EL(x,mu)
- lambda=zeros(size(x,2),1); k=0; gamma=1; y1=0;y2=zeros(size(x,2),1);
- y3=zeros(size(x,2),size(x,2));y4=zeros(size(x,2),1);
- y5=zeros(size(x,2),size(x,2));y=1;
- while (norm(y,2)>(10^-8))
- for i=1:size(x,1)
- [F1,F2,F3,F4,F5]=f(x(i,:)',mu,lambda);
- y1=y1+F1;
- y2=y2+F2;
- y3=y3+F3;
- y4=y4+F4;
- y5=y5+F5;
- end
- y=y3\y2;
- z1=0;
- delta=gamma*y;
- for i=1:size(x,1)
- z1=z1+ f(x(i,:)',mu,lambda-delta);
- end
- while (z1< y1)
- gamma=0.5*gamma;
- delta=gamma*y;
- z1=0;
- for i=1:size(x,1)
- z1=z1+ f(x(i,:)',mu,lambda-delta);
- end
- end
- k=k+1;
- lambda=lambda-delta;
- gamma=1/sqrt(k+1);
- end
- lambda;
- logelr=2*y1;
- grad=y2;
- pelrmu1=y4;
- pelrmu2=y5;
- function [F1,F2,F3,F4,F5]=f(x,mu,lambda)
- w1=x-mu;
- w2=1+lambda'*(x-mu);
- F1=log(w2);
- F2=w1/w2;
- F3=-w1*w1'/(w2*w2);
- F4=lambda/w2;
- F5=-lambda*lambda'/w2*w2;
- end


雷达卡



京公网安备 11010802022788号







