Пример базового линейного предсказания

Я пытаюсь сосредоточиться на линейном прогнозировании и решил, что кодирую базовый пример на Python, чтобы проверить свое понимание. Идея кодирования с линейным предсказанием состоит в том, чтобы оценить будущие выборки сигнала на основе линейных комбинаций прошлых выборок.

Я использую модуль lpc в scikits.talkbox, поэтому мне не нужно писать какой-либо алгоритм самостоятельно. Вот мой код:

import math
import numpy as np
from scikits.talkbox.linpred.levinson_lpc import levinson, acorr_lpc, lpc

x = np.linspace(0,11,12)

order = 5
"""
a = solution of the inversion
e = prediction error
k = reflection coefficients
"""

(a,e,k) = lpc(x,order,axis=-1)
recon = []

for i in range(order,len(x)):
    sum = 0
    for j in range(order):
        sum += -k[j]*x[i-j-1]
    sum += math.sqrt(e)
    recon.append(sum)

print(recon) 
print(x[order:len(x)])

что дает результат

[5.618790615323507, 6.316875690307965, 7.0149607652924235, 
7.713045840276882, 8.411130915261339, 9.109215990245799, 9.807301065230257, 
10.505386140214716]
[ 4.  5.  6.  7.  8.  9. 10. 11.]

Меня беспокоит то, что я как-то неправильно реализую это, потому что я решил, что если мой входной массив является линейным сигналом, у него не должно быть проблем с прогнозированием будущих значений на основе прошлых значений. Тем не менее, похоже, что у него есть особенно высокая ошибка, особенно для первых нескольких значений. Сможет ли кто-нибудь сказать мне, правильно ли я это реализую, или указать мне несколько примеров, где это делается на Python? Любая помощь приветствуется, спасибо!

1
0
2 514
1

Ответы 1

Алгоритм линейного предсказания расширяет исходную последовательность бесконечным количеством нулей в обоих направлениях. Итак, если ваш входной сигнал не является постоянным нулем, расширенная последовательность не является линейной, и вы должны ожидать ненулевой ошибки. Вот моя реализация Python:

def lpc(y, m):
    "Return m linear predictive coefficients for sequence y using Levinson-Durbin prediction algorithm"
    #step 1: compute autoregression coefficients R_0, ..., R_m
    R = [y.dot(y)] 
    if R[0] == 0:
        return [1] + [0] * (m-2) + [-1]
    else:
        for i in range(1, m + 1):
            r = y[i:].dot(y[:-i])
            R.append(r)
        R = np.array(R)
    #step 2: 
        A = np.array([1, -R[1] / R[0]])
        E = R[0] + R[1] * A[1]
        for k in range(1, m):
            if (E == 0):
                E = 10e-17
            alpha = - A[:k+1].dot(R[k+1:0:-1]) / E
            A = np.hstack([A,0])
            A = A + alpha * A[::-1]
            E *= (1 - alpha**2)
        return A

Другие вопросы по теме