0

ユーザーのテーブルと何らかの形のカルマ/重み/評判を含むシステムがいくつかあります。ユーザーが行った投稿の数である場合もあれば、サイトでのすべてのアクティビティでユーザーが受け取った賛成/反対票の数である場合もあります。

USER {
    id int
    name string
    karma int
}

これらの数値を使用して、そのユーザーの「体重」または「権限」を計算するにはどうすればよいですか? たとえば、1 人の長年のメンバーの投票は、多くの場合、まったく新しいユーザーからの 4 票よりもはるかに価値があります。

すべてのメンバーの合計ポイント/カルマ/評判を合計して、1-100 スケールを考え出そうと考えていました。

SUM(user.points) / COUNT(user.*) = average user points

次に、次のようなもの

CEIL(userA.points / average user points) = their weight on an issue

ただし、5,000 の投稿/カルマを持つ誰かが 20 の新しいユーザーの投票を重視したくないため、このようにポイントに曲線も必要です。

4

2 に答える 2

1

数学的には、問題のユーザーのパーセンタイル ランキングの対数で重み付けするのが最善の策です。ただし、これは SQL では苦痛です。

チートして、平均が中央値と同じであると仮定する方が簡単です (統計的には非常に悪い仮定ですが、プログラム的にははるかに単純です)。

 SELECT 1 - log10(SELECT COUNT (*) FROM user 
 WHERE (SUM(user.points) / COUNT(user.*)) < user.points)  
 / SELECT (COUNT (*) from user))

このように、上位 10% のカルマは、平均的なユーザーの 1.5 倍の影響を与えます。初心者の影響のほぼ 2 倍です。対数ベースを変更すると、明らかにこれがスケーリングされます。ここで、自然対数 (mysql の log()) は上位 10% に noob の 3 倍の影響を与え、平均の 2 倍の影響を与えます。Log2() はさらに極端です。(注: 対数が負になるため、減算が必要です。)

より深刻な効果が必要な場合は、ログを 2 乗してみてください。(注: 2 乗すると対数の 2 乗が正になるため、ここでは加算が適切です。)

超正確なルールが必要な場合は、標準偏差に入ることができますが、SQL は面倒で遅くなります。それはすべて、ウサギの穴のどこまで行きたいかによって異なります....

于 2012-12-18T21:17:20.113 に答える
1

このためのパラメーターを提供できるリソースがおそらくいくつかありますが、事前定義されたモデルを使用するのではなく、必要なものを正確に決定する必要があります。どのユーザーのセットが同等であるか、またはお互いを上回る必要があるかについて、いくつかのルールを定義することをお勧めします (例: 10 0 カルマ ユーザー = 1 5k カルマ ユーザー) (同等である方が作業がはるかに簡単です)。選ばれた方程式。

対数 (既に提案されているように) を使用すると、一部の (分数の) 累乗 (平方根など) または線形だけでも機能します。

のようなものを提案しますが、newKarma = a.karma^b + c解決するのはそれほど難しくありません。計算するのではなく、選択することをお勧めします。新しいユーザー (カルマ = 0) を使用すると、これを非常に簡単に解決できるはずです。必要な値に近づけるために値を推測することは、数学的に決定するよりも簡単な場合があります (いくつかのルールを組み合わせると単純な方程式に適合しないため)。abcb

上記はカルマのオフセットであることに注意してくださいc。これにより、多くの新規ユーザーは、カルマの高い​​ユーザーよりもカルマの合計が多くなります。a.(karma + c)^b、またはについても考えてみてa.(karma + c)^b + dください。定義したルールを分析すると、使用するルールがわかります。

更新:の代替案を追加c

編集: SQL にはいくつかのオプションがあります。一時テーブル (合計付き) が実際には最速かもしれません。ビューだけを使用することもできます。よくわかりませんが、同じテーブルでの結合も可能かもしれません。ビューを使用すると、次のようになります: (選択した a、b、c、および d の場合) (ビューにインデックスを追加することもできます)

Votes(issueID, userID) // table structure
User(userID, karma, ...) // table structure

CREATE VIEW Sums AS
SELECT issueID, SUM(1*POWER(karma + 2, 3) + 4) AS sumVal
FROM Votes JOIN User ON User.userID = Votes.userID
GROUP BY issueID

クエリ:

SELECT (1*POWER(karma + 2, 3) + 4)/sumVal AS influenceOnIssue
FROM Votes JOIN User ON User.userID = Votes.userID
  JOIN Sums on Sums.issueID = Votes.issueID
WHERE Votes.userID = @UserID AND Votes.issueID = @IssueID

単純化は、次のような計算列を持つことです。1*POWER(karma + 2, 3) + 4

より高速なオプションは、追加の列を用意してトリガーを使用するか、挿入/更新を呼び出す前に計算し、新しい値で挿入/更新を呼び出すことにより、挿入/更新時に派生したカルマを計算することです。

于 2012-12-18T09:32:12.993 に答える