Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: О представлении выборок случайных процессов рядом по собственным векторам корреляционной функции
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Математика и Физика
AMih
Есть ансамбль выборок
Выборка Х1=х1, x2 … xn сделана в n моментов времени. Аналогично получен еще ряд выборок.
Весь ансамбль представим как матрицу Х =
х11, x12 … x1n
х21, x22 … x2n
……………………….
хm1, xm2 … xmn
Рассчитаем корреляционную матрицу К как коэффициенты корреляции i и j столбцов. Вычислим собственные вектора Vi матрицы К.
Перейти к выборкам с некоррелированными отсчетами Y можно как Y = ХV (в матричном виде). Корреляционная матрица для Y должна быть диагональной. Это теория.
На практике: матрица К не диагональная, значения коэффициентов корреляции вне главной диагонали лежат в интервале 0.6.-.0.9. Корреляционная матрица собственных векторов Vi диагональная (специально проверял), значения вне главной диагонали не превышают заданной точности (т.е. не более 1Е-35). А корреляционная матрица для Y диагональной не получается, значения коэффициентов корреляции вне главной диагонали близки к 1. То есть: вместо искомой декорреляции ансамбля исходных выборок Х получаю совершенно противоположный эффект - усиление корреляции.
Ошибка где-то в самом принципе. Сам ошибку не вижу. Подскажите – где наврал?
KalashKS
Может где-то что-то транспонировать забыли?
AMih
Цитата(KalashKS @ Jun 10 2014, 18:41) *
Может где-то что-то транспонировать забыли?

Нет, "прошел" по всему алгоритму. А потом еще специально, для проверки, перед переводом в некоррелированные координаты добавлял транспонирование V. Все равно не тот результат
KalashKS
Цитата(AMih @ Jun 11 2014, 09:21) *
Нет, "прошел" по всему алгоритму. А потом еще специально, для проверки, перед переводом в некоррелированные координаты добавлял транспонирование V. Все равно не тот результат

Тогда показывайте, как считали. В том, что вы привели, трудно искать ошибки.
iiv
Как-то у Вас все запутанно, давайте вместе по шагам проверим:
Исходня матрица Х, для нее сингулярное разложение Х = UZW^T, U, W - унитарные, Z - квадратная диагональная
Корреляционная матрица К = X^T X = WZU^T U ZW^T = WZ ZW^T, то есть Ваши собственные векторы - это есть правые сингулярные векторы W от исходной матрицы Х.
Если же вычислить Вашу Y = ХV , то она получается в виде: Y = UZW^T W = UZ . Для нее корреляционная матрица ZU^TUZ = Z^2 - диагональна, и должна совпадать с собственными значениями исходной K матрицы.

Если W в Вашем случае подставить не транспонированную, скорее всего получите то, что Вы получили.

Считайте все через сингулярное разложение, будет и понятнее, и быстрее, и точнее - так как при плохой обусловленности корреляционные матрицы возводят в квадрат обусловленность исходной задачи.
AMih
Бился за декорреляцию Х по отсчетам (т.е по столбцам)
Считал так: корр матрица K для Х (как и для Y) - как коэфф корреляции i и j столбцов. Собственные вектора Vi - по алгоритму Якоби (процедура из NumTollbox Borland, библиотека многократно проверена, ошибок там нет). Далее - просто матричное умножение. Собственно, все.
Собственные вектора в V лежат в строках. Сейчас просчитал коэффициенты корреляции матрицы V по i и j столбцам. Значения вне главной диагонали - в интервале 0.7-0.9. Этим и объясняется результат.
Надо, пожалуй, посмотреть коэфф корреляции Y по строкам. Там должно быть все по правилам.
Тем не менее, декорреляции Х по отсчетам выборок (т.е. по столбцам), видимо, так не достичь
Попробую SVD.
Кстати, наудачу, может кто-нибудь подкинет ссылку на работающую процедуру SVD (хочется для Delphi). Самому писать лениво.
AMih
Цитата(iiv @ Jun 11 2014, 11:57) *
Как-то у Вас все запутанно, давайте вместе по шагам проверим:
Исходня матрица Х, для нее сингулярное разложение Х = UZW^T, U, W - унитарные, Z - квадратная диагональная
Корреляционная матрица К = X^T X = WZU^T U ZW^T = WZ ZW^T, то есть Ваши собственные векторы - это есть правые сингулярные векторы W от исходной матрицы Х.
Если же вычислить Вашу Y = ХV , то она получается в виде: Y = UZW^T W = UZ . Для нее корреляционная матрица ZU^TUZ = Z^2 - диагональна, и должна совпадать с собственными значениями исходной матрицы.

Если W в Вашем случае подставить не транспонированную, скорее всего получите то, что Вы получили.

Считайте все через сингулярное разложение, будет и понятнее, и быстрее, и точнее - так как при плохой обусловленности корреляционные матрицы возводят в квадрат обусловленность исходной задачи.

Будьте добры, поясните: ZU^TUZ = Z^2 здесь Z^2 есть квадрат Z? Во всех остальных случаях ^ это транспонирование?
iiv
Цитата(AMih @ Jun 11 2014, 15:29) *
Будьте добры, поясните: ZU^TUZ = Z^2 здесь Z^2 есть квадрат Z? Во всех остальных случаях ^ это транспонирование?

да, именно, я использовал принятые в ЛаТеХе и Википедии обозначения.

Цитата(AMih @ Jun 11 2014, 14:09) *
Попробую SVD.
Кстати, наудачу, может кто-нибудь подкинет ссылку на работающую процедуру SVD (хочется для Delphi). Самому писать лениво.

Есть такая библиотека ACML, распространяется с сайта АМДшника бесплатно. В Дельфи сто процентов можно ее подцепить, я видел, как однажды это делали, но сам не подскажу, так как с Дельфи не имею дела. В этой библиотеке есть функции dgesvd и dgesdd, которые и вычисляют сингулярные разложения: dgesvd - чуть по-проще, но помедленнее, dgesdd - чуть по-сложнее, но побыстрее. Если нужна одинарная точность или комплексные числа, заменяйте первую букву этих подпрограмм на c, z или s. Документацию к параметрам функций можно найти гуглом на ее название + слово LAPACK. Не пугайтесь фортрановских ссылок, в ACML она из С вызывается и в Дельфи подключается.
AMih
Цитата(iiv @ Jun 11 2014, 14:39) *
да, именно, я использовал принятые в ЛаТеХе и Википедии обозначения.


Есть такая библиотека ACML, распространяется с сайта АМДшника бесплатно. В Дельфи сто процентов можно ее подцепить, я видел, как однажды это делали, но сам не подскажу, так как с Дельфи не имею дела. В этой библиотеке есть функции dgesvd и dgesdd, которые и вычисляют сингулярные разложения: dgesvd - чуть по-проще, но помедленнее, dgesdd - чуть по-сложнее, но побыстрее. Если нужна одинарная точность или комплексные числа, заменяйте первую букву этих подпрограмм на c, z или s. Документацию к параметрам функций можно найти гуглом на ее название + слово LAPACK. Не пугайтесь фортрановских ссылок, в ACML она из С вызывается и в Дельфи подключается.

Понял, спасибо. C ACML не работал еще.
KalashKS
Цитата(AMih @ Jun 11 2014, 15:16) *
Понял, спасибо. C ACML не работал еще.

Если знакомы с матлабом, рекомендую сначала в нем разобраться с задачей. Сравнительно быстро получите программу в несколько строк и посмотрите, что, как и на что умножать надо. Потом перенесете в дельфи.
AMih
Цитата(KalashKS @ Jun 11 2014, 15:26) *
Если знакомы с матлабом, рекомендую сначала в нем разобраться с задачей. Сравнительно быстро получите программу в несколько строк и посмотрите, что, как и на что умножать надо. Потом перенесете в дельфи.

Да я, собственно, так QR преобразование обкатывал. И из MatLab можно таскать функции в С-коде сразу в Delphi. Только сам пока не пробовал - QR, оказалось, проще из обкатанного в MatLab варианта перенести в дельфи. в MatLab, кстати, есть и QR и SVD, так что - только сесть и сделать.
AMih
Народ, в дополнение о библиотеках SVD. ASML у меня не пошла -на сайте нет 32-bit Window версии, есть только 32-bit Linux и 64-bit Window. Нашел библиотеку AlgLib под Pascal и Delphi. Попробовал - работает. Лежит здесь http://alglib.sources.ru/download.php
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.