1

次の加重平均式を JavaScript で記述する必要があります。

平均 = (p1*p2*x1 + p3*p4*x2 + ... +p(n-2)*p(n-1)*xn) / (p1*p2 + p3*p4 + ... + p (n-2)p(n-1) )

式は、x値の平均を示します。

また、 arrayJavaScriptのn要素が取り込まれています。

Array = (p1,p2,x1,p3,p4,x2....)

...平均を求めるpi重みと値はどこにありますか。xi

この配列を使用して数式を作成するにはどうすればよいですか?

4

3 に答える 3

3

私はおそらく次の戦略を使用します。

  • 2 つの新しい配列を作成します (おそらくweightsvalues)。
  • 元の配列を 3 ずつ繰り返します。を乗算しpn、結果をweightsにプッシュし、 を にプッシュxnvaluesます。
  • 新しい配列を繰り返し処理し、加重合計 (除算の左側) と総重量 (除算の右側) を作成します。
  • 一つ一つ分けます。終わり。

つまり、次のようなものです。

function weighted_average(input) {
    var weights = [];
    var values = [];
    var weighted_total = 0;
    var total_weight = 0;;

    if (input.length % 3 !== 0) {
        throw new Error("Input array length is not a multiple of 3.");
    }

    for (var i = 0; i < input.length; i += 3) {
        weights.push(input[i] * input[i + 1]);
        values.push(input[i + 2]);
    }

    for (var i = 0; i < weights.length; i += 1) {
        weighted_total += weights[i] * values[i];
        total_weight += weights[i];
    }

    return weighted_total / total_weight;
}

ただし、これがまさにあなたが求めていることを行うかどうかを確認する必要があります. 保証はありません。;)

JSFiddle デモ: jsfiddle.net/Z8seZ

もちろん、中間配列をスキップして少し高速にすることもできます。しかし、上記はより明示的で読みやすいため、より保守しやすくなっています (たとえば、実際のアルゴリズムを簡単に分割して、さまざまな形式の入力に対してさまざまな「ラッパー」関数を作成することができます)。(本当に)大きなデータセットを扱う場合にのみ最適化します。

于 2012-08-08T14:43:57.997 に答える
3

ES5を必要とする機能的なアプローチは次のとおりです。

var w = a.unzip(3).map(function(v, i, a) {
    var weight = v[0] * v[1];
    var sum = weight * v[2];
    return [sum, weight];
}).reduce(function(p, c, i, a) {
    return [p[0] + c[0], p[1] + c[1]];
}, [0, 0]);

var aw = w[0] / w[1];

疑似コードでは次のとおりです。

split the array into chunks of three
convert each three [p1, p2, x ] into a pair [ p1 * p2 * x , p1 * p2 ]
sum the pairs (along the array, not within each pair)
divide one by the other

配列をチャンクする(非標準の)unzip関数は次のとおりです。

Object.defineProperty(Array.prototype, 'unzip', {
    value: function(n) {
        n = n || 2;
        return this.reduce(function(p, c, i, a) {
            if (i % n === 0) {
                p.push(a.slice(i, i + n));
            }
            return p;
        }, []);
    }
});
于 2012-08-08T15:24:20.473 に答える