3

これをPHPで説明しますが、問題は多かれ少なかれ言語に依存しません。

私は、5 つ星の評価システムを使用して投票された製品の平均評価を持っています。この製品について言いましょう$averageRating = 3.43。この平均を作成できる投票の模擬分布を作成したいと思います。すでに投票分布がある場合、平均を決定する方法は次のとおりです。

            $distribution = array(
                1 => $oneStarVotes,
                2 => $twoStarVotes,
                3 => $threeStarVotes,
                4 => $fourStarVotes,
                5 => $fiveStarVotes
            );

            foreach ($distribution as $key => $value) {
                $weightedTotal += $key * $value;
            }

            $totalVotes = array_sum($distribution);

            $averageRating = $weightedTotal / $totalVotes;

$oneStarVotes, $twoStarVotes...etc.与えられた変数の値を作成できるように、これをリバース エンジニアリングする方法を考えられる人はい$averageRatingますか?

4

1 に答える 1

2

任意の分布を探しているので、これは代数の単純な問題であり、合理的な整数を見つけることを考えています。

私は次のように問題に取り組みます(疑似コードで):

Case 1: avg = 1.0
    distribution <- { x1, 0, 0, 0, 0 } for any positive integer x1.

Case 2: avg = 5.0
    distribution <- { 0, 0, 0, 0, x5 } for any positive integer x5.

Case 3: avg is within (1.0, 5.0)
    distribution = { x1, 0, 0, 0, x5 } for some positive integers x1 and x5.

つまり、問題を単純化して、1 つ星と 5 つ星の投票のみの投票数を選択します。

x1ケース 3 のandを解決するには、1 つ星と 5 つ星のみの投票の中で算術平均の式を満たすandx5を選択する必要があります。x1x5

(1 * x1 + 5 * x5) / (x1 + x5) = avg

x1代わりにとを解くのに役立ちますT。ここTで、 は総投票数 ( x1 + x5 = T) です。

代数を介して、上記は次のように書くことができます

x1 = T * (5 - avg) / 4

の値を任意に選択してx1を解くことはできますが、これはが整数Tであることを保証しません。T

ただし、 の十分に大きな値を選択することで、小さい場合よりも少ない誤差で丸めるx1ことができます。 Tx1

たとえば、avg = 3.43(あなたの質問にあるように)、そして任意に を選択するx1 = 100と、次のようになります。

avg      = 3.43
x1       = 100
T        = 254.78
TRounded = 255
x5       = 155

これらの値を算術平均に戻すと、得られる

(1 * 100 + 5 * 155)/255 = 3.431 

これは、この場合は元のavg小数点以下 2 桁までです。ケース 3 の最終式は、

Case 3 (cont.):
    x1 <- (a large enough integer)
    T  <- round (x1 * 4 / (5 - avg))
    x5 <- T - x1
    distribution <- { x1, 0, 0, 0, x5 }
于 2013-01-03T08:27:03.200 に答える