Генерация многомерных нормально распределенных случайных чисел в Matlab

Этот вопрос касается использования ковариационной матрицы в многомерном нормальном распределении:

Я хочу сгенерировать многомерные случайные числа x в Matlab с заданным средним mu и ковариационной матрицей Sigma. Предполагая, что Z - стандартное нормально распределенное случайное число (например, сгенерированное с использованием randn), каков правильный код:

x = mu + chol(Sigma) * Z

or

x = mu + Sigma ^ 0.5 * Z

?

Я не уверен в использовании ковариационной матрицы в определении многомерного нормального распределения - независимо от того, является ли определитель в знаменателе квадратным корнем или фактором Холецкого ...


person Futurist    schedule 23.01.2015    source источник
comment
Это первый вариант, но я думаю, вам нужно включить сложное транспонирование. См. здесь. В качестве альтернативы используйте функцию Matlab mvnrnd, которая принимает sigma и выполняет внутреннюю декомпозицию Chlesky   -  person Luis Mendo    schedule 23.01.2015
comment
@LuisMendo, afaics ^0.5 или sqrtm тоже должны работать. В чем преимущество chol? Я предполагаю, что числовая точность восстановления сигмы?   -  person A. Donda    schedule 23.01.2015
comment
@ A.Donda Извини, я неправильно прочитал Sigma^0.5. На самом деле я в этом не уверен. Что я точно знаю, так это то, что первый вариант верен. Может второй тоже   -  person Luis Mendo    schedule 23.01.2015


Ответы (1)


Если по определению вы ссылаетесь на плотность многомерного нормального распределения:

он не содержит ни разложения Холецкого, ни матричного квадратного корня из Σ, а его обратного и скалярного квадратного корня из его определителя.

Но для численного генерирования случайных чисел из этого распределения плотность бесполезна. Это даже не самое общее описание многомерного нормального распределения, поскольку формула плотности имеет смысл только для положительно определенных матриц Σ, в то время как распределение также определяется, если есть нулевые собственные значения - это просто означает, что дисперсия равна 0 в направлении соответствующего собственного вектора.

Ваш вопрос следует подходу, чтобы начать со стандартных многомерных нормально распределенных случайных чисел Z, созданных randn, а затем применить линейное преобразование. Предполагая, что mu является p-мерным вектором-строкой, нам нужна nxp-мерная случайная матрица (каждая строка - одно наблюдение, каждый столбец - одна переменная):

Z = randn(n, p);
x = mu + Z * A;

Нам нужна матрица A такая, чтобы ковариация x была Sigma. Поскольку ковариация Z является единичной матрицей, ковариация x задается A' * A. Решение этой проблемы дает разложение Холецкого, поэтому естественным выбором является

A = chol(Sigma);

где A - верхнетреугольная матрица.

Однако мы также можем найти эрмитово решение, A' = A, и тогда A' * A превратится в A^2, квадрат матрицы. Решение этой проблемы дает квадратный корень матрицы, который вычисляется путем замены каждого собственного значения Sigma квадратным корнем (или отрицательным); в общем, существует 2ⁿ возможных решений для n положительных собственных значений. Функция Matlab sqrtm возвращает квадратный корень главной матрицы, который является единственным неотрицательно-определенным решением. Следовательно,

A = sqrtm(Sigma)

тоже работает. A ^ 0.5 в принципе должен поступать так же.

Моделирование с использованием этого кода

p = 10;
n = 1000;

nr = 1000;
cp = nan(nr, 1);
sp = nan(nr, 1);
pp = nan(nr, 1);

for i = 1 : nr
    x = randn(n, p);
    Sigma = cov(x);

    cS = chol(Sigma);
    cp(i) = norm(cS' * cS - Sigma);

    sS = sqrtm(Sigma);
    sp(i) = norm(sS' * sS - Sigma);

    pS = Sigma ^ 0.5;
    pp(i) = norm(pS' * pS - Sigma);
end    

mean([cp sp pp])

yield, что chol более точен, чем два других метода, а профилирование показывает, что он также намного быстрее, как для p = 10, так и для p = 100.

Однако разложение Холецкого имеет тот недостаток, что оно определено только для положительно определенного Σ, в то время как требование матричного квадратного корня состоит просто в том, что Σ является неотрицательно-определенным (sqrtm возвращает предупреждение для единичного ввода, но возвращает действительный результат ).

person A. Donda    schedule 23.01.2015
comment
Молодец! Я не знал о sqrtm - person Luis Mendo; 24.01.2015
comment
Хорошее четкое и исчерпывающее объяснение. Большое спасибо! - person Futurist; 02.02.2015
comment
что, если Sigma имеет отрицательные значения, а не положительно определенный? Холецкий будет рыдать. Есть подсказка? - person seralouk; 21.02.2020
comment
@makis, Sigma может иметь отрицательные записи (недиагональные), если у нее нет отрицательных собственных значений. Если это так, то это недействительная ковариационная матрица, т. Е. Не существует возможного распределения, для которого это ковариация. Вы должны задать себе вопрос, почему существуют отрицательные собственные значения. - person A. Donda; 22.02.2020