Java高斯分布 - 钟形曲线

时间:2011-03-27 21:12:23

标签: java normal-distribution

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

列表:204 297 348 528 681 684 785 957 1044 1140 1378 1545 1818

总数:13

平均值(平均值):877.615384615385

标准偏差(SD):477.272626245539 ​​

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

2 个答案:

答案 0 :(得分:9)

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

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< = 2000; x = 2)并将这些值输入上面的等式中,得到该对的y值。由于您要显示的y是0-1,因此您将这些值映射到您希望y分辨率具有适当舍入行为的任何值,因此您的图形不会过于夸张。因此,如果你想要你的y分辨率为500像素,那么你将0设置为0和1到500以及.5到250等等。这是一个人为的例子,你可能需要更多的灵活性,但我认为它说明了这一点。大多数图形库都会为您处理这些小事。

答案 1 :(得分:1)

这是使用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;
  }

}

结果情节如下所示:

enter image description here

相关问题