C++ 流数据的直方图逼近
这个问题是这个问题的略微延伸。我正在重新实现的直方图近似在第2.1节中找到,我想在再次开始这个过程之前,把我所有的鸭子排成一行。上一次,我使用了C++ 流数据的直方图逼近,c++,algorithm,data-structures,machine-learning,histogram,C++,Algorithm,Data Structures,Machine Learning,Histogram,这个问题是这个问题的略微延伸。我正在重新实现的直方图近似在第2.1节中找到,我想在再次开始这个过程之前,把我所有的鸭子排成一行。上一次,我使用了boost::multi_index,但性能并不是最好的,我希望避免std::set插入/查找桶数的对数复杂性。由于我使用的直方图的数量(随机森林中随机树的每个叶节点每个类每个特征一个),计算复杂性必须尽可能接近常量 一种用于实现直方图的标准技术涉及将输入实值映射到箱子编号。为此,一种方法是: 初始化大小为N的标准C数组,其中N=存储箱的数量;及 将输入
boost::multi_index
,但性能并不是最好的,我希望避免std::set
插入/查找桶数的对数复杂性。由于我使用的直方图的数量(随机森林中随机树的每个叶节点每个类每个特征一个),计算复杂性必须尽可能接近常量
一种用于实现直方图的标准技术涉及将输入实值映射到箱子编号。为此,一种方法是:
int N; // assume for simplicity that N is even
int count[N];
double lower_bound;
double bin_size;
当新样本x
到达时,计算double i=floor(x-下限)/bin\u size
。如果i>=0&&i
,则递增计数[i]
。如果i>=N
,则重复加倍bin\u大小
,直到x-下限
。在每次倍增时,调整计数(通过利用多倍增的稀疏性进行优化)
这种例外情况代价很高,但在您的数据范围内发生的次数与初始存储箱大小成对数关系
如果用浮点实现,请注意浮点数不是实数,并且像lower\u bound-=N*bin\u size
这样的语句可能会出现错误(在这种情况下,如果N*bin\u size
比lower\u bound
小得多)。我建议bin_size
始终是基数的幂(通常为2)
for (int j = 0; j < N / 2; j++) count[j] = count[2 * j] + count[2 * j + 1];
for (int j = N / 2; j < N; j++) count[j] = 0;
while (lower_bound > x) {
lower_bound -= N * bin_size;
bin_size += bin_size;
for (int j = N - 1; j > N / 2 - 1; j--) count[j] = count[2 * j - N] + count[2 * j - N + 1];
for (int j = 0; j < N / 2; j++) count[j] = 0;
}