Weighted Karma Voting System

This question is more logical than programming at the moment .. as soon as I understand which algorithm I need to use, I will learn how to implement it.

I have a list of items in the database that I need to vote up or down from users to determine if they are correct or not. The goal is to specify% for each item to show how reliable the position information is.

There are several criteria to consider.

  • Votes are not absolute - each vote is dependent on their karma.
  • User karma should be calculated based on their votes - for example, if a user sends an item and other users vote to confirm that this is correct, this karma will increase. Karma can also be provided if the user votes for an item in the same direction as other users with high karma. If they vote in the opposite direction to other users with high karma, their vote will be considered incorrect, and although it will lower the rating of the item, it will also lower the level of karma, making them less influential in a future vote.
  • Users can cast negative votes as well as positive votes.
  • The calculated element scores should take into account the age of the item (over time, the rating will decrease as the element becomes less reliable).

Does anyone have any recommendations regarding the best algorithm (s) for this, or any tips on how to implement this in a programming language (e.g. PHP)?

+4
source share
2 answers

Read this first: http://www.evanmiller.org/how-not-to-sort-by-average-rating.html

This is an introduction to a mathematical concept known as Wilson's confidence interval estimate for Bernoulli parameters .

This article is a great example of how to use your user votes to calculate a score that is really useful and mathematically sound. Do it and you're already ahead of Amazon.com

Then, I think you probably need to adjust this formula a bit. In this formula, he uses p for the percentage of positive votes. You may need to update the formula for p to reflect the karma of the user who casts this vote.

Finally, to account for age, you multiply the result of the formula with an age multiplier. For example, if you want the result to become less significant by 1% for every day that it gets older, multiply it by 0.99 ^ age_in_days .

In a nutshell, this is the path I will follow. Hope this helps.

+6
source

I believe that for your calculations you only consider the karma of the item that you consider karma, whose voters were previously during the vote, and not their current karma (which may have changed since), since this will lead to a recursive function that probably will include all elements and all users.
Another assumption is that karma is indeed absolute, but recounted when a new vote is cast, because votes are less frequent than opinions.
I would keep all the votes of all users, their karma during the voting and the direction of voting for each item.
The final assumption: you add karma to the submitter not immediately after the vote, but after a certain period of time. If you add it right away, senders' careers will often grow up or down and cause a lot of jitter in your system. If you get a new vote, I would first calculate the new karma of the item, and then add karma to the user, depending on the absolute karma-change of the element:

The karma of an item is the sum of the karma of all voters: for example, you have three voices: one with 50 karma, one with 150 karma, one with 30 karma. This will result in total karma of 170. Thus, the item has karma of +170.
As soon as a new user votes, you recalculate the karma of the item with a new vote, taking into account: (previous example) new users vote for 10 karma. The item's new karma is +180. The difference in the old and new karma is the karma that the user receives: (previous example), the user's vote changed the karma of the item to +10, so the user receives +10 karma (for future votes). The disadvantage of this idea is that users with high karma get new karma very quickly, so you probably need to add some limiting factors here (like the logarithm) in order to scale it correctly. Since you also want to take into account the age of the item, you can multiply the received karma points by a factor depending on the age (for example, if the item is older than 5 days, the user does not receive any karma at all: 5 days - voting time multiplied by the changed cost of karma )

This, of course, is a very vague project of the system that you want to implement, and I do not know if it matches your idea. It can probably be modified to add other factors:
You can determine% relevance with: (absolute posting karma / absolute negative karma): values ​​less than 1 have more negative karma and then postile karma and vice versa. But for a reliable% value, you need some kind of value to compare in my oppinion too (whether it's constant or calculated otherwise).

+1
source

All Articles