【问题标题】:Is there a static function in Apache common math to evaluate the Gaussian functionApache常用数学中是否有一个静态函数来评估高斯函数
【发布时间】:2014-05-06 16:00:27
【问题描述】:

在 Apache commons Math 中有一个类 Mean。我想避免每次我想计算平均值时都实例化一个对象。经过进一步检查,我发现了一个类 StatUtils,它有一个静态函数,可以计算双精度 [] 的平均值。 现在我想评估高斯函数。我找到了一个高斯类。但是我还是不想每次我想评估函数时都实例化一个对象。是否有类似于 StatUtils 的类,具有用于评估高斯函数的静态函数。

我考虑实例化一个 Mean 类型的全局对象来访问 mean 函数,而不必实例化多个 Mean 对象,但是当我发现 StatUtil 时,我更喜欢这种方法。对于高斯问题,即使是全局对象也是不可接受的,因为构造函数需要均值和 sigma 参数。因此,我仍然需要为每个分布实例化一个新对象。

我正在寻找的是这样的:

double y = gaussian(x, mean, sigma);

总结一下。

  1. 是否有静态函数来评估高斯函数。
  2. 是否存在驱动我缺少的 Apache Math 库设计的软件设计问题。使用静态函数的 StatUtils 或 Java.Math 方法是否有问题。

【问题讨论】:

  • 为什么不想实例化一个对象? Java 是一种面向对象的语言。实例化对象就是你在 Java 中所做的事情!
  • java.math 只包含不需要状态的非常简单的函数。 Gaussian 类包含状态,并以面向对象的方式对状态进行若干操作。
  • 回复 Erwin Bolwidt 的评论。您对高斯物体状态的评论是一个很好的观点。这就解释了为什么某些函数作为静态函数有意义。至于为什么我想避免在 Mean 的情况下创建对象似乎没有必要,
  • 对不起,我的最后一条评论没有完成。我不打算批评 apache 的设计。我不清楚与状态(均值和西格玛)作为参数传递的静态函数设计相比,该设计的优势。

标签: java math static-libraries apache-commons gaussian


【解决方案1】:

只要您不需要具有与原始类相关联的导数和参数的基础结构,就应该可以提取相关计算(不包含任何真实的“状态”,而仅取决于您提到的三个参数)并将其放入单个静态方法中。

基于原来的高斯类,大致应该是这样的:

// Based on the Gaussian class from Apache Commons Math
public static double gaussian(double x, double mean, double sigma)
{
    double norm = 1 / (sigma * Math.sqrt(2 * Math.PI));
    double  is = 1 / sigma;
    double i2s2 = 0.5 * is * is;
    double xMinusMean = x - mean;
    return norm * Math.exp(-xMinusMean * xMinusMean * i2s2);
}

【讨论】:

  • 回复 Marco13 是的,事实上我正在尝试用 apache 库替换我自己的数学库。我的数学库是多年来编写的函数的集合。我有一个你描述的功能。
【解决方案2】:

你想要概率密度函数 PDF 还是累积密度函数 CDF。 PDF 由@Marco13 答案给出。对于大多数统计应用来说,最有趣的 CDF 是找到 x 的概率

您可以做的是拥有一个 org.apache.commons.math3.distribution.NormalDistribution 实例,这意味着 0 和标准差 1。您可以重新调整值以匹配

static NormalDistribution dist = new NormalDistribution();

static double density(double x, double mean, double sd) {
    double scaledx = (x-mean)/sd;
    return dist.density(scaledx);
}

static double cumulativeProbability(double x, double mean, double sd) {
    double scaledx = (x-mean)/sd;
    return dist.cumulativeProbability(scaledx);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-28
    • 2021-04-25
    • 1970-01-01
    • 2018-07-28
    • 2014-01-29
    相关资源
    最近更新 更多