【问题标题】:Calculate Normal Distrubution using Java使用 Java 计算正态分布
【发布时间】:2011-09-15 06:29:26
【问题描述】:

编辑:

其实我意识到我需要的是X的值。让我说清楚一点。假设我知道概率 P = 0.95,因为我想使用两个标准差。我知道范围 P(-500 这意味着我知道 y 和 z ,我也知道平均值和标准差。如果我想知道 x 的值是多少,我应该使用哪种方法。我发现一个calculator 正在做这样的事情,但不明白要使用哪个公式。

原问题:

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

谁能帮帮我?

【问题讨论】:

  • 正如垃圾神所说,一定要看 apache.commons.Math 项目。它包含一个很好的统计包,它应该能够做你想做的事情。

标签: java statistics normal-distribution


【解决方案1】:

CERN 开发的Colt 库支持许多统计功能;也是cern.jet.random.Normal 中的正态(又名高斯)分布。

【讨论】:

  • +1:我使用的部分比 commons-math 等效的部分好很多。
【解决方案2】:

您可以使用error function,在org.apache.commons.math.special.Erf 中可用,如herehere 所述。

附录:@Brent Worden 的answer 中提出的方法大大简化了此类问题的解决方案。作为一个具体的例子,下面的代码显示了如何解决您所引用的examples。此外,我发现将here 的定义与使用Erf.erfcumulativeProbability() 的实现进行比较很有帮助。另请注意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 次。

【讨论】:

  • 由于我的回答依赖于他的answer,我拒绝赏金支持@Brent Worden。当然,您也可以随时接受或投票赞成我的回答。 :-)
【解决方案3】:

commons-math 的另一种选择是使用它的NormalDistributionImpl

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

这给出了 P(a ≤ X ≤ b) 对于 X ~ N(mean, std)。

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

【讨论】:

  • 感谢 .. 的建议。假设如果我知道概率值(因为我想使用两个标准差(其中 p 为 95%)),我知道 a 和 b 的值,我想知道 X 的值。我应该怎么做那案子?如果这听起来很幼稚,我深表歉意,但我对这种统计方法并不熟悉。提前致谢。
  • 听起来您想创建置信区间。如果是这样,请使用 inverseCumulativeProbability 方法。
猜你喜欢
  • 2016-06-11
  • 2010-10-23
  • 2023-03-15
  • 2016-11-26
  • 2010-10-01
  • 2015-03-24
  • 2020-10-23
  • 2011-05-28
  • 2013-03-21
相关资源
最近更新 更多