|
|
  |
О представлении выборок случайных процессов рядом по собственным векторам корреляционной функции, теория и практика |
|
|
|
Jun 10 2014, 09:11
|
Группа: Участник
Сообщений: 11
Регистрация: 30-06-12
Пользователь №: 72 571

|
Есть ансамбль выборок Выборка Х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. То есть: вместо искомой декорреляции ансамбля исходных выборок Х получаю совершенно противоположный эффект - усиление корреляции. Ошибка где-то в самом принципе. Сам ошибку не вижу. Подскажите – где наврал?
|
|
|
|
|
Jun 11 2014, 01:11
|
Группа: Участник
Сообщений: 11
Регистрация: 30-06-12
Пользователь №: 72 571

|
Цитата(KalashKS @ Jun 10 2014, 18:41)  Может где-то что-то транспонировать забыли? Нет, "прошел" по всему алгоритму. А потом еще специально, для проверки, перед переводом в некоррелированные координаты добавлял транспонирование V. Все равно не тот результат
|
|
|
|
|
Jun 11 2014, 03:29
|
Местный
  
Группа: Участник
Сообщений: 236
Регистрация: 7-02-11
Пользователь №: 62 755

|
Цитата(AMih @ Jun 11 2014, 09:21)  Нет, "прошел" по всему алгоритму. А потом еще специально, для проверки, перед переводом в некоррелированные координаты добавлял транспонирование V. Все равно не тот результат Тогда показывайте, как считали. В том, что вы привели, трудно искать ошибки.
|
|
|
|
|
Jun 11 2014, 03:47
|
вопрошающий
    
Группа: Свой
Сообщений: 1 726
Регистрация: 24-01-11
Пользователь №: 62 436

|
Как-то у Вас все запутанно, давайте вместе по шагам проверим: Исходня матрица Х, для нее сингулярное разложение Х = 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 в Вашем случае подставить не транспонированную, скорее всего получите то, что Вы получили.
Считайте все через сингулярное разложение, будет и понятнее, и быстрее, и точнее - так как при плохой обусловленности корреляционные матрицы возводят в квадрат обусловленность исходной задачи.
|
|
|
|
|
Jun 11 2014, 04:59
|
Группа: Участник
Сообщений: 11
Регистрация: 30-06-12
Пользователь №: 72 571

|
Бился за декорреляцию Х по отсчетам (т.е по столбцам) Считал так: корр матрица K для Х (как и для Y) - как коэфф корреляции i и j столбцов. Собственные вектора Vi - по алгоритму Якоби (процедура из NumTollbox Borland, библиотека многократно проверена, ошибок там нет). Далее - просто матричное умножение. Собственно, все. Собственные вектора в V лежат в строках. Сейчас просчитал коэффициенты корреляции матрицы V по i и j столбцам. Значения вне главной диагонали - в интервале 0.7-0.9. Этим и объясняется результат. Надо, пожалуй, посмотреть коэфф корреляции Y по строкам. Там должно быть все по правилам. Тем не менее, декорреляции Х по отсчетам выборок (т.е. по столбцам), видимо, так не достичь Попробую SVD. Кстати, наудачу, может кто-нибудь подкинет ссылку на работающую процедуру SVD (хочется для Delphi). Самому писать лениво.
|
|
|
|
|
Jun 11 2014, 06:19
|
Группа: Участник
Сообщений: 11
Регистрация: 30-06-12
Пользователь №: 72 571

|
Цитата(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? Во всех остальных случаях ^ это транспонирование?
|
|
|
|
|
Jun 11 2014, 06:29
|
вопрошающий
    
Группа: Свой
Сообщений: 1 726
Регистрация: 24-01-11
Пользователь №: 62 436

|
Цитата(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 она из С вызывается и в Дельфи подключается.
|
|
|
|
|
Jun 11 2014, 07:06
|
Группа: Участник
Сообщений: 11
Регистрация: 30-06-12
Пользователь №: 72 571

|
Цитата(iiv @ Jun 11 2014, 14:39)  да, именно, я использовал принятые в ЛаТеХе и Википедии обозначения.
Есть такая библиотека ACML, распространяется с сайта АМДшника бесплатно. В Дельфи сто процентов можно ее подцепить, я видел, как однажды это делали, но сам не подскажу, так как с Дельфи не имею дела. В этой библиотеке есть функции dgesvd и dgesdd, которые и вычисляют сингулярные разложения: dgesvd - чуть по-проще, но помедленнее, dgesdd - чуть по-сложнее, но побыстрее. Если нужна одинарная точность или комплексные числа, заменяйте первую букву этих подпрограмм на c, z или s. Документацию к параметрам функций можно найти гуглом на ее название + слово LAPACK. Не пугайтесь фортрановских ссылок, в ACML она из С вызывается и в Дельфи подключается. Понял, спасибо. C ACML не работал еще.
|
|
|
|
|
Jun 11 2014, 07:16
|
Местный
  
Группа: Участник
Сообщений: 236
Регистрация: 7-02-11
Пользователь №: 62 755

|
Цитата(AMih @ Jun 11 2014, 15:16)  Понял, спасибо. C ACML не работал еще. Если знакомы с матлабом, рекомендую сначала в нем разобраться с задачей. Сравнительно быстро получите программу в несколько строк и посмотрите, что, как и на что умножать надо. Потом перенесете в дельфи.
|
|
|
|
|
Jun 11 2014, 07:59
|
Группа: Участник
Сообщений: 11
Регистрация: 30-06-12
Пользователь №: 72 571

|
Цитата(KalashKS @ Jun 11 2014, 15:26)  Если знакомы с матлабом, рекомендую сначала в нем разобраться с задачей. Сравнительно быстро получите программу в несколько строк и посмотрите, что, как и на что умножать надо. Потом перенесете в дельфи. Да я, собственно, так QR преобразование обкатывал. И из MatLab можно таскать функции в С-коде сразу в Delphi. Только сам пока не пробовал - QR, оказалось, проще из обкатанного в MatLab варианта перенести в дельфи. в MatLab, кстати, есть и QR и SVD, так что - только сесть и сделать.
Сообщение отредактировал AMih - Jun 11 2014, 07:59
|
|
|
|
|
Jun 19 2014, 07:51
|
Группа: Участник
Сообщений: 11
Регистрация: 30-06-12
Пользователь №: 72 571

|
Народ, в дополнение о библиотеках SVD. ASML у меня не пошла -на сайте нет 32-bit Window версии, есть только 32-bit Linux и 64-bit Window. Нашел библиотеку AlgLib под Pascal и Delphi. Попробовал - работает. Лежит здесь http://alglib.sources.ru/download.php
Сообщение отредактировал AMih - Jun 19 2014, 08:02
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|