3

良いアルゴリズムの推奨事項を探しています。

ユーザーと実績があります。ユーザーはアチーブメントを作成し、それを他のユーザーに提供します。各アチーブメントには、ユーザーが指定したポイント値が関連付けられています。ユーザーの合計ポイントは、すべての実績の合計です。

基本的:

Achievement :
    owner = Alias
    points = int

User :
    achievements = list(Achievement)
    def points() :
        sum([achievements.points])

わかりました、このシステムは明らかに非常にゲーム可能です。多くのアカウントを作成し、お互いにたくさんの成果をあげることができます。ポイント値をユーザーが指定したものとは異なる値にスケーリングすることで、それを少し削減しようとしています。

  1. すべてのユーザーが正直であると仮定しますが、難しさを異なる方法で評価しているだけです。ポイント値を正規化するにはどうすればよいですか? AKA 1 人のユーザーは簡単な成果ごとに 5 ポイントを与え、別のユーザーは 10 ポイントを与えます。どうすればそれらを 1 つの値に正規化できますか。目標は、ポイントが難易度に比例する分布です。
  2. ポイント値の判断が苦手なユーザーがいる場合、アチーブメントを獲得したユーザーの数から難易度を割り出すにはどうすればよいですか?
  3. ユーザーはほとんどがバラバラなグループに分割され、1 人のユーザーが他のユーザーのセット全体に実績を与えることができると仮定します。それは前の 2 つのアルゴリズムに役立ちますか? たとえば、ユーザー A は奇数で終わるユーザーにのみ成果を与え、ユーザー B は偶数で終わるユーザーにのみ成果を与えます。
  4. 誰もが悪意を持っている場合、ユーザーがポイント値を過大に膨らませることができないようにするには、どれくらい近づくことができますか?

: ユーザーへの寄付の質は、彼が受け取った実績の数とはまったく関係ありません。多くのギバーは、自分自身は何も受け取っていない単なるボットですが、特定のアクションを実行したユーザーに自動的に報酬を与えます。

私の現在の計画はこのようなものです。私は、私から成果を得た 1 人あたり 10 ポイントの割り当てを持っています。合計 55 人に 10 個の実績を配布した場合、私の割り当ては 550 です。これは、それを取得した人数に基づいて各実績に割り当てられます。分布が[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]各アチーブメントを取得した人である場合、ポイント値は になります[50, 25, 16.6, 12.5, 10, 8.3, 7.1, 6.25, 5.5, 5]

私のアプローチと代替の推奨事項に関する問題は大歓迎です。また、私が見逃したと思われる他のケースを投稿してください。リストに追加します. ありがとう!

4

3 に答える 3

0

私は自分のサイトでこの種の問題に苦しんでいます。ベースラインとして使用できる既存のデータの大規模なコーパスがある場合、スコアの正規化は非常に効果的であるように思われます。まず、ユーザーが作成した成果の平均値と標準偏差を取得します。

SELECT AVG(Points) AS user_average, 
STDDEV_POP(Points) AS user_stddev
FROM Achievements WHERE Owner = X

これらの値を使用して、文脈自由「zスコア」を計算します。

$zscore = ($rating - $user_average) / $user_stddev;

すべての成果の平均と標準偏差を取得します。

SELECT AVG(Points) AS all_average, 
STDDEV_POP(Points) AS all_stddev 
FROM Achievements

これらの値を使用して、正規化された「tスコア」を作成します。

$tscore = $all_average + ($all_stddev * $zscore);

次に、成果の価値の内部表現としてTスコアを使用します。YMMV。:)

于 2009-08-13T00:50:52.660 に答える
0

あなたのシステムでは、stackoverflow、digg、slashdot などのように、基本的な目標は

  1. 正直なユーザーを特定する
  2. 彼らの行動を促進する

通常、正直なユーザーはその行動によって識別されます。つまり、サイトに長い間存在し、他のユーザーやあなたによって精査されたアカウントです。スタック オーバーフローはこれに評判スコアを使用し、スラッシュドットはカルマ ポイントを使用します。

これらの正直なユーザーを特定すると、評価スコアに比例して投票をカウントできます。ユーザーが正直であるほど、彼の業績を信頼します。

したがって、新しいアカウントに初期スコア 10 を与えることができます。その後、そのユーザーは必要な数の実績を与えることができますが、実際の合計値は 10 になります (提案する比例割り当てのように)。つまり、新しいユーザーが 100 個の実績 (すべて同じポイント数の価値がある) を与えた場合、そのユーザーのスコアは 10 であるため、それぞれの実績は 0.1 ポイントの価値があります。その後、そのユーザーが他のユーザーから実績を取得すると、スコアが増加します。

基本的に、pagerankを使用することをお勧めしますが、Web ページをランク付けする代わりに、ユーザーをランク付けし、ハイパーリンクではなく、リンクはそのユーザーが他のユーザーに与えた実績です。

これが、この問題を解決する 1 つの方法です。他にもたくさんあります。それはあなたの特定のニーズに依存します。オークションはいつも楽しいです。コミュニティがその実績に課す価格 (スコア) を確立するために、実績が実際に達成される前に、全員がその実績に入札することができます。人々が持っている「お金」の量を制限する必要があります。

于 2009-07-13T20:28:47.063 に答える
0

$rating は入力で、$tscore は正規化された出力です。

理想的には、誰もが同じ尺度で自分の業績にポイントを割り当てます。ばかげた、または取るに足らない成果には 1 ポイント、ささやかな成果には 10 ポイント、真に壮大な成果には 50 ポイントなど。しかし、スコアの割り当てに関しては、人々の行動は大きく異なります。いくつかは非常に寛大で、すべての成果を最大の価値にします。他の人は、達成の難しさに関連するので、スケールに注意深く従い、厳密かつ正確になります. 他の人は、人々がポイントについて心配するのはばかげていると考え、作成したすべての成果に最小値を割り当てるかもしれません.

正規化は、これらの個々の異常を処理し、全員の評価を同じスケールに合わせようとします。オリンピックの審査員の採点と同じです。ユーザーがアチーブメントに割り当てた値を「盲目的に信頼」することはありませんが、それがシステムの一部である場合は考慮したいものです。それ以外の場合は、アチーブメントのポイント値をハードコーディングして、アチーブメントの作成頻度を制限するだけで、最悪の悪用を抑えることができます。しかし、スコアは役に立ちます。なぜなら、正規化した後、アチーブメントの値がどのくらいの価値があるかを理解できるからです。それは典型的な平均的なユーザーによって作成されました。これにより、人々がシステムを「ゲーム」するのが難しくなります。これは、成果の平均値と分布から遠ざかるほど、自分の値がベースラインに向かって正規化されるためです。

私は専門的に訓練されたプログラマーではなく、統計学のクラスやそれ以上の数学を受講したことはありません。私自身の理解の限界により、おそらく私はこれを説明するのに最適な人物ではありません. しかし、私は自分のサイト (ユーザー間の評価) で同様の問題に苦しんでおり、多くのアプローチを試した結果、これが最も有望なようです。実装のインスピレーションのほとんどはhttp://www.ericdigests.org/2003-4/score-normilization.htmlから得たので、それも読みたいと思うかもしれません。

于 2009-08-15T22:42:54.573 に答える