Есть ли в Apache общая математическая функция для оценки функции Гаусса?

В Apache Commons Math есть класс Mean. Я хочу избегать создания объекта каждый раз, когда мне нужно вычислить среднее значение. После дальнейшего изучения я нашел класс StatUtils, который имеет статическую функцию, которая вычисляет среднее значение типа double[]. Теперь я хочу оценить функцию Гаусса. Я нашел класс Гаусса. Но я все же предпочел бы не создавать экземпляр объекта каждый раз, когда я хочу оценить функцию. Есть ли класс, похожий на StatUtils со статическими функциями для оценки функции Гаусса.

Я рассмотрел создание экземпляра глобального объекта типа Mean, чтобы получить доступ к функции mean без необходимости создания экземпляров нескольких объектов Mean, но когда я нашел StatUtil, я предпочел такой подход. Для гауссовой задачи даже глобальный объект неприемлем, так как для конструктора требуется среднее значение и параметр сигма. Поэтому мне все равно придется создавать новый объект для каждого дистрибутива.

Я ищу что-то вроде:

двойной у = гауссовский (х, среднее, сигма);

подвести итоги.

  1. Есть ли статическая функция для оценки функции Гаусса.
  2. Есть ли проблема разработки программного обеспечения, которая ведет дизайн библиотеки Apache Math, который мне не хватает? Что-то не так с подходом StatUtils или Java.Math, использующим статические функции.

2 ответа

Решение

Пока вам не нужна инфраструктура с производными и параметриками, которая связана с исходным классом, должна быть возможность извлечь соответствующие вычисления (которые не содержат никакого реального "состояния", но зависят только от трех параметров, которые Вы упомянули) и поместите его в один статический метод.

Исходя из исходного гауссовского класса, он должен выглядеть примерно так:

// Based on the Gaussian class from Apache Commons Math
public static double gaussian(double x, double mean, double sigma)
{
    double norm = 1 / (sigma * Math.sqrt(2 * Math.PI));
    double  is = 1 / sigma;
    double i2s2 = 0.5 * is * is;
    double xMinusMean = x - mean;
    return norm * Math.exp(-xMinusMean * xMinusMean * i2s2);
}

Вам нужна функция плотности вероятности PDF или накопительная функция плотности CDF. PDF предоставлен ответом @Marco13. Для большинства статистических приложений наиболее интересен CDF, который находит вероятность того, что x

Что вы можете сделать, так это иметь один экземпляр org.apache.commons.math3.distribution.NormalDistribution, который означает 0 и стандартное отклонение 1. Вы можете изменить масштаб значений, чтобы соответствовать

static NormalDistribution dist = new NormalDistribution();

static double density(double x, double mean, double sd) {
    double scaledx = (x-mean)/sd;
    return dist.density(scaledx);
}

static double cumulativeProbability(double x, double mean, double sd) {
    double scaledx = (x-mean)/sd;
    return dist.cumulativeProbability(scaledx);
}
Другие вопросы по тегам