以下是我的代码,图片中是我要编的内容,结果运行太慢或者根本运行不出来,注意这里的mu是多维的,请教高手帮忙改进,多谢了! 图中 f=log(1+lambda^T*(x_1-mu))+... ...log(1+lambda^T*(x_n - mu)) , T表示转置。
- 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;
复制代码
其中,上述程序中的函数 f(和图片中的f 不是一回事)如下:
- 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
复制代码