Пример базового линейного прогнозирования - PullRequest
0 голосов
/ 31 октября 2018

Я пытаюсь обернуть голову вокруг линейного предсказания и решил, что я напишу базовый пример на 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 голосов
/ 12 декабря 2018

Алгоритм линейного предсказания расширяет исходную последовательность с бесконечным количеством нулей в обоих направлениях. Таким образом, если ваш входной сигнал не имеет постоянного нуля, расширенная последовательность не является линейной, и вы должны ожидать ненулевую ошибку. Вот моя реализация 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
...