2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки


Правила форума


Посмотреть правила форума



Начать новую тему Ответить на тему На страницу 1, 2  След.
 
 Построить PACF (Частичную автокоррелограмму)
Сообщение19.12.2022, 21:21 


31/08/22
183
Всем доброго здоровья и хорошего настроения.
Подскажите пожалуйста алгоритм вычисления PACF (Частичная автокоррелограмма) для дискретного ряда?
Для ACF (автокоррелограммы) все понятно, но для PACF сколько не читаю понимания так и не наступает.
Читал статьи в инете, книги в частности Марпла, Бокса Дженкинса, другие...

 Профиль  
                  
 
 Re: Построить PACF (Частичную автокоррелограмму)
Сообщение19.12.2022, 22:09 
Заслуженный участник
Аватара пользователя


11/03/08
9904
Москва
Рекурсивно считают. По Дарбину-Левинсону.
$\phi_{n,n}=\frac{\rho_n-\Sigma_{k=1}^{n-1}\phi_{n-1,k}\rho_{n-k}}{1-\Sigma_{k=1}^{n-1}\phi_{n-1,k}\rho_k}$
$\phi_{n,k}=\phi_{n-1,k}-\phi_{n,n}\phi_{n-1,n-k}$

 Профиль  
                  
 
 Re: Построить PACF (Частичную автокоррелограмму)
Сообщение20.12.2022, 15:32 


31/08/22
183
Евгений Машеров
Несколько раз пытался понять Ваши формулы... безуспешно.
Почитал про Дарбина-Левинсона, ну это просто способ решить СЛАУ быстрее, зная ее особенности. Пока что я пользовался MathCAD встроенной функцией, она решает уравнения с Теплицевой симметричной матрицей.
В другом источнике вычитал что нужно считать все ковариации и из них составлять СЛАУ, получается Теплицева матрица. Каждый раз количество строк и столбцов увеличивается на 1.
Так же столбцы Теплицевой матрицы нужно домножать на уже найденные коэффициенты частичной автокорреляции.
Видимо Вы это имели в виду.
2 вопроса
1 Можно ли как то избавиться от пересоздания матриц? Вычислять как то иначе. С пересозданием на каждой итерации алгоритм получается крайне тяжелый (тяжелый имеется в виду когда он уже ляжет на C#)
2 Видно, что на каждом шаге вычисляется не только корреляция с начальным элементом но и с остальными элементами, друг между другом, из этого можно сделать симметричную матрицу которая показывает частичные корреляции любого элемента с любым. Мне просто интересно это используется в каких то алгоритмах? Возможно в отыскании регрессии...

-- 20.12.2022, 15:46 --

2 Так это и есть уравнения Юла-Уолкера что ли?

 Профиль  
                  
 
 Re: Построить PACF (Частичную автокоррелограмму)
Сообщение20.12.2022, 21:02 
Заслуженный участник
Аватара пользователя


11/03/08
9904
Москва
Поскольку матрица тёплицева, то не надо держать её всю nxn. И алгоритмы используют векторное представление.

 Профиль  
                  
 
 Re: Построить PACF (Частичную автокоррелограмму)
Сообщение21.12.2022, 12:02 


31/08/22
183
Так все равно на каждом шаге придется создавать новый вектор описывающий текущий шаг. Я правильно понял что матрица при этом получится из все возрастающих по длине векторов, т.е. зубчатый 2D массив? Матрица верхне треугольная (нижняя часть просто зеркальна).

 Профиль  
                  
 
 Re: Построить PACF (Частичную автокоррелограмму)
Сообщение21.12.2022, 12:49 
Заслуженный участник
Аватара пользователя


11/03/08
9904
Москва
Если зачем-то сохранять промежуточные результаты - то можно и треугольник. Но вообще-то хватает вектора длины n.

 Профиль  
                  
 
 Re: Построить PACF (Частичную автокоррелограмму)
Сообщение21.12.2022, 13:59 


31/08/22
183
Нет, не понимаю. Поясните пожалуйста.
Для примера рассмотрим нахождение 2х коэффициентов.
Для первого система выглядит крайне просто
$A=\begin{bmatrix}
c_{0}
\end{bmatrix}
B=\begin{bmatrix}
c_{1}
\end{bmatrix}$
Для второго чуть сложнее
$A=\begin{bmatrix}
c_{0}\cdot pacf_1 & c_{1}\\ 
c_{1}\cdot pacf_1 & c_{0}
\end{bmatrix}
B=\begin{bmatrix}
c_{1} \\
c_{2}
\end{bmatrix}$
Во второй СЛАУ $pacf_1$ это найденный коэффициент в предыдущем шаге.
с это ковариации.

Что предлагается сделать чтобы избавиться от матриц? Мы же на каждом шаге должны решить СЛАУ, как это сделать если у нас останутся только вектора? (имеется в виду видимо самый правый вектор A, потому что именно в нем искомый коэффициент и вектор ответа B)

ПС: Первым коэффициентом вообще говоря будет 1 но мы ее не считаем.

 Профиль  
                  
 
 Re: Построить PACF (Частичную автокоррелограмму)
Сообщение21.12.2022, 14:07 
Заслуженный участник
Аватара пользователя


11/03/08
9904
Москва
https://scask.ru/a_book_p_net.php?id=255

 Профиль  
                  
 
 Re: Построить PACF (Частичную автокоррелограмму)
Сообщение23.12.2022, 11:39 


31/08/22
183
Спасибо за ссылку, но разобраться к сожалению не удалось.
Вот тут нашел более понятное описание
http://www.emptyloop.com/technotes/A%20tutorial%20on%20linear%20prediction%20and%20Levinson-Durbin.pdf
Но и тут понять алгоритм до конца не получается (если не тупо копировать текст программы) он затирает искомые значения, и сами они получаются со все более возрастающий ошибкой...
Помогите пожалуйста "добить" алгоритм.
$Ax=b$
$A=\begin{bmatrix}
c_0\\ 
c_1\\ 
c_2
\end{bmatrix},
x=\begin{bmatrix}
x_0\\ 
x_1\\ 
x_2
\end{bmatrix},
b=\begin{bmatrix}
b_0\\ 
b_1\\ 
b_2
\end{bmatrix}$
Можно сразу найти
$x_0=1$
$x_1=c_1/c_0$
Что делать дальше?

 Профиль  
                  
 
 Re: Построить PACF (Частичную автокоррелограмму)
Сообщение23.12.2022, 19:19 
Заслуженный участник
Аватара пользователя


11/03/08
9904
Москва
Что-то мне непонятно, что Вам непонятно. Рекурсия. Строим модель порядка 1. Затем, имея модель порядка (n-1), переходим к модели порядка n.

 Профиль  
                  
 
 Re: Построить PACF (Частичную автокоррелограмму)
Сообщение24.12.2022, 20:07 


31/08/22
183
В статье уже выведен алгоритм, но правда линейного предсказания.
Код на С++, но он прокоментирован в статье конечными формулами.

(Оффтоп)

Код:
void ForwardLinearPrediction( vector<double> &coeffs, const vector<double> &x )
{
    // GET SIZE FROM INPUT VECTORS
    size_t N = x.size() - 1;
    size_t m = coeffs.size();
    // INITIALIZE R WITH AUTOCORRELATION COEFFICIENTS
    vector<double> R( m + 1, 0.0 );
    for ( size_t i = 0; i <= m; i++ )
    {
        for ( size_t j = 0; j <= N - i; j++ )
        {
            R[ i ] += x[ j ] * x[ j + i ];
        }
    }
   
    // INITIALIZE Ak
    vector<double> Ak( m + 1, 0.0 );
    Ak[ 0 ] = 1.0;
    // INITIALIZE Ek
    double Ek = R[ 0 ];
    // LEVINSON-DURBIN RECURSION
    for ( size_t k = 0; k < m; k++ )
    {
        // COMPUTE LAMBDA
        double lambda = 0.0;
        for ( size_t j = 0; j <= k; j++ )
        {
            lambda -= Ak[ j ] * R[ k + 1 - j ];
        }
       
        lambda /= Ek;
       
        // UPDATE Ak
        for ( size_t n = 0; n <= ( k + 1 ) / 2; n++ )
        {
            double temp = Ak[ k + 1 - n ] + lambda * Ak[ n ];
            Ak[ n ] = Ak[ n ] + lambda * Ak[ k + 1 - n ];
            Ak[ k + 1 - n ] = temp;
        }
       
        // UPDATE Ek
       
        Ek *= 1.0 - lambda * lambda;
    }
   
    // ASSIGN COEFFICIENTS
    coeffs.assign( ++Ak.begin(), Ak.end() );
}


Хорошо, подсчет автокорреляций явно лишний, вырезаем. Оставляем только рекурсию, в качестве исходных данных подаем предварительно посчитанные ковариации. Пишу в MathCAD, поэтому покорежу С++ код чтобы было похоже.

(Оффтоп)

Код:
void LD(cov)
{
    N = length(cov) - 1; // длина вектора исходных данных
    m = length(cov); // длина искомых коэффициентов
   
    Ak( m + 1, 0.0 ); // создаем Ak длиной m+1, инициализируем нулями
    Ak[ 0 ] = 1.0;

    Ek = cov[ 0 ];
    // LEVINSON-DURBIN RECURSION
    for ( k = 0; k < m; k++ )
    {
        // COMPUTE LAMBDA
        lambda = 0.0;
        for ( j = 0; j <= k; j++ )
        {
            lambda = lambda - Ak[ j ] * R[ k + 1 - j ];
        }
       
        lambda = lambda / Ek;
       
        // UPDATE Ak
        for ( n = 0; n <= ( k + 1 ) / 2; n++ )
        {
            temp = Ak[ k + 1 - n ] + lambda * Ak[ n ];
            Ak[ n ] = Ak[ n ] + lambda * Ak[ k + 1 - n ];
            Ak[ k + 1 - n ] = temp;
        }
       
        // UPDATE Ek
        Ek = Ek * (1.0 - lambda * lambda);
    }
   
    // ASSIGN COEFFICIENTS
    Ak; // возвращаем рассчитанные коэффициенты
}

Проверяю встроенной функцией lpcorr расчитывающую PACF.
Код выдает неверные результаты, но если его отлаживать замечаем что при ограничении цикла по k он считает почти верно, но потом затирает найденное...

В приведенной Вами статье я перестаю понимать что происходит на А.4, собственно там теоретический вывод, но где конечные формулы непонятно.
Судя по приведенной мной статье рекурсию можно(?) развернуть в цикл, заведомо создавая векторы максимально необходимой длины, насколько я понял.
Через полные матрицы я научился решать.
Как я уже написал очевидно и в случае Дурбина-Левинсона первые 2 ответа будут:
$x_0=1$
$x_1=c_1/c_0$
Напишите пожалуйста как выглядит ответ для следующего x.

 Профиль  
                  
 
 Re: Построить PACF (Частичную автокоррелограмму)
Сообщение25.12.2022, 17:36 
Заслуженный участник
Аватара пользователя


11/03/08
9904
Москва
По-моему, Вы просто случайно записываете промежуточные результаты не туда. Программистская ошибка.
А "ответ для следующего" должен быть $\phi_{22}=\frac{\rho_2-\rho_1^2}{1-\rho_1^2}$

 Профиль  
                  
 
 Re: Построить PACF (Частичную автокоррелограмму)
Сообщение26.12.2022, 21:45 


31/08/22
183
Что то у меня не ладится с Вашими пояснениями в данной ветке :D
Рекусия по формулам со второго сообщения не завелась.
Следующий x по приведенной формуле не считается.
Ро это ковариация? Хотя я пробовал и ковариацию и предыдущие Фи...

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

Тем не менее спасибо, хоть как то заработало.

 Профиль  
                  
 
 Re: Построить PACF (Частичную автокоррелограмму)
Сообщение27.12.2022, 08:02 
Заслуженный участник
Аватара пользователя


11/03/08
9904
Москва
Ро это коэффициенты (обычной) автокорреляции.

 Профиль  
                  
 
 Re: Построить PACF (Частичную автокоррелограмму)
Сообщение27.12.2022, 11:47 


31/08/22
183
Хорошо, автокорреляции. Посчитал, получается значение вообще никак не фигурирующее в работающем алгоритме. Проверяю на не оптимизированном алгоритме с полными матрицами.
Как пользоваться формулами из сообщения 2?
Фи это же искомые частные корреляции?
Почему Фи двумерный? Он что хранит все частные автокорреляции? Мы же избавились от матриц.
Видимо для первого шага сумматоры будут равны 0 так как никаких значений фи еще не существует. Значит $\varphi _{0,0}=\frac{\rho _0}{1}=1$ Хорошо, совпадает.
Следующим шагом наверно нужно посчитать вторую формулу
$\varphi _{1,0}=\varphi _{0,0}-\varphi _{0,0}\varphi _{0,1}$, где взять $\varphi _{0,1}$?
Допустим я попутал индексы n с k, но и тогда возникает та же проблема...
Чтобы посчитать $\varphi _{1,1}$ нужны значения с k...
В приведенной Вами формуле разве не должны фигурировать предыдущие рассчитанные значения Фи?
В общем эта рекурсия окончательно сломала мне мозг :D
Как это считать?
Напишите пожалуйста расчет первых 2х значений.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 17 ]  На страницу 1, 2  След.

Модераторы: Модераторы Математики, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group