2013-03-15 45 views
5

Tôi có 2 mảng có độ dài bằng nhau. Hàm sau cố gắng tính toán độ dốc bằng cách sử dụng các mảng này. Nó trả về mức trung bình của độ dốc giữa mỗi điểm. Đối với tập dữ liệu sau, tôi dường như nhận được các giá trị khác với Excel và Google Tài liệu.Tính độ dốc của một dãy giá trị

 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); 
} 

Output

Google: 0,755

getSlope(): 0,962121212121212

Excel: 0,7501

+0

Xem ví dụ bằng số [ở đây] (http: // en .wikipedia.org/wiki/Simple_linear_regression) về tính toán. Điều này không quan trọng đối với mã. – karmanaut

Trả lời

4

Tôi đặt cược hai phương pháp khác là tính toán least-squares fit, trong khi bạn không.

Khi tôi xác minh giả thuyết này bằng R, tôi cũng có được độ dốc khoảng 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 *** 

Số có liên quan là 7.551e-01. Nó cũng đáng chú ý là dòng có một đánh chặn khoảng -1265.

Đây là một hình ảnh của bình phương nhỏ nhất phù hợp:

lm fit

Như để thực hiện điều này trong mã của bạn, xem Compute least squares using java

-1

Bạn nên chia x_values.length - 1. Số dốc là theo cặp.

Chỉnh sửa: Ví dụ về Wiki trong các nhận xét của tôi cho thấy cách tính alpha và beta xác định độ dốc của đường hồi quy tuyến tính.

+1

Đầu ra của x_values.length là 11. Trừ đi 1 sẽ cho độ dốc trung bình cao hơn. – Nyx

+0

Bạn có chắc chắn đang áp dụng đúng logic trung bình trong Excel/Google Documents không? Bạn có thể đăng macro không? – karmanaut

+0

'SLOPE (B2: B22, A2: A22)' Ở đây, cột B chứa 'y_values' và cột A chứa' x_values'. – Nyx

2

Chức năng này sẽ không giúp bạn nhiều, vì nó không tính đến chiều rộng của các đoạn đường khác nhau. Xem xét sự khác biệt trong việc áp dụng nó cho các điểm (0,0), (1000,1000), và (1001, 2000) so với (0,0), (1,1), và (2, 1001). Cả hai trường hợp đều có độ dốc liên tiếp 1 và 1000, nhưng chúng trông rất khác nhau.

Bạn cần triển khai phương pháp của các ô vuông tối thiểu: http://en.wikipedia.org/wiki/Least_squares để tìm dòng phù hợp nhất với tập dữ liệu của bạn.

Một lời khuyên khác: không bao giờ ném java.lang.Exception. Luôn chọn một ngoại lệ cụ thể hơn, ngay cả khi bạn phải tự viết lớp. Những người sử dụng mã của bạn sẽ cần phải xử lý java.lang.Exception, điều này ảnh hưởng xấu đến mã khác của họ.

+0

Điều này là chính xác. – karmanaut

+0

Phương pháp Hình vuông tối thiểu chỉ là một phần của một giải pháp rộng lớn hơn cho vấn đề này: http://en.wikipedia.org/wiki/Linear_regression – roim

Các vấn đề liên quan