Рассчитать нормальное распределение с помощью Java - PullRequest
4 голосов
/ 15 июня 2011

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

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

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

Я хочу рассчитать вероятность нормального распределения случайных величин, используя Java. Не был уверен, какую формулу использовать для кодирования, чтобы решить такую ​​проблему, как this . Если я знаю значение среднего значения и стандартного отклонения и хочу найти вероятность того, что значение x будет между 2 определенными значениями y и z (P (-500)

Может кто-нибудь помочь мне, пожалуйста?

Ответы [ 3 ]

11 голосов
/ 15 июня 2011

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

Приложение: Методы, предложенные в @ 1012 * answer Брента Уордена , значительно упрощают решение таких задач.В качестве конкретного примера приведенный ниже код показывает, как решить примеры , на которые вы ссылаетесь.Кроме того, я нашел полезным сравнить определение здесь с реализацией 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 повторениями.

8 голосов
/ 16 июня 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.

4 голосов
/ 15 июня 2011

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

...