首先,这是pdf高斯函数的正确C++表示吗?
float pdf_gaussian = ( 1 / ( s * sqrt(2*M_PI) ) ) * exp( -0.5 * pow( (x-m)/s, 2.0 ) );第二,我们这样做有意义吗?
if(pdf_gaussian < uniform_random())
do something
else
do other thing编辑:--您到底想达到什么目的的一个例子:
假设我有一个名为Y1的数据。随后,一个名为习的新数据出现了。我想知道我是否应该将Xi与Y1联系起来,还是应该将Xi作为一种新的数据数据,称为Y2。这是基于新数据Xi与现有数据Y1之间的距离。如果习离Y1“很远”,那么习将不会与Y1相关联,否则如果它“不远”,它将与Y1相关联。现在,我想用高斯概率来建模这个“远”或者“不远”,这个概率是基于Y和过去已经与Y相关的数据之间的距离的平均值和标准差。
发布于 2012-06-01 08:40:29
是。boost::random具有高斯分布。
例如,参见以下问题:如何使用boost正态分布类?
作为替代,有一种标准的方法可以将两个均匀分布的随机数转换成两个正态分布的数字。
参见,例如这个问题:C/C++中按正态分布产生随机数
作为对您上一次编辑的回应(请注意,问题与编辑完全不同,因此,我对原始编辑的回答是不相关的)。我认为你最好先给自己弄清楚,你所说的“用高斯分布建模远或远”到底是什么意思。然后用数学术语重新表述这种理解,然后才开始编程。就目前情况而言,我认为这个问题没有得到充分说明。
发布于 2012-06-01 10:07:34
技术上来说,
float pdf_gaussian = ( 1 / ( s * sqrt(2*M_PI) ) ) * exp( -0.5 * pow( (x-m)/s, 2.0 ) );不是不正确的,而是可以改进的。
首先,可以预先计算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);
}您可能希望将此作为模板,而不是使用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);
}这也允许您对normal_pdf参数使用double参数(不过,它并不是那么通用)。在最后一段代码中有一些注意事项,即您必须注意不要将它与整数一起使用(有一些解决办法,但这会使例程更加冗长)。
发布于 2012-06-01 08:47:33
使用Box-Muller变换。这将创建具有正态分布/高斯分布的值。
分布
转换
使用数学库编写代码并不是很复杂。
例如:
生成两个均匀的数字,使用它们得到两个正态分布的数字。然后返回一个,然后保存另一个,这样您就可以得到一个随机数的“下一个”请求。
https://stackoverflow.com/questions/10847007
复制相似问题