1. It's smoother. Instead of having an arbitrary threshold above which posts cease to count, the output varies continuously in the input of interests.
2. It requires to actually be active throughout the registration method. With your method, someone who has been registered for 104 weeks and posted once per 2 weeks (that is, not very active at all), can jack up his activity from 52 to 728 by spamming 700 posts at once. Whereas with my method there is an upper bound on how much you can boost your score by concentrated posting.
With your method, someone who posts 5 posts per period for 40 weeks has a worse score than someone who posts 100 posts per period for 5 weeks. This is wrong. Slower, more consistent posting is better. A min() somewhere is needed, I think.
No. I purposefully offered two options because I figured you might not like the sqrt version. With the hyperbolic version (x / (1 + x/28)) there's no need for min because there is already an upper bound, asymptotically approached, on the activity gained per period; in your example 5*40 would get the higher score.
Assuming the periods are treated separately and not in aggregate, this is simply a softer, superior version of min.
In any case 28 in the formula is a tunable parameter.
As you mentioned, the current method doesn't work perfectly in some strange cases because it only looks at two-week periods in aggregate,
The idea was to have a system that is difficult to game. The method doesn't work in exactly the case that someone is trying to game it.
but this makes the implementation much easier and more efficient. I can do it with one SQL statement:
select smf_messages.ID_MEMBER as id, least(count(distinct posterTime div 1210000) * 14,
posts) as activity from smf_messages join smf_members on (smf_messages.ID_MEMBER=smf_members.ID_MEMBER)
group by id;
Your method is in principle not significantly less efficient than this, but it will at least make the SQL significantly more complicated, and I might have to create a slower and much larger PHP function. (I know that your method is directly possible in PostgreSQL, but I'm not sure about MySQL.)
Would it be possible to have an auxiliary table with the number of posts per user per 2-week period, update it in a batch job every 2 weeks, and have the activity calculation simply sum over values in this table (plus the activity over the current 2-week period which is not yet in the auxiliary table)? It seems to me to be even more efficient than the current method, and is more flexible.
That said, I think the score will be even more representative if instead of looking at disjoint 2-week periods, it will count all 2-week periods (i.e. days 1-14, days 2-15, etc.). But that may be harder to do.
It could have been worse, I could have asked you to integrate over a Gaussian kernel smoother.