2012-03-02 196 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 2012-03-02 19:15:42

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

我要澄清一點,因爲我只找了所有的點單斜率;例如,斜率,截距= polyfit(X,Y [1 ,:],1)爲我提供了一個99.87的斜率值。 – hotshotiguana 2012-03-02 19:04:32

+0

這給出了Y(3)中每組數據的斜率。 – Benjamin 2012-03-02 19:32:24

5

最快和最有效的方式是使用原生SciPy的功能從linregress,它計算的一切:

坡:迴歸線

截距的斜率:迴歸線

的攔截

r值:相關係數

p值:假設檢驗的雙側p值,其零假設是t他斜率爲零

標準錯誤:估計

這裏的標準誤差是一個例子:

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) 

附:只是斜率一個數學公式:

enter image description here