使用Java计算正态分布

Pow*_*Pow 4 java statistics normal-distribution

编辑:

实际上我意识到我需要的是X的价值.让我更清楚.假设,我知道概率P = 0.95,因为我想使用两个标准偏差.我知道范围P(-500 <x <500)意味着我知道y和z,我也知道平均值和标准偏差.如果我想知道x的值是什么,我应该使用哪种方法.我找到一个计算器做这样的事情,但无法理解使用哪个公式.

原始问题:

我想用Java计算随机变量的正态分布概率.不知道该用哪个公式代码来解决的问题等这样.如果我知道平均值和标准差的值,并且想要找到在两个特定值y和z之间的x值的概率(P(-500)

有人可以帮我吗?

tra*_*god 11

您可以使用误差函数,可用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));
    }
}
Run Code Online (Sandbox Code Playgroud)

安慰:

0.9772498680518208
62.81551565546365

讨论:

问题1.在具有正常分布寿命的设备中,平均寿命为1000小时,标准偏差为100小时,~97.7%将在1200小时内失效.

问题2.在具有正常分布技能的人中,平均50次重复,标准偏差为10次重复,个人可以超过90%的人口,重复63次.


Bre*_*den 8

commons-math的另一个替代方法是使用它的NormalDistributionImpl:

    new org.apache.commons.math.distribution.NormalDistributionImpl(mean, std)
        .cumulativeProbability(a, b)
Run Code Online (Sandbox Code Playgroud)

这给出了X~N(均值,std)的'P(a≤X≤b).

从更新的问题,您似乎想要构建置信区间.如果是这样,请使用inverseCumulativeProbability方法.它计算概率p的值x,使得P(X≤x)= p.