2009-07-13 37 views
3

我在尋找一個很好的算法建議。正常化多個來源的成就

我有用戶和成就。用戶創建成就,然後將其提供給其他用戶。與每個成就相關聯的是用戶指定的點值。用戶的總分是他們所有成就的總和。

基本上是:

Achievement : 
    owner = Alias 
    points = int 

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

好了,所以這個系統顯然是非常遊戲能。你可以創造許多賬戶,併爲彼此提供大量成就。我試圖通過將點值縮放爲與用戶指定的值不同的值來減少這一點。

  1. 假設所有的用戶都是誠實的,但他們只是測量困難不同。我應該如何規範點值? AKA一個用戶給每個簡單成就5分,另一個給出10分,我怎樣才能將他們歸一化爲一個值。目標將是一個分佈,其中點與難度成正比。
  2. 如果一個用戶不擅長判斷分數值,那麼如何根據獲得成就的用戶數量來計算出難度?
  3. 假設用戶可能主要被劃分成不相交的組,其中一個用戶將成就提供給一組其他用戶。這有助於前兩種算法嗎?例如,用戶A僅向以奇數結尾的用戶提供成就,而用戶B僅向用戶提供以偶數結尾的成就。
  4. 如果每個人都是惡意的,我有多接近沒有用戶能夠誇大他們的積分值?

注意:給予用戶的質量與他收到多少成就沒有任何關係。許多贈送者只是自己沒有收到任何東西的機器人,但會自動獎勵用戶執行某些操作。

我目前的計劃是這樣的。我有一個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]

我的方法和替代建議的任何問題都受到歡迎和讚賞。另外,發佈其他您可以想到我錯過的案例,並將其添加到列表中。謝謝!

回答

0

我認爲在你的系統,如計算器,Digg的,slashdot的,等你的基本目標是

  1. Indentify誠實用戶
  2. 促進他們的行動

一般我們確定誠實的用戶通過他們的行爲:那些在網站上已經存在了很長一段時間並且已經被其他用戶和你所審查的賬戶。堆棧溢出使用聲望得分,slashdot使用業力點。

一旦你確定了這些誠實的用戶,那麼你可以讓他們的選票與聲譽得分成比例:用戶看起來越誠實,我們越相信他的成就。因此,您可能會給新帳戶初始分數爲10.該用戶然後可以給他想要的任何數量的成就,但他們的實際總價值將是10(如您建議的比例分配)。也就是說,如果一個新用戶提供了100個成就(全部值得相同的點數),那麼每個成就值得0.1分,因爲他的得分是10.然後,當該用戶從其他用戶獲得成就時,他的得分增加。

基本上,我建議你使用pagerank,但不排序排名的網頁,你排名的用戶,而不是超鏈接的鏈接是該用戶給他人的成就。

這是解決此問題的一種方法。還有很多其他的。這取決於你的具體需求。拍賣總是很有趣。您可以讓每個人在實際取得成就之前對成就進行出價,以確定社區放在該成就上的價格(分數)。您需要限制人們擁有的「金錢」數量。

+1

謝謝你的迴應。我很樂意做網頁排名的方法,但我的許多用戶只是「機器人」,實際上並沒有取得任何成就。人們建立這些機器人,但並不總是就「容易」的「10分」意味着什麼。我寧願避免對成就進行明確的競標,並讓隱含的特徵成爲價值,因爲我不知道我還沒有多少信任這個社區。鑑於此,我的算法是最好的方法嗎? – 2009-07-13 21:20:35

+0

我對你的描述感到困惑。也就是說,當你說「我獲得了10分/人的成績,而這個成就來自我。」是「我」是指你,網站的所有者,還是指在網站上有帳戶的人? – 2009-07-14 20:25:54

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分數作爲您成就值的內部表示。因人而異。 :)

0

正確,$ rating是輸入,$ tscore是標準化輸出。

理想情況下,每個人都會以相同的比例爲他們的成就分配積分。一點愚蠢或微不足道的成就,十分謙虛的成就,五十分爲真正的史詩成就,或任何其他。但是在分配分數時,人們的行爲卻非常不同。有些人會非常慷慨,並使每項成就都值得最高。其他人將是嚴格和準確的,謹慎地堅持與成就難度相關的規模。其他人可能認爲人們擔心分數是愚蠢的,併爲他們創造的所有成就分配最小值。

正常化嘗試處理這些個體異常並使每個人的評分符合相同的比例。這就像他們對奧運會評委的成績所做的一樣。你不會「盲目地相信」用戶分配給成就的價值,但是如果它是系統的一部分,它就是你想要考慮的東西。否則,你可能大概是硬編碼的成就的點值,限制他們可以創建的頻率,聽起來像這樣可以遏制最糟糕的濫用。但是這個分數很有用,因爲在歸一化之後,如果是由定型平均用戶創建的,那麼您可以計算出該成就的價值將會值得。這使得人們很難「遊戲」這個系統,因爲他們從平均值和成果分佈中得到的越多,他們自己的價值就越多地迴歸到基線。

我應該提到,我不是一名經過專業訓練的程序員,而且我從未參加統計課程或任何更高級的數學課程。由於我自己的理解力有限,也許我不是最好的人來解釋這一點。但是我一直在自己的網站(用戶對用戶評分)上遇到類似的問題,並且嘗試了許多方法後,這似乎是最有前途的。實施的大部分靈感來自http://www.ericdigests.org/2003-4/score-normilization.html,因此您可能也想閱讀它。