使用 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++ 为一组数据生成指数分布的主要内容,如果未能解决你的问题,请参考以下文章
在 C++ 中使用 regex/boost 查找 2 个数字之间的数字