shn*_*shn 8 c++ distribution normal-distribution probability gaussian
首先,这是pdf高斯函数的正确C++表示吗?
float pdf_gaussian = ( 1 / ( s * sqrt(2*M_PI) ) ) * exp( -0.5 * pow( (x-m)/s, 2.0 ) );
Run Code Online (Sandbox Code Playgroud)
第二,我们做这样的事情是否有意义?
if(pdf_gaussian < uniform_random())
do something
else
do other thing
Run Code Online (Sandbox Code Playgroud)
编辑:你想要实现的目标的一个例子:
假设我有一个名为Y1的数据.然后一个名为Xi的新数据到达.我想知道是否应该将Xi与Y1相关联,或者我是否应该将Xi保留为将被称为Y2的新数据数据.这基于新数据Xi与现有数据Y1之间的距离.如果Xi与Y1"相距",那么Xi将不与Y1相关联,否则如果它"不远",则它将与Y1相关联.现在我想使用基于Y和过去已经与Y关联的数据之间的距离的平均值和偏差的高斯概率来模拟这个"远"或"不远".
Ale*_* C. 10
从技术上讲,
float pdf_gaussian = ( 1 / ( s * sqrt(2*M_PI) ) ) * exp( -0.5 * pow( (x-m)/s, 2.0 ) );
Run Code Online (Sandbox Code Playgroud)
是不正确的,但可以改进.
首先,1 / sqrt(2 Pi)可以预先计算,并且使用pow整数不是一个好主意:它可能使用exp(2 * log x)或专门用于浮点指数的例程而不是简单的x * x.
示例更好的代码:
float normal_pdf(float x, float m, float s)
{
static const float inv_sqrt_2pi = 0.3989422804014327;
float a = (x - m) / s;
return inv_sqrt_2pi / s * std::exp(-0.5f * a * a);
}
Run Code Online (Sandbox Code Playgroud)
您可能希望将其设为模板而不是使用float:
template <typename T>
T normal_pdf(T x, T m, T s)
{
static const T inv_sqrt_2pi = 0.3989422804014327;
T a = (x - m) / s;
return inv_sqrt_2pi / s * std::exp(-T(0.5) * a * a);
}
Run Code Online (Sandbox Code Playgroud)
这允许你使用normal_pdf上double的参数也是(它不是更通用虽然).最后一个代码有一些警告,即你必须注意不要将它与整数一起使用(有解决方法,但这使得例程更加冗长).
是的。boost::random具有高斯分布。
例如,请参见这个问题:How to use boost Normal Distribution Classes?
作为替代方案,有一种标准方法可以将两个均匀分布的随机数转换为两个正态分布的数字。
请参阅,例如这个问题:Generate random number following a normal distribution in C/C++
回应您的最后一次编辑(请注意,问题与编辑时完全不同,因此我对原始问题的回答无关)。我认为你最好先自己弄清楚“使用高斯分布建模远或不远”到底是什么意思。然后用数学术语重新表述这种理解,然后才开始编程。就目前情况而言,我认为问题没有得到明确说明。