[英]Simple histogram algorithm in Javascript
我创建了一个直方图算法。 我遵循此处提供的解决方案。
我想简单地计算每个值出现的次数。
但是我不能完全正确地使用算法。 我的代码是:
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 在这里。
这是我会做的:
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)); }
这也适用于非整数值。
我认为你的bin_width
是错误的。 试试这个计算:
var bin_width = (val_max - val_min) / (num_bins - 1);
这使得bin_width == 1
可以让您的其余代码工作。
由于 bin 的数量等于val_min
和val_max
之间的整数数量,因此bin_width
为 1,而不是当前计算的 0.8。 你基本上在这里计算整数。 使用此循环生成直方图:
for (var x = 0; x < values.length; x++) {
to_plot[values[x] - val_min] ++;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.