【问题标题】:Calculating Log and Exp of a value using Apache Commons使用 Apache Commons 计算一个值的 Log 和 Exp
【发布时间】:2014-07-09 02:21:09
【问题描述】:

我有一个死亡风险计算,需要确定自然对数和 exp 衰减。下面详细介绍该方法。我很想知道为什么计算 exp 等的方法不是静态的,如果存在计算不正确的风险,我是否将单个 Log(或 Exp)对象用于多个参数。那就是我可以使用单个Log实例来计算Log(2.3)和Log(567)吗?

public Double getROD(Integer score) {

        Double beta0 = new Double(-7.7631);
        Double beta1 = new Double(0.0737);
        Double beta2 = new Double(0.9971);

        Log log = new Log();
        Exp exp = new Exp();

        Double logit = beta0 + (beta1 * score) + (beta2 * log.value(new Double(score + 1)));
        Double mortality = exp.value(logit) / (1 + exp.value(logit));

        return mortality;
    }

我尝试了以下方法:

Log log = new Log();

Double arg1 = log.value(new Double(12.3));
Double arg2 = log.value(new Double(29.12));

System.out.println(arg1.toString() + " : " + arg2.toString());

导致

2.509599262378372 : 3.3714252233284854

但是,这是否是所有用途的预期行为仍然存在疑问。

【问题讨论】:

  • 我应该补充一点,我已经尝试过了,结果是一致的,但并不一定意味着该类将始终以这种方式运行。我也对不使用静态方法的原因感兴趣。
  • 主要是标准设计。 GSON 等其他库也更倾向于使用实例进行操作。
  • 感谢您的 cmets。非常感谢。

标签: java math apache-commons-math


【解决方案1】:

ExpLog 等类不存储任何状态。他们的value 方法不是静态的原因是为了实现UnivariateFunction 接口。所以,是的,您可以安全地重复使用这些对象。

UnivariateFunction 接口的优点之一是您可以编写一个接受此类对象的函数,并且用户可以通过传入适当的函数对象来参数化您的函数。这个概念被称为higher-order functions(如果你像我一样来自FP阵营)或strategy pattern(如果你来自OOP阵营)。

【讨论】:

  • 谢谢 - 非常感谢。在计算死亡风险时需要有一定的信心!
【解决方案2】:

如果您只想计算一个值的 log 和 exp,通常最好使用 FastMath,它为这个和其他基本数学函数提供静态方法(类似于 Math,但提供纯 java 实现,并且对于某些他们)。

【讨论】:

  • 谢谢你!非常感谢。
猜你喜欢
  • 2013-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-15
  • 2011-10-13
  • 2017-03-29
  • 2018-11-01
  • 2018-08-27
相关资源
最近更新 更多