5

一連の値の平均とSDを計算しました。次に、これらの値を使用してベルカーブを描画し、JAVASwingの正規分布を表示する必要があります。この状況をどのように進めますか。

リスト:204 297 348 528 681 684 785 957 1044 1140 1378 1545 1818

総数:13

平均値(平均):877.615384615385

標準偏差(SD):477.272626245539

x座標とy座標を取得できる場合はそれを実行できますが、これらの値を取得するにはどうすればよいですか?

4

2 に答える 2

10

まず、セットの分散を計算する必要があります。分散は、各数値の平均からの平均二乗偏差として計算されます。

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などを設定します。これは不自然な例であり、より多くの柔軟性が必要になる場合がありますが、ポイントを示していると思います。 。ほとんどのグラフ作成ライブラリは、これらの小さなことを処理します。

于 2011-03-27T23:02:05.933 に答える
1

XChartを使用していくつかのガウス曲線をプロットする例を次に示します。コードはここにあります。免責事項:私はXChartJavaチャートライブラリの作成者です。

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;
  }

}

結果のプロットは次のようになります。

ここに画像の説明を入力してください

于 2016-02-22T14:10:33.257 に答える