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

Выход

Google: 0,755

getSlope(): 0,962121212121212

Excel: 0,7501

+0

См численный пример [здесь] (Http: // EN .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.

Вот картина наименьших квадратов:

lm fit

Как реализации этого в коде, см Compute least squares using java

-1

Вы должны быть деления на x_values.length - 1. Количество склонов попарно.

Редактировать: Пример Wiki в моих комментариях показывает, как рассчитать альфа и бета, которые определяют наклон линии линейной регрессии.

+1

Выходной сигнал x_values.length равен 11. Вычитание на 1 даст более высокий средний уклон. – Nyx

+0

Вы уверены, что применяете правильную среднюю логику в Excel/Google Docs? Не могли бы вы опубликовать макрос? – 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

Смежные вопросы