2013-03-15 7 views
5

두 개의 동일한 길이의 배열이 있습니다. 다음 함수는 이러한 배열을 사용하여 기울기를 계산하려고 시도합니다. 각 점 사이의 기울기 평균을 반환합니다. 다음 데이터 세트의 경우 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

엑셀 : 0.7501

+0

이 수치 예 [여기] (HTTP 참조 참조 : 여기

는 최소 제곱의 사진이 적합 .wikipedia.org/wiki/Simple_linear_regression)를 계산합니다. 이것은 코드 작성이 간단해야합니다. – karmanaut

답변

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의 절편을 가지고 있음을 주목할 필요가 있습니다. // EN :

lm fit

코드에서이 구현에 관해서는, Compute least squares using java

-1

당신은 x_values.length - 1로 나누어해야한다. 기울기 수는 쌍으로 나타납니다.

편집 : 위키 예제에서는 선형 회귀선의 기울기를 결정하는 알파와 베타를 계산하는 방법을 보여줍니다.

+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)을 구현해야합니다.

조언이 한 번 더 있습니다. 결코 java.lang.Exception을 던지지 마십시오. 직접 수업을 작성해야하는 경우에도 항상 더 구체적인 예외를 선택하십시오. 귀하의 코드를 사용하는 사람들은 java.lang.Exception을 처리해야하는데, 이는 다른 코드에 악영향을 미칩니다.

+0

이것은 맞습니다. – karmanaut

+0

최소 사각 법은이 문제에 대한 광범위한 솔루션의 일부입니다. http://en.wikipedia.org/wiki/Linear_regression – roim