簡體   English   中英

Python / Cython:高效回歸

[英]Python/Cython: efficient regression

我正在研究一種算法(用Python / Cython編寫),該算法使用可變的窗口大小來估計嘈雜數據中每個點的梯度。 它工作得很好,但是似乎算法受回歸部分的限制。 這是我使用的:

cdef double regression(np.ndarray[DTYPE_t, ndim=1] data, np.ndarray[DTYPE_t, ndim=1] time, unsigned int leftlim2, unsigned int rightlim2):
    cdef unsigned int length, j
    cdef double x, y, sumx, sumy, xy, xx, result, a, b, invlen
    length = 0
    sumx = 0
    sumy = 0
    xy = 0
    xx = 0
    for j from leftlim2 <= j < rightlim2: 
        x = time[j]
        y = data[j]
        sumx += x
        sumy += y
        xy += x*y
        xx += x*x

    length = rightlim2 - leftlim2
    invlen = 1.0/length
    a = xy-(sumx*sumy)*invlen
    b = xx-(sumx*sumx)*invlen
    result = a/b
    return result

輸入:

  • 實驗期間測量的數據和時間的向量/數組。 數據數組包含例如施加力的嘈雜數據,時間數組包含等間隔的時間記錄(0.1s,0.2s,0.3s等)
  • 回歸必須包含多少數據的左右限制(以索引形式提供)(即,用於回歸的數據由data [leftlim2:rightlim2]給出)

輸出:近似於數據集的直線的斜率(y = a * x + b)。

我只對斜率感興趣,對截距不感興趣,因此只使用循環而不是使用矩陣向量乘法進行回歸。 我想知道是否有人知道一種在不犧牲准確性的情況下提高回歸效率的方法。 也許有一種方法可以利用時間數組的相等間隔?

我對Cython語法不熟悉,但是這樣可以加快速度:

def my_regression(data, time, leftlim, rightlim):
    timeslice = time[leftlim:rightlim]
    dataslice = data[leftlim:rightlim]

    sumx = sum(timeslice)

    a = sum(timeslice*dataslice)-sum(dataslice)*sumx/(rightlim-leftlim)
    b = sum(timeslice**2)-sumx**2/(rightlim-leftlim)
    return a/b

計時結果:

n = 1000
data = np.random.random(n)
time = np.arange(n,dtype=float)/n
leftlim = 10
rightlim = 900

%timeit my_regression(data,time,leftlim,rightlim)
>> 10000 loops, best of 3: 74.3 µs per loop 
%timeit your_regression(data,time,leftlim,rightlim)
>> 100 loops, best of 3: 2.88 ms per loop 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM