Как сделать логарифмическое биннинг на гистограмме?

Я ищу метод логарифмического бин некоторых наборов данных. У нас есть данные со значениями от _min в _Максимум (плавает> = 0), и пользователь должен иметь возможность указывать различное количество ячеек _num_bins (некоторые int n).

Я реализовал решение, взятое из этот вопрос и некоторая помощь по масштабированию Вот но мое решение перестает работать, когда мои значения данных лежат ниже 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, я получаю лотки хорошего размера и могу правильно построить график. Когда значения меньше 1, ячейки выходят более или менее одинакового размера, и мы получаем слишком много их.

1

Решение

Я нашел решение, реализовав версия с открытым исходным кодом функции пространства журналов Matlab.

Учитывая диапазон и количество ячеек, вам нужно создать равномерно распределенную числовую последовательность

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) накапливать мощность, и вы получаете диапазоны бинов.

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

Я переписал это в C ++, и он может поддерживать диапазоны> 0.

0

Другие решения

Других решений пока нет …