Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 流数据的直方图逼近_C++_Algorithm_Data Structures_Machine Learning_Histogram - Fatal编程技术网

C++ 流数据的直方图逼近

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=存储箱的数量;及 将输入

这个问题是这个问题的略微延伸。我正在重新实现的直方图近似在第2.1节中找到,我想在再次开始这个过程之前,把我所有的鸭子排成一行。上一次,我使用了
boost::multi_index
,但性能并不是最好的,我希望避免
std::set
插入/查找桶数的对数复杂性。由于我使用的直方图的数量(随机森林中随机树的每个叶节点每个类每个特征一个),计算复杂性必须尽可能接近常量

一种用于实现直方图的标准技术涉及将输入实值映射到箱子编号。为此,一种方法是:

  • 初始化大小为N的标准C数组,其中N=存储箱的数量;及
  • 将输入值(实数)乘以某个因子,然后将结果放在C数组中得到其索引
  • 这适用于具有均匀箱大小的直方图,并且非常有效。然而,上述链接文章的第2.1节提供了一种直方图算法,但没有统一的仓位大小

    另一个问题是,简单地将输入的实际值乘以一个因子,并将结果产物用作索引,结果是负数。为了解决这个问题,我考虑在数组中的某个位置标识一个“0”bin。该料仓的中心位置为0.0;上面/下面的垃圾箱可以使用刚才解释的相同乘法和下限法进行计算,只需稍加修改,根据需要将下限产品添加到两个或从两个中减去

    这就引出了合并的问题:本文中的算法合并了从中心到中心测量的两个最近的箱子。在实践中,这会创建一个“锯齿状”直方图近似值,因为有些箱子的计数会非常大,而其他箱子则不会。当然,这是由于箱子尺寸不均匀造成的,不会导致精度损失。但是,如果我们试图对大小不均匀的箱子进行规格化以使其尺寸均匀,则会出现精度损失。这是因为假设m/2个样本落在料仓中心的左侧和右侧,其中m=料仓计数。我们可以将每个箱子建模为高斯模型,但这仍然会导致精度损失(尽管损失很小)

    因此,这就是我现在被困的地方,引出了一个主要问题:实现直方图的最佳方法是什么?接受流式数据并将每个样本存储在大小相同的容器中?保留四个变量

    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;
    }