java - 在 java 中逐步询问 levenberg-marquardt

标签 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 函数使用 Jacobian、error、miu 和实际权重更新新的权重,它会给出一个新的权重和 test_ff 计算前馈以获得 mse 值。

我的问题是,当我尝试运行这些代码时,mse 的值并没有减少,所以我使用 matlab 中的 trainlm 函数来运行相同的input & weight,证明 input & wight 不是问题,在 matlab 中,mse 减少了。

最佳答案

我不明白你的代码,但你确定你想要的是 Integer division 吗:

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

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

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

同时检查 miu = miu/beta;(beta 是双数吗?)

我怀疑 MathLab 会进行浮点除法,而 java 不会...

关于java - 在 java 中逐步询问 levenberg-marquardt,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16662087/

相关文章:

java - 将 @Primary 与 spring-context-indexer 一起使用

java - 重新安装 Eclipse 后,项目无法在 Eclipse 中打开

algorithm - 如何找到给定字符串及其等级的排列?

algorithm - 判断线性时间内是否存在包含给定边的 MST

algorithm - 是否可以有效地评估 lambda 演算项?

algorithm - 如何系统地计算给定类型的居民数量?

algorithm - 字符串的非重复字符

java - AspectJ 拦截器不工作

java - 可重入锁和同步的实现有何不同

java - 静态和动态语言中的依赖注入(inject)