Я охотился за удобным способом отбора проб из многомерного нормального распределения. Кто-нибудь знает о легко доступном фрагменте кода для этого? Для матриц/векторов я предпочел бы использовать Boost или Eigen или другую феноменальную библиотеку, с которой я не знаком, но я мог бы использовать GSL в крайнем случае. Мне также понравилось бы, если бы метод принимал неотрицательно-определенные ковариационные матрицы, а не требовал положительно-определенных (например, как и при разложении Холецкого). Это существует в MATLAB, NumPy и других, но мне было трудно найти готовое решение C/С++.
Если я должен сам реализовать его, я буду ворчать, но это прекрасно. Если я это сделаю, Википедия заставляет это звучать, как я должен
- сгенерировать n 0-среднее, единичную дисперсию, независимые нормальные выборки (boost сделает это)
- найти собственное разложение ковариационной матрицы
- масштабируйте каждый из образцов n квадратным корнем соответствующего собственного значения
- вращать вектор выборок путем предварительного умножения масштабированного вектора на матрицу ортонормированных собственных векторов, найденную разложением
Я бы хотел, чтобы это работало быстро. У кого-то есть интуиция, когда было бы полезно проверить, положительна ли ковариационная матрица, и если да, то вместо этого используйте Холески?