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

Posted

技术标签:

【中文标题】使用 boost c++ 为一组数据生成指数分布【英文标题】:Generate a exponential distribution for a set of data using boost c++ 【发布时间】:2016-07-05 11:00:20 【问题描述】:

如何。

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

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

我需要用 C++ 实现它

【问题讨论】:

AFAIK boost 没有方法将数据拟合到分布,只能生成数据。我记得数字食谱有,为了你的理智,我希望你能找到更好的选择。你可以例如记录所有元素,然后应用线性回归。 【参考方案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,但您可以使用提升)。

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;

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

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

【讨论】:

我有一个包含浮点变量的向量,名为 vararr 并使用 Boost c++,我想对其进行拟合指数分布并获取拟合的相应速率参数。 Matlab 中的等价代码为: PD = fitdist(vararr,'exponential'); vararr = 排序(vararr); fxx = pdf(PD,vararr); 就我对 OP 的理解而言,他希望将数据拟合到指数分布。 @Gibet :我需要将数据拟合成指数分布,而不是根据 pdf 生成随机数。 @Gibet :我已经有一个向量集,我需要将最佳指数分布拟合到该向量集,从而获得学习率

以上是关于使用 boost c++ 为一组数据生成指数分布的主要内容,如果未能解决你的问题,请参考以下文章

使用 Boost 生成基于 Beta 分布的随机数

在 C++ 中使用 regex/boost 查找 2 个数字之间的数字

Boost C++如何输出没有指数字符的浮点值的所有数字?

在 Delphi 7 中使用 C++ Boost 图形库 (BGL)

在 C++ 中产生一组整数的排列。获取分段错误

matlab 如何产生power law分布的随机数