gpt4 book ai didi

c++ - 如何在直方图上进行对数合并?

转载 作者:太空宇宙 更新时间:2023-11-04 13:27:49 25 4
gpt4 key购买 nike

我正在寻找一种以对数方式对某些数据集进行分箱的技术。我们得到的数据的值范围从 _min_max( float >= 0),用户需要能够指定不同数量的 bins _num_bins (一些 int n)。

我已经实现了取自 this question 的解决方案和一些缩放方面的帮助 here但是当我的数据值低于 1.0 时,我的解决方案停止工作。

class Histogram {
double _min, _max;
int _num_bins;
......
};

double Histogram::logarithmicValueOfBin(double in) const {
if (in == 0.0)
return _min;

double b = std::log(_max / _min) / (_max - _min);
double a = _max / std::exp(b * _max);

double in_unscaled = in * (_max - _min) / _num_bins + _min;
return a * std::exp(b * in_unscaled) ;
}

当数据值都大于 1 时,我得到大小合适的 bin 并且可以正确绘制。当值小于 1 时,箱子的大小大致相同,我们得到的箱子太多了。

最佳答案

我通过重新实现 opensource version of Matlab's logspace function 找到了解决方案.

给定一个范围和多个 bin,您需要创建一个均匀分布的数字序列

module.exports = function linspace(a,b,n) {
var every = (b-a)/(n-1),
ranged = integers(a,b,every);

return ranged.length == n ? ranged : ranged.concat(b);
}

之后,您需要遍历每个值并使用您的基数(最有可能是 e、2 或 10)存储功率并获得您的 bin 范围。

module.exports.logspace = function logspace(a,b,n) {
return linspace(a,b,n).map(function(x) { return Math.pow(10,x); });
}

我用 C++ 重写了它,它能够支持 > 0 的范围。

关于c++ - 如何在直方图上进行对数合并?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32746337/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com