Простой алгоритм генерации положительно-полуопределенных матриц

StackOverflow https://stackoverflow.com/questions/619335

  •  03-07-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

<Ол>
  • генерировать случайную матрицу
  • умножить его на собственное транспонирование
  • вы получили положительную полуопределенную матрицу.
  • Пример кода (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
    

    Другие советы

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

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

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

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

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

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

    В Matlab это было бы так же просто, как

    % Generate a random 3x3 matrix
        A = rand(3,3) 
    % Multiply by its tranpose
        PosSemDef = A'*A 
    

    Естественные распределения на положительных полуопределенных матрицах - это распределения Wishart .

    A '* A даст положительную полуопределенную матрицу тогда и только тогда, когда A является ранг-дефицитной. Таким образом, ответы, изложенные выше и скопированные из Википедии, как правило, не соответствуют действительности. Чтобы вычислить положительную полуопределенную матрицу, просто возьмите любую прямоугольную матрицу m на n (m & Lt; n) и умножьте ее на ее транспонирование. То есть если B - матрица m на n, с m < n, то B '* B является полуопределенной матрицей. Надеюсь, это поможет.

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

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

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top