2013-03-15 75 views
5

的斜率我有2個陣列相等的長度。以下函數嘗試使用這些數組計算斜率。它返回每個點之間的斜率的平均值。對於以下數據集,我似乎獲得了不同於Excel和Google文檔的值。計算一系列值

 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

Excel中:0.7501

+0

見數例[這裏](HTTP:// EN .wikipedia.org/wiki/Simple_linear_regression)進行計算。這對編碼應該是微不足道的。 – karmanaut 2013-03-15 12:27:31

回答

4

我敢打賭,其他兩種方法計算least-squares fit,而你不是。

當我確認使用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。

這裏是最小二乘的圖片適合:

lm fit

至於在代碼中實現這一點,看到Compute least squares using java

-1

你應該x_values.length - 1來劃分。斜坡的數量是成對的。

編輯:在我的意見維基示例說明了如何計算其確定的線性迴歸線的斜率α和β。

+1

x_values.length的輸出是11.減1將得到更高的平均斜率。 – Nyx 2013-03-15 12:06:24

+0

您確定您在Excel/Google文檔中應用了正確的平均邏輯嗎?你可以發佈宏嗎? – karmanaut 2013-03-15 12:10:04

+0

'SLOPE(B2:B22,A2:A22)'這裏,B列包含'y_values',A列包含'x_values'。 – Nyx 2013-03-15 12:12:57

2

此功能不會幫助你太多,因爲它沒有考慮到各個線段的橫向寬度。考慮將它應用於點(0,0),(1000,1000)和(1001,2000)與(0,0),(1,1)和(2,1001)的區別。兩種情況都有連續的斜率1和1000,但它們看起來大不相同。

您需要實現最小二乘方法:http://en.wikipedia.org/wiki/Least_squares找到最佳地接近你的數據集行。

還有一個忠告:從來沒有拋出一個java.lang.Exception。即使你必須自己寫課程,也總是選擇一個更具體的例外。使用您的代碼的人需要處理java.lang.Exception,這會嚴重干擾其他代碼。

+0

這是正確的。 – karmanaut 2013-03-15 12:25:11

+0

最小二乘法只是解決這個問題的更廣泛類的一部分:http://en.wikipedia.org/wiki/Linear_regression – roim 2013-03-15 18:06:37