【问题标题】:Simple histogram algorithm in JavascriptJavascript中的简单直方图算法
【发布时间】:2016-07-15 23:32:52
【问题描述】:

我正在创建一个直方图算法。我正在关注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

【问题讨论】:

标签: javascript algorithm histogram


【解决方案1】:

我会这样做:

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

这也适用于非整数值。

【讨论】:

  • 很棒的解决方案。这很好用。看起来我必须使用对数刻度,因为有些值太大了。所以这非常有效,因为不适用于浮动。谢谢!
【解决方案2】:

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

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

【讨论】:

  • 是的,我不同意这个解决方案
【解决方案3】:

我认为您的bin_width 是错误的。试试这个计算:

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

这使得bin_width == 1 可以让您的其余代码工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-23
    • 1970-01-01
    • 2013-09-17
    • 1970-01-01
    • 1970-01-01
    • 2017-08-24
    • 2021-12-09
    • 1970-01-01
    相关资源
    最近更新 更多