<p>I can point you to a non-parametric way to get the best ordering with respect to a weighted linear scoring system without knowing exactly what weights you want to use (just constraints on the weights). First though, note that average daily views might be misleading because movies are probably downloaded less in later years. So the first thing I would do is fit a polynomial model (degree 10 should be good enough) that predicts total number of views as a function of how many days the movie has been available. Then, once you have your fit, then for each date you get predicted total number of views, which is what you divide by to get "relative average number of views" which is a multiplier indicator which tells you how many times more likely (or less likely) the movie is to be watched compared to what you expect on average given the data. So 2 would mean the movie is watched twice as much, and 1/2 would mean the movie is watched half as much. If you want 2 and 1/2 to be "negatives" of each other which sort of makes sense from a scoring perspective, then take the log of the multiplier to get the score. </p>

<p>Now, there are several quantities you can compute to include in an overall score, like the (log) "relative average number of views" I mentioned above, and (likes/total views) and (dislikes / total views). US News and World Report ranks universities each year, and they just use a weighted sum of 7 different category scores to get an overall score for each university that they rank by. So using a weighted linear combination of category scores is definitely not a bad way to go. (Noting that you may want to do something like a log transform on some categories before taking the linear combination of scores). The problem is you might not know exactly what weights to use to give the "most desirable" ranking. The first thing to note is that if you want the weights on the same scale, then you should normalize each category score so that it has standard deviation equal to 1 across all movies. Then, e.g., if you use equal weights, then each category is truly weighted equally. So then the question is what kinds of weights you want to use. Clearly the weights for relative number of views and proportion of likes should be positive, and the weight for proportion of dislikes should be negative, so multiply the dislike score by -1 and then you can assume all weights are positive. If you believe each category should contribute at least 20%, then you get that each weight is at least 0.2 times the sum of weights. If you believe that dislikes are more important that likes, then you can say (dislike weight) >= c*(like weight) for some c > 1, or (dislike_weight) >= c*(sum of weights) + (like weight) for some c > 0. Similarly you can define other linear constraints on the weights that reflect your beliefs about what the weights should be, without picking exact values for the weights.</p>

<p>Now here comes the fun part, which is the main thrust of my post. If you have linear inequality constraints on the weights, all of the form that a linear combination of the weights is greater than or equal to 0, but you don't know what weights to use, then you can simply compute all possible top-10 or top-20 rankings of movies that you can get for any choice of weights that satisfy your constraints, and then choose the top-k ordering which is supported by the largest VOLUME of weights, where the volume of weights is the solid angle of the polyhedral cone of weights which results in the particular top-k ordering. Then, once you've chosen the "most supported" top-k ranking, you can restrict the scoring parameters to be in the cone that gives you that ranking, and remove the top k movies, and compute all possibilities for the next top-10 or top-20 ranking of the remaining movies when the weights are restricted to respect the original top-k movies' ranking. Computing all obtainale top-k rankings of movies for restricted weights can be done much, much faster than enumerating all n(n-1)...(n-k+1) top-k possible rankings and trying them all out. If you have two or three categories then using polytope construction methods the obtainable top-k rankings can be computed in linear time in terms of the output size, i.e. the number of obtainable top-k rankings. The polyhedral computation approach also gives the inequalities that define the cone of scoring weights that give each top-k ranking, also in linear time if you have two or three categories. Then to get the volume of weights that give each ranking, you triangulate the cone and intersect with the unit sphere and compute the areas of the spherical triangles that you get. (Again linear complexity if the number of categories is 2 or 3). Furthermore, if you scale your categories to be in a range like [0,50] and round to the nearest integer, then you can prove that the number of obtainable top-k rankings is actually quite small if the number of categories is like 5 or less. (Even if you have a lot of movies and k is high). And when you fix the ordering for the current top group of movies and restrict the parameters to be in the cone that yields the fixed top ordering, this will further restrict the output size for the obtainable next best top-k movies. The output size does depend (polynomially) on k which is why I recommended setting k=10 or 20 and computing top-k movies and choosing the best (largest volume) ordering and fixing it, and then computing the next best top-k movies that respect the ordering of the original top-k etc. </p>

<p>Anyway if this approach sounds appealing to you (iteratively finding successive choices of top-k rankings that are supported by the largest volume of weights that satisfy your weight constraints), let me know and I can produce and post a write-up on the polyhedral computations needed as well as a link to software that will allow you to do it with minimal extra coding on your part. In the meantime here is a paper <a href="http://arxiv.org/abs/0805.1026">http://arxiv.org/abs/0805.1026</a> I wrote on a similar study of 7-category university ranking data where the weights were simply restricted to all be non-negative (generalizing to arbitrary linear constraints on weights is straightforward).</p>
Ranking algorithm using likes / dislikes and average views per day
<p>I'm currently ranking videos on a website using a bayesian ranking algorithm, each video has:</p>

<ul>
<li><code>likes</code></li>
<li><code>dislikes</code></li>
<li><code>views</code></li>
<li><code>upload_date</code></li>
</ul>

<p>Anyone can <code>like</code> or <code>dislike</code> a video, a video is always <code>views + 1</code> when viewed and all videos have a unique <code>upload_date</code>.</p>

<p><br>
<strong>Data Structure</strong></p>

<p>The data is in the following format:</p>

<pre><code>|  id  |  title    |  likes  |  dislikes  |  views  |  upload_date  |
|------|-----------|---------|------------|---------|---------------|
|  1   | Funny Cat |    9    |     2      |   18    |  2014-04-01   |
|  2   | Silly Dog |    9    |     2      |   500   |  2014-04-06   |
|  3   | Epic Fail |    100  |     0      |   200   |  2014-04-07   |
|  4   | Duck Song |    0    |     10000  |   10000 |  2014-04-08   |
|  5   | Trololool |    25   |     30     |   5000  |  2014-04-09   |
</code></pre>

<p><br>
<strong>Current Weighted Ranking</strong></p>

<p>The following weighted ratio algorithm is used to rank and sort the videos so that the best rated are shown first.</p>

<p><em>This algorithm takes into account the <a href="http://en.wikipedia.org/wiki/Bayesian_average">bayesian average</a> to give a better overall ranking.</em></p>

<pre><code>Weighted Rating (WR) = ((AV * AR) + (V * R))) / (AV + V)

AV = Average number of total votes
AR = Average rating
V  = This items number of combined (likes + dislikes)
R  = This items current rating (likes - dislikes)
</code></pre>

<p><br>
<strong>Example current MySQL Query</strong></p>

<pre><code>SELECT id, title, (((avg_vote * avg_rating) + ((likes + dislikes) * (likes / dislikes)) ) / (avg_vote + (likes + dislikes))) AS score 
FROM video
INNER JOIN (SELECT ((SUM(likes) + SUM(dislikes)) / COUNT(id)) AS avg_vote FROM video) AS t1
INNER JOIN (SELECT ((SUM(likes) - SUM(dislikes)) / COUNT(id)) AS avg_rating FROM video) AS t2
ORDER BY score DESC
LIMIT 10
</code></pre>

<p><em>Note: <code>views</code> and <code>upload_date</code> are not factored in.</em></p>

<p><br>
<strong>The Issue</strong></p>

<p>The ranking currently works well but it seems we are not making full use of all the data at our disposal.</p>

<p>Having <code>likes</code>, <code>dislikes</code>, <code>views</code> and an <code>upload_date</code> but only using two seems a waste because the <code>views</code> and <code>upload_date</code> are not factored in to account how much weight each <code>like</code> / <code>dislike</code> should have.</p>

<p>For example in the <strong>Data Structure</strong> table above, items <code>1</code> and <code>2</code> both have the same amount of <code>likes</code> / <code>dislikes</code> however item <code>2</code> was uploaded more recently so it's average daily views are higher.</p>

<p>Since item <code>2</code> has more likes and dislikes in a shorter time than those <code>likes</code> / <code>dislikes</code> should surely be weighted stronger?</p>

<p><br>
<strong>New Algorithm Result</strong></p>

<p>Ideally the new algorithm with <code>views</code> and <code>upload_date</code> factored in would sort the data into the following result:</p>

<p><em>Note: <code>avg_views</code> would equal <code>(views / days_since_upload)</code></em></p>

<pre><code>|  id  |  title    |  likes  |  dislikes  |  views  |  upload_date  |  avg_views  |
|------|-----------|---------|------------|---------|---------------|-------------|
|  3   | Epic Fail |    100  |     0      |   200   |  2014-04-07   |     67      |
|  2   | Silly Dog |    9    |     2      |   500   |  2014-04-06   |     125     |
|  1   | Funny Cat |    9    |     2      |   18    |  2014-04-01   |     2       |
|  5   | Trololool |    25   |     30     |   5000  |  2014-04-09   |     5000    |
|  4   | Duck Song |    0    |     10000  |   10000 |  2014-04-08   |     5000    |
</code></pre>

<p><em>The above is a simple representation, with more data it gets a lot more complex.</em></p>

<p><br>
<strong>The question</strong></p>

<p>So to summarise, my question is how can I factor <code>views</code> and <code>upload_date</code> into my current ranking algorithm in a style to improve the way that videos are ranked?</p>

<p>I think the above example by calculating the <code>avg_views</code> is a good way to go but where should I then add that into the ranking algorithm that I have?</p>

<p>It's possible that <strong>better ranking algorithms may exist</strong>, if this is the case then please provide an example of a different algorithm that I could use and state the benefits of using it.</p>