Gan tanya, ane bikin program java utk learning pake metode LM, masalahnya nilai mse nya gak berkurang, ane bingung dimana salahnya, ane coba itung manual, hasilnya gk jauh beda sama hsil running program ini cuplikan hitung jacobian:
Spoiler for "hitung jacobian" :
public void out_hid(String akt2,int hidden,double[]y,double[]z){
b2=new double[out];
for(int k=0;k<out;k++){
if(akt2.equals("bipolar")){
b2[k]=0.5*(1+y[k])*(1-y[k]);
}else if(akt2.equals("tangen")){
b2[k]=(1+y[k])*(1-y[k]);//1-Math.pow(Math.tanh(yin[k]),2);//(1+(1-Math.exp(-2*yin[k]))/(1+Math.exp(-2*yin[k])))*(1-(1-Math.exp(-2*yin[k]))/(1+Math.exp(-2*yin[k])));
}else if(akt2.equals("elliot")){
b2[k]=Math.pow((1-Math.abs(y[k])),2);//1/(Math.pow((1+Math.abs(yin[k])),2));
}
}
w=new double[hidden][out];
for(int i=0;i<hidden;i++){
for(int j=0;j<out;j++){
w[i][j]=b2[j]*z[i];
}
}
}
public void hid_in(String akt1,int hidden,double[]z,double[]x,double[][]w){
double sum_b1=0;
double[]deriv_z=new double[hidden];
b1=new double[hidden];
for(int k=0;k<hidden;k++){
if(akt1.equals("bipolar")){
deriv_z[k]=0.5*(1+z[k])*(1-z[k]);
}else if(akt1.equals("tangen")){
deriv_z[k]=(1+z[k])*(1-z[k]);//1-Math.pow(Math.tanh(zin[k]),2);//(1+(1-Math.exp(-2*zin[k]))/(1+Math.exp(-2*zin[k])))*(1-(1-Math.exp(-2*zin[k]))/(1+Math.exp(-2*zin[k])));
}else if(akt1.equals("elliot")){
deriv_z[k]=Math.pow((1-Math.abs(z[k])),2);
}
//hitung nilai d1
for(int j=0;j<out;j++){
sum_b1+=b2[j]*w[k][j];
//System.out.println(b2[j]*w[k][j]);
}b1[k]=sum_b1*deriv_z[k];sum_b1=0;
}
v=new double[in][hidden];
//hitung nilai koreksi bobot v
for(int i=0;i<in;i++){
for(int j=0;j<hidden;j++){
v[i][j]=b1[j]*x[i];
}
}
}
nanti hasil di atas ada bobot v, bias 1,bobot w, bias 2 disimpan utk setiap iterasinya dalam matriks jacobian. setelah kebentuk matriks jacobiannya nanti dipanggil fungsi koreksi bobot sprti ini:
Spoiler for "koreksi bobot" :
int all=(in*2)+2+(2*1)+1,input=4;
jt=new double[all][input];hess=new double[all][all];
mi=new double[all][all];hmi=new double[all][all];
gd=new double[all];upw=new double[all];x=new double[all][all];
double sum_gd=0,sum_h=0,sum_dw=0,sum_hess=0;
for(int i=0;i<input;i++){
for(int j=0;j<all;j++){
jt[j][i]=jacobian[i][j];
}
}
for(int i=0;i<all_w.length;i++){
for(int j=0;j<input;j++){
sum_gd+=jt[i][j]*err[j];
}gd[i]=sum_gd;sum_gd=0;
}
for(int i=0;i<all_w.length;i++){
for(int j=0;j<all_w.length;j++){
for(int k=0;k<input;k++){
sum_h+=jt[i][k]*jacobian[k][j];
}hess[i][j]=sum_h;sum_h=0;
}
}
for(int i=0;i<all_w.length;i++){
for(int j=0;j<all_w.length;j++){
if(i==j){mi[i][j]=miu;}
else mi[i][j]=0;
}
}
for(int i=0;i<all_w.length;i++){
for(int j=0;j<all_w.length;j++){
hmi[i][j]=hess[i][j]+mi[i][j];
}
}
Matrix a=new Basic2DMatrix(hmi);
Matrix h=a.inverse(Matrices.DEFAULT_INVERTOR);
for(int i=0;i<all;i++){
for(int j=0;j<all;j++){
hmi[i][j]=h.get(i, j);
}
}//System.out.println(h);
for(int i=0;i<all_w.length;i++){
for(int j=0;j<all_w.length;j++){
sum_dw+=hmi[i][j]*gd[j];
}upw[i]=all_w[i]-sum_dw;sum_dw=0;
}
int dekom=0;
v_=new double[in][hidden];
for(int i=0;i<in;i++){
for(int j=0;j<hidden;j++){
BigDecimal bd = new BigDecimal(upw[dekom]);
bd = bd.setScale(decimalPlace,BigDecimal.ROUND_UP);
v_[i][j]=bd.doubleValue();
dekom+=1;
}
}
b1_=new double[hidden];
for(int j=0;j<hidden;j++){
BigDecimal bd = new BigDecimal(upw[dekom]);
bd = bd.setScale(decimalPlace,BigDecimal.ROUND_UP);
b1_[j]=bd.doubleValue();;
dekom+=1;
}
w_=new double[hidden][out];
for(int j=0;j<hidden;j++){
for(int k=0;k<out;k++){
BigDecimal bd = new BigDecimal(upw[dekom]);
bd = bd.setScale(decimalPlace,BigDecimal.ROUND_UP);
w_[j][k]=bd.doubleValue();
dekom+=1;
}
}
b2_=new double[out];
for(int k=0;k<out;k++){
BigDecimal bd = new BigDecimal(upw[dekom]);
bd = bd.setScale(decimalPlace,BigDecimal.ROUND_UP);
b2_[k]=bd.doubleValue();
dekom+=1;
}
}
nah pas ane runut dari awal dihitung manual dan sibandingkan sama hasil perhitungan pake program, hasilnya sama, apa ada yg ane salah bikin ya? kenapa MSEnya gak turun2