我正在开发一个C ++项目,通常需要在给定数据点x和现有高斯分布G的情况下计算高斯pdf。
由于涉及指数函数exp,因此这很昂贵。即使我记录日志,日志功能也很昂贵。关于我怎么做的任何建议?
答案 0 :(得分:3)
对其进行矢量化,即使用SIMD并行计算指数或日志,如果不需要极高的精度,还可以使用优化的近似SSE exp
和log
,简单的lib为此可以找到here。
然而,当涉及到优化时,首先进行配置,以这种方式解决问题,而不是您认为的问题。
答案 1 :(得分:0)
如果您使用以下快捷方式,则日志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);
此技巧一直用于统计建模。