Как оптимизировать вычисления гауссовского PDF? - PullRequest
2 голосов
/ 13 ноября 2011

Я работаю над проектом C ++, который часто требует вычисления гауссовского pdf с заданной точкой данных x и существующим гауссовым распределением G.

Это дорого, так как используется экспоненциальная функция exp.Даже если я беру логи, функция логов тоже дорогая.Любые предложения о том, как я могу это сделать?

Ответы [ 2 ]

3 голосов
/ 13 ноября 2011

Векторизация, то есть параллельное вычисление показателей или журналов с использованием SIMD, вы также можете использовать оптимизированные аппроксимирующие SSE на основе exp и log, если вам не нужна предельная точность, простая библиотека для этогонайдено здесь .

Однако, когда дело доходит до оптимизации, сначала профилируйте, чтобы решить проблему, а не то, что вы считаете проблемой.

0 голосов
/ 13 марта 2013

Журнал pdf не дорогой, если вы используете следующий ярлык:

Начиная с

 log_pdf = log (1.0/ (sigma * 2.0 * pi))  - 0.5 * square(x-mean) / ( sigma*sigma );

вы можете увидеть, что часть термина, содержащая журнал, может быть предварительно-считывается для любого конкретного PDF, как и часть остальных.Таким образом, для любых заданных значений для стандартного отклонения и среднего значения:

log_k = log (1.0/ (sigma * 2.0 * pi));
half_over_sigma_sq= 0.5 / (sigma*sigma)

Затем при оценке для множества различных значений x вы можете вычислить просто

log_pdf = log_k - half_over_sigma_sq * square(x-mean);

Этот прием используетсявсе время в статистическом моделировании.

...