Простой алгоритм генерации положительно-полуопределенных матриц - PullRequest
24 голосов
/ 06 марта 2009

Я хочу генерировать положительные случайные полуопределенные матрицы. Я ищу алгоритм или, более предпочтительно, простую реализацию алгоритма на C, Matlab, Java или любом языке.

Ответы [ 6 ]

42 голосов
/ 06 марта 2009
  1. генерирует случайную матрицу
  2. умножьте это на собственное транспонирование
  3. вы получили положительную полуопределенную матрицу.

Пример кода (Python):

from scipy import random, linalg
matrixSize = 10 
A = random.rand(matrixSize,matrixSize)
B = numpy.dot(A,A.transpose())
print 'random positive semi-define matrix for today is', B
18 голосов
/ 06 марта 2009

Вы должны уточнить ваше определение «случайного». Каковы ваши ограничения на полученную матрицу? Вы хотите, чтобы коэффициенты были равномерно или нормально распределены? Вы хотите, чтобы собственные значения имели конкретное распределение? (И т.д.).

Существует несколько способов генерации положительных полуопределенных матриц M, в том числе:

  1. Для произвольной матрицы A вычислим M = A T A (построив разложение Холецкого )
  2. Учитывая произвольную диагональную матрицу S с неотрицательными диагональными элементами и ортонормированную матрицу Q того же размера, вычислим M = QSQ T (построение разложения по сингулярным значениям )

По численным причинам я, вероятно, выбрал бы второй подход, генерируя диагональную матрицу с требуемыми свойствами, а затем генерируя Q как композицию из числа отражений домохозяина (генерировать случайный вектор v, масштабировать до единичная длина, H = I - 2vv T ); Я подозреваю, что вы захотите использовать K * N, где N - размер матрицы M, а K - число от 1,5 до 3 (я полагаю, что), что гарантирует, что у него достаточно степеней свободы.

Вы также можете сгенерировать ортонормированную матрицу Q, используя Повороты Гивенса : выберите 2 различных значения от 1 до N и сгенерируйте вращение Гивенса вокруг этой пары осей с углом, равномерно распределенным от 0 до 2 * число Пи. Затем возьмите K * N из них (те же рассуждения, что и в предыдущем абзаце), и их состав дает Q.

edit: я бы предположил (не уверен), что если у вас есть коэффициенты, которые генерируются независимо и нормально распределяются, то матрица в целом будет "нормально распределена" (что бы это ни значило) , По крайней мере, это верно для векторов. (N независимо сгенерированных гауссовских случайных величин, по одной для каждого компонента, дает гауссовский случайный вектор) Это не так для равномерно распределенных компонентов.

8 голосов
/ 06 марта 2009

Если вы можете сгенерировать случайную матрицу на выбранном вами языке, то с помощью свойства, которое матрица, умноженная на ее транспонирование, является положительным полуопределенным, вы можете сгенерировать случайный положительный полуопределенный matix

В Matlab это будет так же просто, как

% Generate a random 3x3 matrix
    A = rand(3,3) 
% Multiply by its tranpose
    PosSemDef = A'*A 
6 голосов
/ 02 июля 2010

Естественные распределения на положительных полуопределенных матрицах: Распределения Уишарта .

2 голосов
/ 21 сентября 2011

A '* A даст положительную полуопределенную матрицу тогда и только тогда, когда A имеет недостаток ранга. Таким образом, ответы, изложенные выше и скопированные из Википедии, как правило, не соответствуют действительности. Чтобы вычислить положительную полуопределенную матрицу, просто возьмите любую прямоугольную матрицу m на n (m

0 голосов
/ 22 сентября 2018

Чтобы уточнить немного (надеюсь). Пусть A - случайная матрица (например, заполненная случайными нормальными переменными), m x n с m> = n. Тогда, если A имеет полный ранг столбца, A'A будет положительно определенным. Если A имеет ранг

Случайная нормальная матрица с m> = n почти наверняка будет иметь полный ранг; для генерации матрицы с недостатком ранга можно добавить один или несколько столбцов, которые являются линейными комбинациями других столбцов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...