2013-03-15 94 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