2012-12-14 58 views
0

我有一個系統,其中包含一個用戶的表,以及某種形式的業力/體重/信譽。有時候,這是用戶發佈的帖子數量,有時候是用戶在網站上的所有活動中收到的上/下數量。如何根據用戶的聲譽來計算輸入的重要性/權重?

USER { 
    id int 
    name string 
    karma int 
} 

如何使用這些數字來計算用戶的「權重」或「權限」?例如,一位長期成員的投票往往比全新用戶的票數多得多。

我在考慮把所有成員的總積分/業力/聲望加起來,然後試圖想出一個1-100的比例。

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

然後像

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

但是,也需要對點的曲線這種方式,因爲我不想有人用5000篇帖子/因果報應來了重達20個新用戶投票。

+1

嗯......這是由你來定義它。 5K用戶應該多少新用戶?一種方法是使用'log()',基礎由你決定。 – Wrikken

+0

僅供參考:因此,'weight = log(karma)/ log(n);',其中'n'是您想要擺弄的數字,可能是'1 Wrikken

回答

1

在數學上,您最好的選擇是通過所討論的用戶的百分比排名的日誌來加權。但是,這在SQL中很痛苦。

簡單

將欺騙和假設平均是一樣的中位數(一個非常壞的假設統計,但是編程更簡單):

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

這樣,你的前10因果報應%的人會對普通用戶有一個半的影響,幾乎是noob的兩倍。 更改日誌庫會顯着擴展這一點,很顯然,在自然日誌(log()在mysql中)會給上層10%3倍於新手的影響,並且影響是平均值的兩倍。 Log2()更加極端。 (注:減法是必需的,因爲日誌將是負數。)

如果您想要更嚴重的影響,可以嘗試平方日誌。 (注意:平方會使對數平方爲正數,所以此處適用加法。)

如果您想要超精確度規則,可以進入標準偏差,但sql會變得繁瑣且緩慢。這一切都取決於你想要走多遠的兔子洞......

+0

我需要在合理的時間內完成的查詢,因爲在某些情況下我可能無法緩存結果。所以速度比驅動更好,但它需要更多的測試和研究才能找到最佳位置。 – Xeoncross

+1

我希望我提供的最快,同時防止絕對值粉碎整體結果。然而,我可以補充說,你可以在cron工作中設置另一個表來計算基於業力的「權重」,並且可能每週更新一次,然後將你的總體計算轉換爲一個簡單的查詢,並允許與你一樣複雜的公式只要每週更新一次影響是可以接受的,並且您有空間備用桌子 – Lighthart

1

可能有一些資源可以爲您提供參數,但您應該準確地決定要使用的模型,而不是使用某些預定義的模型。我建議你定義一些規則,哪些用戶組應該是等價的或哪些應該超過彼此(例如,10 0 karma users = 1 5k karma user)(等價性更容易處理),這將很快產生一些參數給一些選擇的方程。

使用日誌(如已經建議),一些(小數)功率(如平方根)或甚至只是線性可以工作。

我建議是這樣newKarma = a.karma^b + c,它不應該是很難解決abc。我建議你選擇b而不是試圖計算它。使用新用戶(使用karma = 0)應該使這很容易解決。猜測值接近你想要的數值可能比以數學方式確定它們要容易(因爲一些規則在一起將不適合任何簡單的方程式)。

請注意,c以上是對業力的抵消,這將給許多新用戶比高業主用戶更多的全部業力。您可能還想考慮a.(karma + c)^ba.(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

更快的選擇將是插入/更新計算派生的業力,或者通過有一個額外的列和使用觸發器或只是在你調用插入/更新之前計算和使用新值調用插入/更新。

+0

我正在尋找SQL來做到這一點。但是,除了一些預先創建的數據庫查詢之外,我還希望有一個很好的邏輯概述。我會在這裏進一步思考你的建議。 – Xeoncross

+1

增加了一些SQL。 – Dukeling

相關問題