Javascript中的简单直方图算法

时间:2016-03-28 16:55:35

标签: javascript algorithm histogram

我创建一个直方图算法。我遵循提供的解决方案here

我想简单计算每个值发生的次数。

然而,我无法使算法正确。我的代码是:

var values = [2, 4, 6, 3, 3];

var val_max = 6;
var val_min = 2;

var num_bins = parseInt(val_max - val_min + 1);
console.log('num_bins is ', num_bins);

var bin_width = (val_max-val_min)/num_bins;
console.log('bin_width is ', bin_width);

var to_plot = [];

for (var i = 0; i < num_bins; i++) {
  to_plot.push(0);
}

for (var x = 0; x < values.length; x++) {

    var bin_idx = parseInt((values[x] - val_min) / bin_width); 

    to_plot[bin_idx] = to_plot[bin_idx] + 1; 
}

console.log('to_plot is ', to_plot);

如果查看控制台日志,您会看到:

to_plot is  [1, 2, 1, 0, 0, NaN]

我希望最后一个索引为“1”。但问题是值接近最大值,bin_idx超出范围。我怎样才能调整这个以便得到以下结果?

to_plot is  [1, 2, 1, 0, 1] 

jsfiddle是here

3 个答案:

答案 0 :(得分:2)

这就是我要做的事情:

&#13;
&#13;
var data = [2, 4, 6, 3, 3];

print(histogram(data, 1)); // [1, 2, 1, 0, 1]
print(histogram(data, 2)); // [3, 1, 1]
print(histogram(data, 3)); // [4, 1]
print(histogram(data, 4)); // [4, 1]
print(histogram(data, 5)); // [5]

function histogram(data, size) {
    var length = data.length;

    var min = data[0];
    var max = data[1];

    for (var i = 0; i < length; i++) {
        var item = data[i];
        if (item < min) min = item;
        else if (item > max) max = item;
    }

    var bins = Math.ceil((max - min + 1) / size);

    var histogram = new Array(bins);

    for (var i = 0; i < bins; i++) histogram[i] = 0;

    for (var i = 0; i < length; i++)
        histogram[Math.floor((data[i] - min) / size)]++;

    return histogram;
}

function print(x) {
    alert(JSON.stringify(x));
}
&#13;
&#13;
&#13;

这也适用于非整数值。

答案 1 :(得分:1)

我认为你的bin_width错了。请尝试此计算:

var bin_width = (val_max - val_min) / (num_bins - 1);

这使bin_width == 1允许其余代码工作。

答案 2 :(得分:1)

由于区间数等于val_minval_max之间的整数,因此bin_width为1,而不是当前计算的0.8。你基本上计算整数。使用此循环生成直方图:

for (var x = 0; x < values.length; x++) {
    to_plot[values[x] - val_min] ++;
}