新建脚本文件,最後得到的答案是錯的,運行了一個loop就結束了==
a=1:14;
b=1:3;
c=1:148; %代表矩陣維度
T=x(:,1:3);%目標數組
fai=ones(148,14);%輸入
fai(:,2:14)=x(:,4:16);
w=zeros(14,3);%w數組
e1=0.1;
e2=0.2;%前後兩個error值,方便比較error的變化
while(abs(e1-e2)>0.000001)
Ak=fai*w;%計算Ak
Ak=exp(Ak);
Ak(:,4)=sum(Ak,2);
e=0;
for n=c
for k=b
Y(n,k)=Ak(n,k)/Ak(n,4);%計算Y矩陣
e = e - T(n,k)*log(Y(n,k));%計算error函數
end
end
Y
e2=e1
e1=e
e_dev=zeros(3,14);%計算一階導數
for j=b
for n=c
e_dev(j,:)=(Y(n,j)-T(n,j))*fai(n)+e_dev(j,:);
end
end
H1=zeros(14,14);%計算Hessian矩陣
for n=c
H1 = H1 + Y(n,1)*(1-Y(n,1))*fai(n)‘ * fai(n);
end
H2=zeros(14,14);
for n=c
H2 = H2 + Y(n,2)*(1-Y(n,2))*fai(n)‘ * fai(n);
end
H3=zeros(14,14);
for n=c
H3 = H3 + Y(n,3)*(1-Y(n,3))*fai(n)‘ * fai(n);
end
%更新w值
w(:,1)=w(:,1)-pinv(H1)*e_dev(j,:)‘
w(:,2)=w(:,2)-pinv(H2)*e_dev(j,:)‘
w(:,3)=w(:,3)-pinv(H3)*e_dev(j,:)‘
end