0

我有几个系统,其中包含用户表以及某种形式的业力/重量/声誉。有时是用户发布的帖子数量,有时是用户在网站上的所有活动中收到的赞成/反对票数。

USER {
    id int
    name string
    karma int
}

如何使用这些数字来计算该用户的“体重”或“权限”?例如,一位老会员的投票往往比新用户的 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

可能有一些资源可以为此提供参数,但您可能应该确切地决定您想要什么,而不是使用一些预定义的模型。我建议您定义一些规则,哪些用户集应该是等效的,或者哪些应该相互超过(例如 10 0 业力用户 = 1 5k 业力用户)(等效性更容易使用),这将很快为某些用户生成参数选择的方程。

使用对数(如前所述),一些(分数)幂(如平方根)甚至只是线性的都可以工作。

我建议类似newKarma = a.karma^b + c, 解决起来应该不难a,bc. 我建议你选择b而不是试图计算它。使用新用户(karma = 0)应该很容易解决这个问题。猜测值以接近您想要的值可能比数学确定它们更容易(因为一些规则一起不适合任何简单的方程)。

请注意,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 回答
1

从数学上讲,最好的办法是通过相关用户的百分位排名的对数来加权。但是,这在 SQL 中是很痛苦的。

更简单的方法是作弊并假设平均值与中位数相同(在统计上这是一个非常糟糕的假设,但在编程上更简单):

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

这样一来,你前 10% 的业力将产生普通用户的一倍半影响,几乎是菜鸟影响的两倍。显然,更改日志基数会扩展这一点,其中自然日志(mysql 中的 log())会给上层 10% 的人带来 3 倍于菜鸟的影响,以及两倍于平均水平的影响。Log2() 更加极端。(注意:需要减法,因为对数将为负数。)

如果您想要更严重的效果,您可以尝试对日志进行平方。(注意:平方使对数平方为正,因此此处适合加法。)

如果你想要一个超精确的规则,你可以进入标准偏差,但是 sql 变得繁琐和缓慢。这完全取决于你想去兔子洞多远......

于 2012-12-18T21:17:20.113 回答