5

我正在用Piccolo编写一个交互式小程序,我需要在其中包含一条高斯曲线(又名正态分布图)。

我想任何一种 Java 实现都足够了,但我找不到。理想情况下,我想传递一组值并将图表绘制在面板、图像对象或任何可以嵌入到小程序中的东西中。

在自己动手编写代码之前,有没有人知道有一段代码可以做到这一点?

欢迎使用其他语言的实现,只要它们易于移植到 Java。

4

2 回答 2

5

不知道它是否有效,但谷歌抛出了这段代码来绘制高斯分布

这个项目的主页在这里

如果 Piccolo 不为您执行绘图,我可能会使用JFreeChart进行实际绘图,因为它得到广泛支持且功能强大。(我对短笛不熟悉)

于 2009-03-31T21:38:08.503 回答
2

编辑:看起来Apache Commons Math 库有一个统计部分。具体来说,是一个关于 common Distributions的完整包。希望那里有一些数学人,因为我不记得基本的统计数据……这是我尝试使用他们的库的尝试。我在这里只有一个滑动窗口并计算这些值之间的 P。从中获取 PDF 的真正方法是什么?它们只有 CDF 功能。

public void testNormalDist() throws MathException {
    DistributionFactory f = DistributionFactory.newInstance();
    NormalDistribution n = f.createNormalDistribution(0.0d, 1.0d);
    double lastx = Double.NEGATIVE_INFINITY;
    double nextx = Double.NEGATIVE_INFINITY;
    for (int i=-100; i < 100; i++) {
        nextx = i / 100d;
        System.out.println(n.cumulativeProbability(lastx, nextx));
        lastx = nextx;
    }
}

我假设您想要图表的概率密度函数。这些方程式在 wikipedia 上,因为我不知道如何在此处包含数学标记。只需使用 p(x) 作为您的 Y 值和 X 作为您的 X 值,您就可以从中获得一个非常简单的二维图。

你看过Java 下的 Mathtools吗?

好的,这个怎么样......你给它一个X点数组(标准化,当然,你可以通过将每个像素位置除以图像的宽度来将你的X像素转换为这些),它将返回分布曲线(再次乘以您的归一化因子)。这是平均值为 0 且标准差为 1 的基本情况。

public double[] normalDistBasic(double[] xarray, double mu) {
    double[] yarray = new double[xarray.length];
    double rad2pi = 2.50662827d;
    for (int off = 0; off < yarray.length; off++) {
        double x = xarray[off];
        double ss = -1d * x * x / 2d;
        yarray[off] = (-1f / rad2pi) * Math.exp(ss);
    }
    return yarray;
}

如果在网上找不到,那么实现一个采用任意均值和标准差的方法应该很容易。

于 2009-03-31T21:42:17.400 回答