2012-03-02 3 views
3

Я пытаюсь найти самый быстрый и эффективный способ расчета наклонов с помощью Numpy и Scipy. У меня есть набор данных из трех переменных Y и одной переменной X, и мне нужно рассчитать их отдельные наклоны. Например, я могу легко сделать эту одну строку за раз, как показано ниже, но я надеялся, что есть более эффективный способ сделать это. Я также не думаю, что linregress - лучший способ пойти, потому что мне не нужны никакие вспомогательные переменные, такие как перехват, стандартная ошибка и т. Д. В моих результатах. Любая помощь приветствуется.Расчет склонов в Numpy (или Scipy)

import numpy as np 
    from scipy import stats 

    Y = [[ 2.62710000e+11 3.14454000e+11 3.63609000e+11 4.03196000e+11 
     4.21725000e+11 2.86698000e+11 3.32909000e+11 4.01480000e+11 
     4.21215000e+11 4.81202000e+11] 
     [ 3.11612352e+03 3.65968334e+03 4.15442691e+03 4.52470938e+03 
     4.65011423e+03 3.10707392e+03 3.54692896e+03 4.20656404e+03 
     4.34233412e+03 4.88462501e+03] 
     [ 2.21536396e+01 2.59098311e+01 2.97401268e+01 3.04784552e+01 
     3.13667639e+01 2.76377113e+01 3.27846013e+01 3.73223417e+01 
     3.51249997e+01 4.42563658e+01]] 
    X = [ 1990. 1991. 1992. 1993. 1994. 1995. 1996. 1997. 1998. 1999.] 
    slope_0, intercept, r_value, p_value, std_err = stats.linregress(X, Y[0,:]) 
    slope_1, intercept, r_value, p_value, std_err = stats.linregress(X, Y[1,:]) 
    slope_2, intercept, r_value, p_value, std_err = stats.linregress(X, Y[2,:]) 
    slope_0 = slope/Y[0,:][0] 
    slope_1 = slope/Y[1,:][0] 
    slope_2 = slope/Y[2,:][0] 
    b, a = polyfit(X, Y[1,:], 1) 
    slope_1_a = b/Y[1,:][0] 

ответ

3

Расчет линейной регрессии в одном измерении vector calculation. Это означает, что мы можем комбинировать умножения на всей матрице , а затем векторизовать соответствия, используя ось в numpy. В вашем случае, который работает к следующему

((X*Y).mean(axis=1) - X.mean()*Y.mean(axis=1))/((X**2).mean() - (X.mean())**2) 

Вы не заинтересованы в пригонки параметров качества, но большинство из них могут быть получены аналогичным образом.

+0

спасибо. именно то, что я искал. – hotshotiguana

1

С X и Y определяется таким же образом, как и в вашем вопросе, вы можете использовать:

dY = (numpy.roll(Y, -1, axis=1) - Y)[:,:-1] 
dX = (numpy.roll(X, -1, axis=0) - X)[:-1] 

slopes = dY/dX 

numpy.roll() позволяет выровнять следующее наблюдение с текущим, вам просто нужно чтобы удалить последний столбец, который не является полезной разницей между последним и первым наблюдением. Затем вы можете рассчитать все склоны сразу, без scipy.

В вашем примере dX всегда 1, поэтому вы можете сэкономить больше времени, вычислив slopes = dY.

+0

мне нужно прояснить немного, потому что я ищу только для одного склона для всех точек; что вы получаете, когда вы выполняете линейную регрессию Y на X. Например, наклон, перехват = полифит (X, Y [1 ,:], 1) дает мне значение наклона 99.87. – hotshotiguana

+0

Это дает вам наклон для каждого набора данных в Y (3). – Benjamin

5

Самый быстрый и самый эффективный способ будет использовать родную SciPy функцию от linregress, который вычисляет все:

склона: наклон линии регрессии

перехватывают: перехват линии регрессии

г-значение: коэффициент корреляции

р-значение: двухсторонняя р-значение для проверки гипотезы которого нулевая гипотеза состоит в том, что т он наклон равен нулю

STDERR: Стандартная ошибка оценки

И вот пример:

a = [15, 12, 8, 8, 7, 7, 7, 6, 5, 3] 
b = [10, 25, 17, 11, 13, 17, 20, 13, 9, 15] 
from scipy.stats import linregress 
linregress(a, b) 

возвратит вас:

LinregressResult(slope=0.20833333333333337, intercept=13.375, rvalue=0.14499815458068521, pvalue=0.68940144811669501, stderr=0.50261704627083648) 

P.S. Просто математическая формула для наклона:

enter image description here

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