【问题标题】:Java Guassian Distribution-Bell Curve [duplicate]Java高斯分布-钟形曲线[重复]
【发布时间】:2011-03-27 21:12:23
【问题描述】:

我计算了一组值的平均值和标准差。现在我需要使用这些值绘制钟形曲线来显示 JAVA Swing 中的正态分布。我该如何处理这种情况。

名单:204 297 348 528 681 684 785 957 1044 1140 1378 1545 1818

总数:13

平均值(平均值):877.615384615385

标准偏差(SD):477.272626245539

如果我可以得到 x 和 y 坐标,我可以做到,但我如何获得这些值?

【问题讨论】:

  • 你想用什么方程或算法来绘制曲线?或者,您是否正在寻找可以告诉您使用哪些积分的人?你看过这个吗? en.wikipedia.org/wiki/Gaussian_function
  • 您应该开始学习如何使用Graphics 对象进行绘图。然后你需要将空间映射到绘图空间。一种简单的方法是使用图表库,例如 JFreeChart。
  • 您要查找的词是“直方图”,由于您拥有的数据量有限,它很粗糙。另请注意,您可以计算平均广告标准差这一事实并不能保证正态分布。
  • 我认为这个等式不会轻易写在 SO 上,但这个等式应该会有所帮助:ccrma.stanford.edu/~jos/sasp/…
  • 我知道如何在java中绘制图形,但我需要的是绘制图形的坐标,x和y坐标。例如 (1,0) (2,5) (3,9) (4,5) (5,0)...

标签: java normal-distribution


【解决方案1】:

首先,您需要计算集合的方差。方差计算为每个数字与其均值的平均平方偏差。

double variance(double[] population) {
        long n = 0;
        double mean = 0;
        double s = 0.0;

        for (double x : population) {
                n++;
                double delta = x – mean;
                mean += delta / n;
                s += delta * (x – mean);
        }
        // if you want to calculate std deviation

        return (s / n);
}

一旦你有了它,你可以根据你的图形分辨率与你的值集传播相比选择 x,并将其代入以下等式以获得 y。

protected double stdDeviation, variance, mean; 

    public double getY(double x) { 

        return Math.pow(Math.exp(-(((x - mean) * (x - mean)) / ((2 * variance)))), 1 / (stdDeviation * Math.sqrt(2 * Math.PI))); 

    } 

要显示结果集:假设我们采用您布置的总体集,并决定您要在 x 分辨率为 1000 像素的图表上显示 x=0 到 x=2000。然后您将插入一个循环 (int x = 0; x

【讨论】:

  • 感谢您的回复。它真的很有帮助。我设法获得了 x 和 y 坐标,哪个图形库最适合用来创建钟形图?你有什么建议吗?
  • JFreeChart 是一个很好的整体图表库。
【解决方案2】:

这是使用XChart 绘制一些高斯曲线的示例。代码可以在here找到。免责声明:我是 XChart Java 图表库的创建者。

public class ThemeChart03 implements ExampleChart {

  public static void main(String[] args) {

    ExampleChart exampleChart = new ThemeChart03();
    Chart chart = exampleChart.getChart();
    new SwingWrapper(chart).displayChart();
  }

  @Override
  public Chart getChart() {

    // Create Chart
    Chart_XY chart = new ChartBuilder_XY().width(800).height(600).theme(ChartTheme.Matlab).title("Matlab Theme").xAxisTitle("X").yAxisTitle("Y").build();

    // Customize Chart
    chart.getStyler().setPlotGridLinesVisible(false);
    chart.getStyler().setXAxisTickMarkSpacingHint(100);

    // Series
    List<Integer> xData = new ArrayList<Integer>();
    for (int i = 0; i < 640; i++) {
      xData.add(i);
    }
    List<Double> y1Data = getYAxis(xData, 320, 60);
    List<Double> y2Data = getYAxis(xData, 320, 100);
    List<Double> y3Data = new ArrayList<Double>(xData.size());
    for (int i = 0; i < 640; i++) {
      y3Data.add(y1Data.get(i) - y2Data.get(i));
    }

    chart.addSeries("Gaussian 1", xData, y1Data);
    chart.addSeries("Gaussian 2", xData, y2Data);
    chart.addSeries("Difference", xData, y3Data);

    return chart;
  }

  private List<Double> getYAxis(List<Integer> xData, double mean, double std) {

    List<Double> yData = new ArrayList<Double>(xData.size());

    for (int i = 0; i < xData.size(); i++) {
      yData.add((1 / (std * Math.sqrt(2 * Math.PI))) * Math.exp(-(((xData.get(i) - mean) * (xData.get(i) - mean)) / ((2 * std * std)))));
    }
    return yData;
  }

}

生成的图如下所示:

【讨论】: