-1

如何使用 boost c++ 为一组数据生成指数分布。

我有一个包含名为vararr并使用 Boost c++ 的浮点变量的向量,我想对其进行拟合指数分布并获取拟合的相应速率参数(lambda)。Matlab中的等价代码是:

PD = fitdist(vararr,'exponential'); 
vararr = sort(vararr); 
fxx = pdf(PD,vararr);

我需要在 C++ 中实现它

4

1 回答 1

1

指数分布是为了在一定的分布之后生成一个随机数。要使用指数分布,您可以执行以下操作:

#include <iostream>
#include <boost/random.hpp>

int main() {
  boost::mt19937 seed(5u); 
  boost::variate_generator<boost::mt19937&, boost::exponential_distribution<>> random_n(seed, boost::exponential_distribution<>()) ;
  cout << random_n() << endl; return 0;
}

现在,我怀疑你想做点什么,但对我来说不是很清楚。你想排序还是什么?在你的向量中选择一个随机数?

编辑:好的。简而言之,即使您可以访问 C++11,您也不会走得太远。大多数随机发生器现在都在标准中。但不是PDF。如果您对原因感到好奇:这里是:http ://www.open-std.org/jtc1/sc22/wg21/docs/papers/2002/n1398.html 。所以你肯定需要 boost.math 工具包,这是你计算 PDF 的唯一方法。以下是一些示例代码:

#include <boost/math/distributions/exponential.hpp>

int main()  {
    const auto lbda = 1.0;
    const auto d = exponential_distribution<> { lbda };
    cout << pdf(d, 0) << endl; // e(0) = 1
    cout << pdf(d, 1) << endl; // e(-1) = 0.3678
    return 0;
}

简而言之:对于使用 boost PDF,您本身不需要向量,因为 PDF 函数知道如何计算其分布。

编辑 2:因此,如果您需要使用某种分布填充向量,您可以简单地使用std::generate并将分布应用于它,这是一个带有std::exponential_distribution(c++11,但您可以使用 boost) 的示例。

std::vector<float> v(20);

random_device rd;
mt19937_64 gen(rd());
exponential_distribution<float> dis(1);
auto rand = bind(dis, gen);
generate(begin(v), end(v), rand);
for (auto& e : v) cout << e << endl;

我在这里展示的代码是vector用指数分布填充 20 个元素。您可以切换到std::array,将浮点数更改为您需要的任何值,增加向量或数组的大小。

您还可以查看这个旧的 C++ 库(现在是 pytonic 库),它可以满足您的需求:http ://myfitter.hepforge.org/ 。这可能是你最好的选择。它使用非参数方法。C++ 版本很旧,我不太确定功能是否齐全,但也许这对你有用。

于 2016-07-05T11:58:10.687 回答