2013-03-15 4 views
5

私は同じ長さの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

+0

は[こちら](HTTP数値例を参照してください。参照:// EN .wikipedia.org/wiki/Simple_linear_regression)を計算します。これはコード化するのは簡単です。 – karmanaut

答えて

4

私は他の2つの方法はleast-squares fitを計算していると思いますが、あなたはそうではありません。該当する番号が7.551e-01ある

> 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 *** 

:私はRを使用して、この推測を検証すると

することは、私はあまりにもおよそ0.755の傾きを取得します。また、ラインに約-1265の切片があることにも注目する価値があります。ここで

最小二乗の絵フィットさ:あなたのコードでこれを実装するよう

lm fit

Compute least squares using java

-1

あなたはx_values.length - 1で割るべきです。勾配の数は対になっています。

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

+1

x_values.lengthの出力は11です.1を減算すると平均スロープが大きくなります。 – Nyx

+0

Excel/Googleドキュメントで適切な平均ロジックを適用してもよろしいですか?マクロを投稿できますか? – karmanaut

+0

'SLOPE(B2:B22、A2:A22)'ここで、B列は 'y_values'を含み、A列は' x_values'を含みます。 – Nyx

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を処理する必要があり、他のコードに悪影響を及ぼします。

+0

これは正しいです。 – karmanaut

+0

最小二乗法は、この問題の解決策の一部にすぎません:http://en.wikipedia.org/wiki/Linear_regression – roim

関連する問題