使用Java计算正态分布

4

编辑:

实际上我意识到我需要的是X的值。让我更清楚地说明一下。假设我知道概率P=0.95,因为我想使用两个标准差。我知道范围P(-500< x <500),这意味着我知道y和z,我也知道平均值和标准差。如果我想知道x的值,我应该使用哪种方法。我找到了一个计算器可以做类似的事情,但不知道要使用哪个公式。

原始问题:

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

有人能帮我吗?


正如trashgod所说,一定要看看apache.commons.Math项目。它包含了一个很好的统计包,能够完成你想要做的事情。 - peshkira
3个回答

14
你可以使用错误函数,它在org.apache.commons.math.special.Erf中可用,如此处此处所讨论的那样。

附录:@Brent Worden的answer中提出的方法极大地简化了解决此类问题的过程。具体示例代码如下,展示了如何解决您所提到的examples问题。此外,我发现将here的定义与使用Erf.erf实现的cumulativeProbability()进行比较是有帮助的。还要注意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://dev59.com/0VjUa4cB1Zd3GeqPPkF5
 */
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次,一个人需要63次重复才能超过90%的人群。


1
由于我的答案依赖于他的答案,所以我选择放弃悬赏并支持@Brent Worden。当然,您也可以自由地接受或点赞我的答案。 :-) - trashgod

8

另一个可选方案是使用来自commons-mathNormalDistributionImpl

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

这个公式计算的是正态分布下 X 在区间 [a, b] 内的概率 P(a ≤ X ≤ b)。

从更新后的问题来看,你想构建置信区间。如果是的话,请使用 inverseCumulativeProbability 方法。它可以计算出当概率为 p 时,使得 P(X ≤ x) = p 的值 x。


谢谢您的建议。假设我知道概率值(因为我想使用两个标准差(其中p为95%)),我知道a和b的值,我想知道X的值。在这种情况下我该怎么办?如果听起来很幼稚,我很抱歉,但我对这种统计方法不是很熟悉。提前致谢。 - Pow
1
听起来你想创建置信区间。如果是这样,请使用inverseCumulativeProbability方法。 - Brent Worden

4

Colt库是由欧洲核子研究组织开发的,支持许多统计函数;cern.jet.random.Normal中也包含正态(又称高斯)分布。


+1:我使用的部分比commons-math的等效部分要好得多。 - Dmitri

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接