Я хотел бы сгенерировать матрицу случайной корреляции размером , чтобы присутствовали умеренно сильные корреляции: n × n
- квадратная вещественная симметричная матрица размера , например ;n = 100
- положительно определенный, то есть со всеми собственными значениями, действительными и положительными;
- полный ранг;
- все диагональные элементы равны ;
- недиагональные элементы должны быть равномерно распределены по . Точное распределение не имеет значения, но я хотел бы иметь умеренно большое количество (например, ) умеренно больших значений (например, с абсолютным значением или выше). По сути, я хочу убедиться, что не является почти диагональным со всеми недиагональными элементами .10 % 0,5 С
Есть ли простой способ сделать это?
Цель состоит в том, чтобы использовать такие случайные матрицы для сравнения некоторых алгоритмов, работающих с корреляционными (или ковариационными) матрицами.
Методы, которые не работают
Вот несколько способов генерирования матриц случайной корреляции, о которых я знаю, но которые здесь не работают:
Генерация случайных из размера, в центре, стандартизировать и образуют матрицу корреляции . Если , это обычно приводит к тому, что все недиагональные корреляции будут около . Если , некоторые корреляции будут сильными, но не будет полного ранга. s × n C = 1s>n0s≪nC
Генерация случайной положительно определенной матрицы одним из следующих способов:
Создайте случайный квадрат и сделайте симметричный положительно определенный .B = A A ⊤
Создайте случайный квадрат , сделайте симметричный и сделайте его положительно определенным, выполнив собственное разложение и установка всех отрицательных собственных значений в ноль: . NB: это приведет к матрице с недостатком ранга.E = A + A ⊤ E = U S U ⊤ B = U
Генерация случайной ортогональной (например, путем генерации случайного квадрата и выполнения его QR-разложения или с помощью процесса Грамма-Шмидта) и случайной диагонали со всеми положительными элементами; form .
Полученная матрица может быть легко нормализована, чтобы иметь все единицы по диагонали: , где является диагональной матрицей с той же диагональю , как . Все три перечисленных выше способа генерации приводят к тому, что имеет недиагональные элементы, близкие к .
Обновление: Старые темы
После публикации моего вопроса я обнаружил два почти дубликата в прошлом:
- Как создать матрицу случайной корреляции, которая имеет приблизительно нормально распределенные недиагональные записи с заданным стандартным отклонением?
- Как эффективно генерировать случайные положительно-полуопределенные корреляционные матрицы?
К сожалению, ни одна из этих тем не содержала удовлетворительного ответа (до сих пор :)
источник
nXk
загрузочную матрицу W, не полностью случайную, а ту, которую мы хотим (онаWW'+diag(noise)
определит матрицу cov, которую мы ищем. Единственная задача - исправить нормализованную по столбцам W (т.е. "собственные векторы"), чтобы стать ортогональными. Любой метод для декорреляции коррелированных переменных (здесь переменные являются собственными векторами), вероятно, подойдет. (ЭтоОтветы:
Другие ответы придумывали хорошие приемы, чтобы решить мою проблему различными способами. Однако я нашел принципиальный подход, который, на мой взгляд, имеет большое преимущество, поскольку он концептуально очень ясен и прост в настройке.
В этой теме: Как эффективно генерировать случайные матрицы положительной-полуопределенной корреляции? - Я описал и предоставил код для двух эффективных алгоритмов генерации матриц случайной корреляции. Оба взяты из статьи Левандовски, Куровицки и Джо (2009), о которой @ssdecontrol упоминал в комментариях выше (большое спасибо!).
Пожалуйста, смотрите мой ответ там для большого количества цифр, объяснений и кода Matlab. Так называемый метод «виноградной лозы» позволяет генерировать матрицы случайной корреляции с любым распределением частичных корреляций и может использоваться для генерации матриц корреляции с большими недиагональными значениями. Вот пример рисунка из этой темы:
Единственное, что меняется между участками, - это один параметр, который контролирует, насколько распределение частичных корреляций сконцентрировано в районе .±1
Я также копирую свой код для генерации этих матриц, чтобы показать, что он не длиннее, чем другие методы, предложенные здесь. Пожалуйста, смотрите мой связанный ответ для некоторых объяснений. Значения50,20,10,5,2,1 100
betaparam
для рисунка выше были (а размерность была ).d
Обновление: собственные значения
@psarka спрашивает о собственных значениях этих матриц. На рисунке ниже я строю спектры собственных значений тех же шести корреляционных матриц, что и выше. Обратите внимание, что они постепенно уменьшаются; напротив, метод, предложенный @psarka, обычно приводит к корреляционной матрице с одним большим собственным значением, но все остальное довольно равномерно.
Обновить. Действительно простой метод: несколько факторов
Подобно тому, что @ttnphns написал в комментариях выше и @GottfriedHelms в своем ответе, один очень простой способ достичь моей цели - случайным образом сгенерировать несколько ( ) факторных загрузок (случайная матрица из размера) , сформируйте ковариационную матрицу (которая, конечно, не будет полного ранга) и добавьте к ней случайную диагональную матрицу с положительными элементами, чтобы сделать полный ранг. Результирующая ковариационная матрица может быть нормализована, чтобы стать корреляционной матрицей (как описано в моем вопросе). Это очень просто и делает свое дело. Вот несколько примеров корреляционных матриц дляk<n W k×n WW⊤ D B=WW⊤+D k=100,50,20,10,5,1 :
Единственным недостатком является то, что результирующая матрица будет иметь больших собственных значений, а затем внезапное падение, в отличие от хорошего затухания, показанного выше с помощью метода vine. Вот соответствующие спектры:k
Вот код:
источник
W
подразумевает, что столбцы ортогональны (то есть косинусы между ними равны 0).W
Конечно, просто генерировать случайные числа не дает этого. Если они не являются ортогональными - то есть факторы являются косыми (назовем тогдаW
какW_
) - теорема о факторе не является,WW'
ноW_CW_'
с тем,C
чтобы быть "корреляциями" (косинусами) между факторами. Теперь,C=Q'Q
сQ
будучи неортогональную матрицу вращения вращенияW_=inv(Q)'W
(и такW=W_Q'
). Сгенерируйте несколькоQ
- матрицу со столбцом ss = 1 и матрицей ss = размер матрицы.W_=inv(Q)'W
, конечноW_= W inv(Q)'
.W = replicate(k, rnorm(d)); S = W%*%t(W) + diag(rnorm(d),nrow=d); S = diag(1/sqrt(diag(S)))%*%S%*%diag(1/sqrt(diag(S)))
S <- matrix(nearPD(S, corr = TRUE, keepDiag = TRUE)$mat@x,ncol(S),ncol(S))
источник
crs
Хм, после того как я сделал пример на своем языке MatMate, я вижу, что уже есть Python-ответ, который может быть предпочтительнее, потому что Python широко используется. Но поскольку у вас остались вопросы, я покажу вам свой подход с использованием языка Matmate-matrix-language, возможно, он более комментирует себя.
Способ 1
(с помощью MatMate):
Проблема здесь может заключаться в том, что мы определяем блоки подматриц, которые имеют высокие корреляции внутри с небольшой корреляцией между ними, и это не программно, а с помощью постоянных выражений конкатенации. Может быть, этот подход может быть более элегантно смоделирован в python.
Метод 2 (а)
После этого, есть совершенно другой подход, где мы заполняем возможную оставшуюся ковариацию случайными величинами 100 процентов в матрицу факторных нагрузок. Это сделано в Pari / GP:
и полученная корреляционная матрица
Возможно, это генерирует корреляционную матрицу с доминирующими главными компонентами из-за кумулятивного правила генерации для матрицы факторных нагрузок. Также может быть лучше обеспечить положительную определенность, сделав последнюю часть дисперсии уникальным фактором. Я оставил это в программе, чтобы сосредоточиться на общем принципе.
Корреляционная матрица 100x100 имела следующие частоты корреляций (округленные до 1 разряда)
[Обновить]. Хм, матрица 100х100 плохо подготовлена; Pari / GP не может правильно определить собственные значения с помощью функции polroots (charpoly ()) даже с точностью до 200 цифр. Я выполнил вращение Якоби до pca-формы на матрице нагрузок L и нашел в основном чрезвычайно малые собственные значения, напечатал их в логарифмах до основания 10 (которое примерно соответствует положению десятичной точки). Читайте слева направо, а затем строка за строкой:
[обновление 2]
Метод 2 (b)
Улучшение может заключаться в увеличении дисперсии, специфичной для элементов, до некоторого не маргинального уровня и уменьшении до достаточно меньшего числа общих факторов (например, целочисленного квадрата от номера элемента):
Структура результата
по сроку распределения корреляций:
остается схожим (также неприятная неразложимость PariGP), но собственные значения, найденные с помощью вращения Якоби матрицы загрузки, теперь имеют лучшую структуру, для нового вычисленного примера я получил собственные значения как
источник
источник
R имеет пакет (clusterGeneration), который реализует метод в:
Пример:
К сожалению, с этим не представляется возможным моделировать корреляции, которые следуют за распределением равномерного распределения. Кажется, корреляции становятся более сильными, если
alphad
заданы очень малые значения, но даже при1/100000000000000
этом диапазон корреляций возрастет примерно до 1,40.Тем не менее, я надеюсь, что это может быть кому-то полезно.
источник