在java中逐步询问levenberg-marquardt

时间:2013-05-21 04:19:22

标签: java algorithm

我正在尝试用Java编写levenberg marquardt,这是我的代码:

    while (iter <= 10 || mse < 0.0001) {
        call.calc_jacobian(ff, trainlm, input, akt1, akt2, w, x, t);
        double[][] jacobian = trainlm.ret_jacob();
        double[][] error = trainlm.ret_err();
        mse = trainlm.ret_mse() / 4;
        mse_all[iter] = mse;
        test: for (int m = 0; m <= 5; m++) {
            upb.koreksi_w(miu, hidden, jacobian, error, w);
            double[][] w_new = upb.ret_upw();
            call.test_ff(ff, trainlm, input, akt1, akt2, w_new, x, t);
            double mse2 = trainlm.ret_mse() / 4;
            if (mse2 < mse || m == 5) {
                miu = miu / beta;
                w_skrg = w_baru;
                iter++;
                break test;
            } else {
                miu = miu * beta;
            }
        }
    }

函数calc_jacobian是我用来计算前馈和后向传播操作以计算雅可比值的函数。函数koreksi_w用于使用雅可比,误差,miu和实际权重更新新权重,它会给出一个新权重,test_ff计算前馈以获得mse值。

我的问题是,当我尝试运行这些代码时,mse的值不会减少,因此我使用trainlm中的matlab函数来运行相同的输入&amp;重量,证明输入&amp;怀疑不是问题,在matlabmse减少。

1 个答案:

答案 0 :(得分:0)

我不明白你的一段代码,但你知道当你这么做时它是Integer division

mse = trainlm.ret_mse() / 4;  //OR:
double mse2 = trainlm.ret_mse() / 4;

正如你所期望的那样,我会建议演员或类似的东西:

double mse2 = trainlm.ret_mse() / (double)4; //OR:
double mse2 = trainlm.ret_mse() / 4.0;

还检查miu = miu / beta;beta是否为双倍?)

我怀疑MathLab执行浮点除法,其中java不...