如何使用 boost c++ 为一组数据生成指数分布。
我有一个包含名为vararr并使用 Boost c++ 的浮点变量的向量,我想对其进行拟合指数分布并获取拟合的相应速率参数(lambda)。Matlab中的等价代码是:
PD = fitdist(vararr,'exponential');
vararr = sort(vararr);
fxx = pdf(PD,vararr);
我需要在 C++ 中实现它
如何使用 boost c++ 为一组数据生成指数分布。
我有一个包含名为vararr并使用 Boost c++ 的浮点变量的向量,我想对其进行拟合指数分布并获取拟合的相应速率参数(lambda)。Matlab中的等价代码是:
PD = fitdist(vararr,'exponential');
vararr = sort(vararr);
fxx = pdf(PD,vararr);
我需要在 C++ 中实现它
指数分布是为了在一定的分布之后生成一个随机数。要使用指数分布,您可以执行以下操作:
#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++ 版本很旧,我不太确定功能是否齐全,但也许这对你有用。