Simple histogram algorithm in Javascript

你说的曾经没有我的故事 提交于 2020-05-28 05:53:26

问题


Im creating a histogram algorithm. Im following the solution offered here.

I want to simply count the number of times each value has occurred.

However I cant quite get the algorithm right. My code is:

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

If you look at the console logs, you'll see:

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

I want that last index to be "1". But the problem is for values close the the maximum value, bin_idx is out of range. How can I tweak this so that I would get the following results?

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

The jsfiddle is here.


回答1:


Here's what I would do:

const 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) {
    let min = Infinity;
    let max = -Infinity;

    for (const item of data) {
        if (item < min) min = item;
        else if (item > max) max = item;
    }

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

    const histogram = new Array(bins).fill(0);

    for (const item of data) {
        histogram[Math.floor((item - min) / size)]++;
    }

    return histogram;
}

function print(x) {
    console.log(JSON.stringify(x));
}

This works for non-integer values too.




回答2:


I think your bin_width is wrong. Try this calculation instead:

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

That makes the bin_width == 1 which lets the rest of your code work.




回答3:


Since the number of bins is equal to the number of integers between val_min and val_max, the bin_width is 1, not 0.8 as currently being calculated. You're basically counting integers here. Use this loop to generate the histogram:

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


来源:https://stackoverflow.com/questions/36266895/simple-histogram-algorithm-in-javascript

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!