9

私は同じ長さの2つの配列を持っています。次の関数は、これらの配列を使用して勾配を計算しようとします。各ポイント間の勾配の平均を返します。次のデータ セットについては、Excel や Google Docs とは異なる値を取得しているようです。

        double[] x_values = { 1932, 1936, 1948, 1952, 1956, 1960, 1964, 1968,
            1972, 1976, 1980 };
    double[] y_values = { 197, 203, 198, 204, 212, 216, 218, 224, 223, 225,
            236 };



public static double getSlope(double[] x_values, double[] y_values)
        throws Exception {

    if (x_values.length != y_values.length)
        throw new Exception();

    double slope = 0;

    for (int i = 0; i < (x_values.length - 1); i++) {
        double y_2 = y_values[i + 1];
        double y_1 = y_values[i];

        double delta_y = y_2 - y_1;

        double x_2 = x_values[i + 1];
        double x_1 = x_values[i];

        double delta_x = x_2 - x_1;

        slope += delta_y / delta_x;
    }

    System.out.println(x_values.length);
    return slope / (x_values.length);
}

出力

グーグル: 0.755

getSlope(): 0.962121212121212

エクセル: 0.7501

4

4 に答える 4

5

他の 2 つの方法は最小二乗フィットを計算しているに違いありませんが、あなたはそうではありません。

Rを使用してこの予想を検証すると、傾きも約 0.755 になります。

> summary(lm(y~x))

Call:
lm(formula = y ~ x)

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept) -1.265e+03  1.793e+02  -7.053 5.97e-05 ***
x            7.551e-01  9.155e-02   8.247 1.73e-05 ***

該当する番号は7.551e-01です。また、ラインの切片が約 -1265 であることも注目に値します。

最小二乗近似の図を次に示します。

フィットする

これをコードに実装する方法については、Java を使用して最小二乗を計算するを参照してください。

于 2013-03-15T12:30:15.857 に答える
2

この関数は、さまざまな線分の幅を考慮していないため、あまり役に立ちません。それをポイント (0,0)、(1000,1000)、および (1001, 2000) と (0,0)、(1,1)、および (2, 1001) に適用する際の違いを考慮してください。どちらの場合も勾配 1 と 1000 が連続していますが、見た目は大きく異なります。

最小二乗法を実装する必要があります: http://en.wikipedia.org/wiki/Least_squaresで、データ セットを最もよく近似する線を見つけます。

もう 1 つアドバイス: 絶対に . をスローしないでjava.lang.Exceptionください。自分でクラスを作成する必要がある場合でも、常により具体的な例外を選択してください。あなたのコードを使用する人は を処理する必要がありjava.lang.Exception、他のコードとひどく干渉します。

于 2013-03-15T12:24:01.807 に答える
-1

で割る必要がありますx_values.length - 1。スロープの数はペアワイズです。

編集:私のコメントのWikiの例は、線形回帰直線の傾きを決定するアルファとベータを計算する方法を示しています。

于 2013-03-15T12:04:45.720 に答える