Вычисление Log и Exp значения с использованием Apache Commons

У меня есть расчет риска смертности, который требует определения естественных логов и экспоненциального распада. Метод подробно описан ниже. Мне любопытно узнать, почему методы вычисления exp и т. д. не являются статическими, и если я использую один объект Log (или Exp) для нескольких аргументов, если существует риск неправильных вычислений. То есть могу ли я использовать один экземпляр журнала для расчета журнала (2.3) и журнала (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

Тем не менее, все еще остается вопрос, является ли это предполагаемым поведением во всех случаях использования.


person skyman    schedule 09.07.2014    source источник
comment
Я должен был добавить, что я пробовал это, и результаты согласуются, однако это не обязательно означает, что класс всегда будет вести себя таким образом. Меня также интересуют причины отказа от использования статических методов.   -  person skyman    schedule 09.07.2014
comment
В основном, номинальный дизайн. Другие библиотеки, такие как GSON, также отдают предпочтение экземплярам для операций.   -  person Unihedron    schedule 09.07.2014
comment
Спасибо за ваши Коментарии. Очень признателен.   -  person skyman    schedule 09.07.2014


Ответы (2)


Классы Exp, Log и т. д. не хранят состояния. Причина, по которой их методы value не являются статическими, заключается в выполнении интерфейса UnivariateFunction. Итак, да, вы можете безопасно повторно использовать объекты.

Одна из приятных особенностей интерфейса UnivariateFunction заключается в том, что вы можете написать функцию, которая принимает такой объект, а пользователь может параметризовать вашу функцию, передав соответствующий объект функции. Эта концепция называется функциями высшего порядка (если вы исходите из FP, как и я) или паттерн стратегии (если вы пришли из ООП лагерь).

person Chris Jester-Young    schedule 09.07.2014
comment
Спасибо - это действительно ценно. Должен быть уровень уверенности в расчете риска смерти! - person skyman; 09.07.2014

Если вы просто хотите вычислить журнал и выражение значения, обычно лучше использовать FastMath, который предоставляет статический метод для этой и других основных математических функций (похож на Math, но обеспечивает чистую реализацию Java и быстрее для некоторых из них).

person T. Neidhart    schedule 16.10.2014
comment
Спасибо тебе за это! Очень признателен. - person skyman; 17.10.2014