Introducing the Steem Recommendation Page

in steem •  3 years ago 

Today we are happy to add personalized recommendations to steemit.com.

Steemit analyses your voting patterns to identify other users who vote like you. The more you and someone else vote alike the more weight their votes have in promoting (or demoting) content on your personalized feed.

When you vote for a post, it creates a strong link between you and the author of the post. When others vote the same way on the same post a weaker link is established between you and your fellow voters.

Down voting a post means you are much less likely to see future posts from the same author.

If you find the content in your recommendation page is not accurately reflecting your interests, then the best course of action is to find stuff you do like and up vote it.

The Algorithm

For those of you who are interested in the algorithm it is divided into several parts. The first part is identification of users who are similar to you. The second part involves identifying recent articles voted on by similar users.

Measuring User Similarity

Any time two users vote the same way on a post the vote is deemed to be similar. It is assumed that the author of a post votes for his own post. direct and indirect fields below measure the percent of similar voting.

direct = direct_similar_votes / total_direct_votes;
indirect = indirect_similar_votes / total_indirect_votes;

The algorithm needs to factor in a weighting factor based upon the number of votes sampled. This is done on a log scale so that all users approach the same weight as the number of measurements approaches infinity.

direct_order = log(total_direct_votes)
indirect_order = log(total_indirect_votes)

Any user for whom we have no similar votes is deemed to have a negative order.

if( direct_similar_votes + indirect_similar_votes == 0 ) {
    direct_order *= -1;  
    indirect_order *= -1;
}

Lastly we combine these terms giving a 10x weight to the author. The direct and indirect measures are squared to bias the results heavily toward users with high degree of similarity and to greatly discount users who vote in opposite ways on even a few posts.

user_similarity = 10 * direct_order * direct ^ 2 + indirect_order * indirect ^ 2

Generating Recommendations

Armed with a measure of user similarity, we are now ready to start ranking posts. The first step is to go over your list of similar peers and fetch all posts they have voted on in the last 24 hours. The posts are further filtered to remove any posts with global negative down votes, posts that are older than 24 hours, or posts that the user has already voted on.

For each post we calculate the sum of the ranks of all users voting for it. Lastly we multiply it by age.

  post_rank = sum(ranks) * (24 hr - now + creation_date) / 24 hr`.    

Something that is just posted has the full rank. Something that is 24 hours old is ranked at 0.

Finding your Recommendations

It is now easier than ever to find the best content from your favorite posters.

You can find recommendations customized for you in the account menu located in the upper right hand corner of steemit.com.

Enjoy!

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!
Sort Order:  

Very cool. This would be a great login landing page.

It will be interesting to see how similar it is to follow lists, once we get those. Over time, I can see how they might resemble one another.

Exactly!

Learning conditional preference networks could be used to suggest how people should vote over time depending on if Steemit has the computation capacity to implement it. It may be possible to suggest based on patterns and prediction algorithms which votes make the most economic sense. A/B testing can be used in order to tease out useful information from noisy data samples.

References
1.Learning conditional preference network from noisy samples using hypothesis testing

Good Idea!

bloody brilliant!

I like this. Why have it on the right and not on the left, along with the other views - Active, Trending, etc.?

This article was at the top of my recommended page :-)

Awesome! Thanks for sharing the code, I'm just learning Java and Android so I found that very interesting, I agree with bbq, it would make a great login page.

excellent explanation.