• 沒有找到結果。

包含在主程式 main.m 的自建函數檔

一、波氏演算法(BaumWelch_Algorithm)--參數估算 function

[alpha,beta,app_A,app_B,app_pi,prob1]=BaumWelch_Algorithm(O,A,B,pi)

% (ㄧ) 算出 alpha,beta,P(Ow|λ)值

%% 正算程序

[alpha,probf]=Forward_procedure(O,A,B,pi);

%% 逆向算程序

[beta,probb]=Backward_procedure(O,A,B,pi);

%% 正算和逆算程序

[probfb]=FBward_procedure(O,A,alpha,beta);

% (二) GHMM 參數重估演算法,先定義兩個參數 phi,rho [phi,rho]=arg2(O,A,B,alpha,beta,probfb);

%% 3.符號狀態機率變動法

[app_A,app_B,app_pi]=em3(O,B,phi,rho);

% 由(二)GHMM 參數重估演算法之 3.符號狀態機率變動法,可產生我們所估來的隨 時間變動的 A 矩陣,B 矩陣和 pi 向量,可算出新的機率值((probw=連乘 w 的 P(Ow|

λnew))),取 rhog,用 rhog(sumw(P(Ow|λnew)))

[alpha,probf]=Forward_procedure(O,app_A,app_B,app_pi);

prob1=sum(log(probf));

二、 正算程序--算出 P(Ow|λ)值

function [alpha,probf]=Forward_procedure(O,A,B,pi)

% 1.定初始值 for w=1:size(O,1) for i=1:3

alpha(w,i,1)=pi(i)*B(i,O(w,1),1,w);

end end

% 2.產生遞迴正算變數 for t=1:size(O,2)-1 for j=1:3

for w=1:size(O,1) sumaA=0;

for i=1:3

sumaA=sumaA+alpha(w,i,t)*A(i,j,t);

end

alpha(w,j,t+1)=sumaA*B(j,O(w,t+1),t+1,w);

end end end

% 3.終止條件--probf=P(Ow|λ) for w=1:size(O,1)

probf(w)=0;

for i=1:3

probf(w)=probf(w)+alpha(w,i,size(O,2));

end

三、逆算程序--算出 P(Ow|λ)值

function [beta,probb]=Backward_procedure(O,A,B,pi)

% 1.定初始值 for i=1:3

for w=1:size(O,1)

beta(w,i,size(O,2))=1;

end end

% 2.產生遞迴逆算變數 for t=size(O,2)-1:-1:1 for i=1:3

for w=1:size(O,1) sumABb=0;

for j=1:3

sumABb=sumABb+A(i,j,t)*B(j,O(w,t+1),t+1,w)*beta(w,j,t+1);

end

beta(w,i,t)=sumABb;

end end end

% 3.終止條件--probb=P(Ow|λ) for w=1:size(O,1)

sumpBb=0;

for i=1:3

sumpBb=sumpBb+pi(i)*B(i,O(w,1),w)*beta(w,i,1);

end

probb(w)=sumpBb;

end

四、正算和逆算程序--算出 P(Ow|λ)值

function [probfb]=FBward_procedure(O,A,alpha,beta ) [W,T]=size(O);

for w=1:W for t=1:T sumab=0;

for i=1:3

sumab=sumab+alpha(w,i,t)*beta(w,i,t);

end end

probfb(w)=sumab;

end

五、先定義兩個參數 fa(w,i,j,t)=P(s(w,t)=i,s(w,t+1)=j|Ow, λ);lo(w,i,t)=P(s(w,t)=i|Ow,λ)

function [phi,rho]=arg2(O,A,B,alpha,beta,probf) [W,T]=size(O);

for w=1:W for i=1:3

for t=1:T-1

phi(w,i,j,t)=alpha(w,i,t)*A(i,j,t)*B(j,O(w,t+1),t+1,w)*beta(w,j,t+1)/

probf(w);

end end end end

for w=1:W for i=1:3 for t=1:T

rho(w,i,t)=alpha(w,i,t)*beta(w,i,t)/probf(w);

end end end

六、符號狀態機率變動法

% 估出 A,B,pi 的估計值 app_A,app_B,app_pi,且可檢驗矩陣的列和等於一,值的 小數點位數取到小數後第三位,且去除等於零的機率值(ps:app_A 取三列的平均 機率;且 0<pi2=a12<0.25,0<pi3=a13<0.05)

function [app_A,app_B,app_pi]=em22(O,B,phi,rho) [W,T]=size(O);

app_A=zeros(3,3,T-1);app_B=zeros(3,3,T,W);app_pi=zeros(1,3);

for t=1:T-1 for j=1:3 sumaphi=0;

sumarho=0;

for w=1:W for i=1:3

sumaphi=sumaphi+phi(w,i,j,t);

sumarho=sumarho+rho(w,i,t);

end end

if sumarho==0 sumarho=0.001;

end

for i=1:3

app_A(i,j,t)=sumaphi/sumarho;

end end end

% 每題組(兩題為一題組)間因相互獨立,因此題組間 app_A 均相等,取 app_A 三 列的平均機率

app_A1=app_A;

for t=2:2:T-1

app_A(:,:,t)=mean(app_A1(:,:,:),3);

end

%%% 可檢驗 app_A 矩陣的列和等於一,即 sum(app_A,2)=1 for i=1:3

for t=1:T-1

app_A(i,3,t)=0.001;

app_A(i,1,t)=app_A(i,1,t)-0.001;

end end end

for t=1:T-1 for i=1:3

if app_A(i,2,t)<app_A(i,3,t) a12=app_A(i,2,t);

a13=app_A(i,3,t);

app_A(i,2,t)=a13;

app_A(i,3,t)=a12;

end end

end for t=1:T for m=1:3 for j=1:3

sumbrho22=0;

for w=1:W if m==1

[ww,tt]=find(O==2 | O==3);

rhorho=rho;

for k=1:size(ww,1)

rhorho(ww(k),j,tt(k))=0;

end

newrho=sum(rhorho,1);

end if m==2

[ww,tt]=find(O==1 | O==3);

rhorho=rho;

for k=1:size(ww,1)

rhorho(ww(k),j,tt(k))=0;

end

newrho=sum(rhorho,1);

end if m==3

[ww,tt]=find(O==1 | O==2);

rhorho=rho;

for k=1:size(ww,1)

rhorho(ww(k),j,tt(k))=0;

end

newrho=sum(rhorho,1);

end

sumbrho22=sumbrho22+rho(w,j,t);

end

if sumbrho22==0 sumbrho22=0.001;

end

app_B(j,m,t,w)=newrho(1,j,t)/sumbrho22;

end end end

end

%%% 可檢驗 app_B 矩陣的列和等於一,即 sum(app_B,2)=1 for w=1:W

for t=1:T

app_B(:,3,t,w)=[0 0 1];

app_B(:,2,t,w)=1-app_B(:,1,t,w)-app_B(:,3,t,w);

end end

% 要使 app_B 矩陣裡的猜測答對符號(即為 c)<0.25 for w=1:W

for t=1:T

if app_B(2,1,t,w)>0.25

kk=0.1875+0.0625*rand(1);

app_B(2,2,t,w)=app_B(2,2,t,w)+(app_B(2,1,t,w)-kk);

app_B(2,1,t,w)=kk;

end end end

for i=1:3 sumrho=0;

for w=1:W

sumrho=sumrho+rho(w,i,1);

end

app_pi(i)=sumrho/W;

end

%%% 可檢驗 app_pi 矩陣的列和等於一,即 sum(app_pi,2)=1 if app_pi(3)==0

app_pi(3)=0.001;

app_pi(1)=app_pi(1)-0.001;

end

if app_pi(2)<app_pi(3) pi2=app_pi(2);

pi3=app_pi(3);

app_pi(2)=pi3;

app_pi(3)=pi2;

end

七、KN-IRT 估計法

function [KN_Ptheta,X,X1,est,KN_theta1,n]=KNIRT1(O) [W,T]=size(O);

X=zeros(W,T+1); % X 表受試者之測驗得分情形 rt=zeros(T+1); % rt 表試題 t 之「相關鑑別指數」

U=zeros(W,1); % U 表相關加權測驗總分 KN_Ptheta=zeros(W,T); %預設答對機率值矩陣 for w=1:W

if O(w,t)==1 % O 表受試 w 作答試題 t 答對與否之指示 變數

X(w,t)=1;

X(w,T+1)=X(w,T+1)+1;

else

X(w,t)=0;

end end

end for t=1:T

rt(t)=corr2(X(:,t),X(:,T+1));

u(t)=(1+rt(t))/2;

end

for w=1:W for t=1:T

U(w)=U(w)+u(t)*X(w,t); % U 表相關加權測驗總分 end

end

KN_theta=zscore(U); %受試者 w 之能力參數估計值 [m,n]=sort(KN_theta);

est_theta=zeros(W,1);

for w=1:W

X1(w,:)=X(n(w),:);

KN_theta1(w,:)=KN_theta(n(w),:);

end

est=norminv(1/(W+1):1/(W+1):W/(W+1),0,1);

%計算受試能力為 real_theta 者之試題 t 之「核平滑化無參數試題特徵曲線」

for t=1:T

for j=1:length(est) dem=0;

num=0;

for w=1:W

dem=dem+exp(-(W^0.4*(KN_theta(w)-est(j)).^2)/2.42);

num=num+exp(-(W^0.4*(KN_theta1(w)-est(j)).^2)/2.42).*X1(w,t);

end

KN_Ptheta(j,t)=num/dem; %答對機率函數 end

end

八、GHMM 與 KN-IRT 之整合估計 function

[GKN_Ptheta,GKN_theta1,gkn_t,gkn_p]=GHMM_KNIRT1(pi,A,c,KN_Ptheta,X1,e st)

[W,T]=size(KN_Ptheta);

U=zeros(W,1);

GKN_Ptheta=zeros(W,T); %已分離猜測及未答之無參數 IRT 特徵曲線

%計算已分離猜測及未答之無參數 IRT 特徵曲線 for w=1:W

GKN_Ptheta(w,1)=(KN_Ptheta(w,1)-pi(2)*c(1))/pi(1);

for t=2:T for w=1:W

GKN_Ptheta(w,t)=(KN_Ptheta(w,t)-A(1,2,t-1)*c(t))/A(1,1,t-1);

end end

%求已分離猜測及未答之無參數 IRT 受試者 w 之能力參數估計值 for w=1:W

U(w)=pi(1)*GKN_Ptheta(w,1);

for t=2:T

U(w)=U(w)+A(1,1,t-1)*GKN_Ptheta(w,t);

end end

GKN_theta1=zscore(U);

%已分離猜測及未答之無參數 IRT 特徵曲線遞迴重估

S=1;gk=zeros(100,1);count=1; %count 表遞迴重估次數 while S > 0.001

GKN_Ptheta=zeros(W,T); %已分離猜測及未答之無參數 IRT 特徵 曲線

for t=1:T

for w=1:length(est) dem=0;

num=0;

for j=1:W

num=num+exp(-(W^0.4*(GKN_theta1(j)-est(w)).^2)/2.42).*X1(j,t);

dem=dem+exp(-(W^0.4*(GKN_theta1(j)-est(w)).^2)/2.42);

end

GKN_Ptheta(w,t)=num/dem;

end end for w=1:W

GKN_Ptheta(w,1)=(GKN_Ptheta(w,1)-pi(2)*c(1))/pi(1);

end

for t=2:T for w=1:W

GKN_Ptheta(w,t)=(GKN_Ptheta(w,t)-A(1,2,t-1)*c(t))/A(1,1,t-1);

end end

for t=1:T for w=1:W

if GKN_Ptheta(w,t) >= 1 GKN_Ptheta(w,t)=0.9999;

end

if GKN_Ptheta(w,t) <= 0 GKN_Ptheta(w,t)=0.0001;

end end end

gkn_p(:,:,count)=GKN_Ptheta;%%測試用 U=zeros(W,1);

U(w)=pi(1)*GKN_Ptheta(w,1);

for t=2:T

U(w)=U(w)+A(1,1,t-1)*GKN_Ptheta(w,t);

end end

GKN_theta2=zscore(U); %下一次遞迴重估 theta V=0;

gkn_t(:,:,count)=GKN_theta1;%%測試用 for w=1:W

V=V+(GKN_theta2(w)-GKN_theta1(w))^2;

end S=V/W;

GKN_theta1=GKN_theta2;

gk(count)=S;

count=count+1;

end

%計算已分離猜測及未達之無參數 IRT 特徵曲線 P(theta) for t=1:T

for w=1:W dem=0;

num=0;

for j=1:W

num=num+exp(-(W^0.4*(GKN_theta1(j)-GKN_theta1(w)).^2)/2.42).*X1(j,t);

dem=dem+exp(-(W^0.4*(GKN_theta1(j)-GKN_theta1(w)).^2)/2.42);

end

GKN_Ptheta(w,t)=num/dem;

end end for w=1:W

GKN_Ptheta(w,1)=(GKN_Ptheta(w,1)-pi(2)*c(1))/pi(1);

end

for t=2:T for w=1:W

GKN_Ptheta(w,t)=(GKN_Ptheta(w,t)-A(1,2,t-1)*c(t))/A(1,1,t-1);

end end for t=1:T for w=1:W

if GKN_Ptheta(w,t) >= 1 GKN_Ptheta(w,t)=0.9999;

end

if GKN_Ptheta(w,t) <= 0 GKN_Ptheta(w,t)=0.0001;

end end end

九、估計作答策略變數矩陣

%% 3.估出新的 y:當 y0(w,t,3)=0,則 y(w,t,1)+y(w,t,2)=1 估出新的 y(w,t,1)

function y=e_y(O,U,y0,pi,c,Ptheta) [W,T]=size(O);

for w=1:W for t=1:T

if y0(w,t,3)==0 y(w,t,3)=0;

y(w,t,1)=(pi(1,1)*Ptheta(w,t)^U(w,t)*(1-Ptheta(w,t))^(1-U(w,t)))/(pi(

1,1)*Ptheta(w,t)^U(w,t)*(1-Ptheta(w,t))^(1-U(w,t))+pi(1,2)*c(t)^U(w,t )*(1-c(t))^(1-U(w,t)));

y(w,t,2)=(pi(1,2)*c(t)^U(w,t)*(1-c(t))^(1-U(w,t)))/(pi(1,1)*Ptheta(w, t)^U(w,t)*(1-Ptheta(w,t))^(1-U(w,t))+pi(1,2)*c(t)^U(w,t)*(1-c(t))^(1-U(w,t)));

else

y(w,t,3)=1;

y(w,t,1)=0;

y(w,t,2)=0;

end end end

%%% 可檢驗 當 y(w,t,3)=0,則 y(w,t,1)+y(w,t,2)=1;sum(y,3)=1

相關文件