Вычислить нормальное распределение с помощью Java

РЕДАКТИРОВАТЬ:

На самом деле я понял, что мне нужно значение X. Поясню. Предположим, я знаю вероятность P = 0,95, так как хочу использовать два стандартных отклонения. Я знаю диапазоны P(-500 ‹ x ‹500), что означает, что я знаю y и z , а также среднее значение и стандартное отклонение. Если я хочу знать, каково будет значение x, какой метод мне следует использовать. Я нашел один калькулятор, делающий что-то подобное, но не мог понять, какую формулу использовать.

Оригинальный вопрос:

I want to calculate normal distribution probability of random variables using Java. Was not sure which formula to use to code to solve a problem like this. If I know the value of mean and Standard deviation and want to find the probability of being x's value between 2 certain values y and z (P(-500

Can anyone help me please?


person Pow    schedule 15.06.2011    source источник
comment
Как сказал TrashGod, обязательно посмотрите на проект apache.commons.Math. Он содержит хороший пакет статистики, который сможет делать то, что вы хотите.   -  person peshkira    schedule 23.06.2011


Ответы (3)


Вы можете использовать функцию ошибок, доступную на org.apache.commons.math.special.Erf, как обсуждалось здесь и здесь.

Приложение: методы, предложенные в ответе @Brent Worden, значительно упрощают решение подобных проблем. В качестве конкретного примера приведенный ниже код показывает, как решить примеры, на которые вы ссылаетесь. . Кроме того, я счел полезным сравнить определение здесь с реализацией cumulativeProbability() с использованием Erf.erf. Обратите также внимание на то, как реализована реализация inverseCumulativeProbability() обобщает требуемый итеративный подход.

import org.apache.commons.math.MathException;
import org.apache.commons.math.distribution.NormalDistribution;
import org.apache.commons.math.distribution.NormalDistributionImpl;

/**
 * @see http://stattrek.com/Tables/Normal.aspx#examples
 * @see https://stackoverflow.com/questions/6353678
 */
public class CumulativeProbability {

    private static NormalDistribution d;

    public static void main(String[] args) throws MathException {
        // Problem 1; µ = 1000; σ = 100
        d = new NormalDistributionImpl(1000, 100);
        System.out.println(d.cumulativeProbability(1200));
        // Problem 2; µ = 50; σ = 10
        d = new NormalDistributionImpl(50, 10);
        System.out.println(d.inverseCumulativeProbability(0.9));
    }
}

Приставка:

0.9772498680518208
62.81551565546365

Обсуждение:

Проблема 1. Среди устройств с нормально распределенным сроком службы, составляющим в среднем 1000 часов при стандартном отклонении 100 часов, ~97,7% выйдут из строя в течение 1200 часов.

Проблема 2. Среди людей с нормально распределенным навыком, который позволяет в среднем 50 повторений со стандартным отклонением в 10 повторений, человек может превзойти 90% населения с 63 повторениями.

person trashgod    schedule 15.06.2011
comment
Поскольку мой ответ основан на его ответе, я отказываюсь от вознаграждения в пользу @Брент Уорден. Конечно, вы также можете принять или проголосовать за мой ответ. :-) - person trashgod; 23.06.2011

Другой альтернативой commons-math является использование его NormalDistributionImpl:

    new org.apache.commons.math.distribution.NormalDistributionImpl(mean, std)
        .cumulativeProbability(a, b)

Это дает P (a X b) для X ~ N (среднее, стандартное).

Из обновленного вопроса похоже, что вы хотите построить доверительные интервалы. Если это так, используйте метод inverseCumulativeProbability. Он вычисляет значения x для вероятности p такой, что P(X x) = p.

person Brent Worden    schedule 16.06.2011
comment
Спасибо .. за предложение. Предположим, что если я знаю значение вероятности (поскольку я хочу использовать два стандартных отклонения (где p равно 95%)), я знаю значения, если a и b, и я хотел бы знать значение X. Что мне делать в тот случай? Прошу прощения, если это звучит наивно, но я не знаком с этим статистическим подходом. Заранее спасибо. - person Pow; 21.06.2011
comment
Похоже, вы хотите создать доверительные интервалы. Если это так, используйте метод inverseCumulativeProbability. - person Brent Worden; 22.06.2011

Библиотека Colt, разработанная в ЦЕРНе, поддерживает множество статистических функций; а также нормальное (гауссово) распределение в cern.jet.random.Normal.

person Thor    schedule 15.06.2011
comment
+1: Части, которые я использовал, были немного лучше, чем эквиваленты общей математики. - person Dmitri; 23.06.2011