按时间加权排名

时间:2015-06-15 23:14:51

标签: python algorithm sorting math

我正在寻找一种基本的算法,可以更加重视最近的评论。

因此,算法的输出值是可变的。例如,具有完全相同分数的两个评论将根据创建的时间戳具有不同的排名。

Review_1
Score 10
creation 10/5/2014

Review_2 
Score 10
creation 10/5/2015

像这样的思考:

1 if review ts < 1 year
0.5 if review > year

所以,我可以使用像(review_1.score * 1) + (review_1.score * 0.5)这样的东西。

但是,如果两个评论都陈旧没有意义(review_1.score * 0.5) + (review_1.score * 0.5),对吧?由于没有新的评论,整体将是原始分数的一半。

2 个答案:

答案 0 :(得分:0)

要进行加权平均,而不是将加权总数除以得分数,将加权总数除以总权重。

解释

如果您的N得分的正常平均值范围为0到maxScore,则首先添加所有得分:

score1 + score2 + ... + scoreN

根据个人得分,此值的范围可以从0到maxScore * N。因此,要将其转换为0到maxScore的范围,我们应该除以N

(score1 + score2 + ... + scoreN) / N

如果您进行加权平均,则总分数的公式不同:

score1 * weight1 + score2 * weight2 + ... + scoreN * weightN

这不再是0到N * maxScore的范围,所以再除N是没有意义的。范围从0到:

maxScore * weight1 + maxScore * weight2 + ... + maxScore * weightN

maxScore * totalWeight。因此,要将加权总数转换为加权平均值,我们需要除以总权重:

(score1 * weight1 + ... + scoreN * weightN) / (weight1 + ... + weightN)

请注意,如果您将每个权重设置为1,则会获得正常平均值的公式,这表示我们可能已经完成了这个数学运算。

答案 1 :(得分:0)

为了澄清@Dan Getz并添加@collapsar答案,我将添加以下内容:

丹的公式是正确的:

$('.remove').on("click", function() { $(this).closest('.row').remove(); return false; });

加权平均值的优点是你可以选择权重!

因此,我们选择自第一条消息以来的天数作为权重。所以我会选择一些数据并说明它是如何工作的。在所有情况下,简单平均值为5.0。

首先,我们将看看随着时间的推移而增加的评级。

#include <locale>
#include <iostream>
#include <iomanip>
#include <string>

class comma_numpunct : public std::numpunct<char>
{
public:
   comma_numpunct(char thousands_sep, const char* grouping)
      :m_thousands_sep(thousands_sep),
       m_grouping(grouping){}
protected:
   char do_thousands_sep() const{return m_thousands_sep;}
   std::string do_grouping() const {return m_grouping;}
private:
   char m_thousands_sep;
   std::string m_grouping;
};

int main()
{

    std::locale comma_locale(std::locale(), new comma_numpunct(',', "\03"));

    std::cout.imbue(comma_locale);
    std::cout << std::setprecision(2) << std::fixed << 1000000.1234;
}

所以要计算权重:

(score1 * weight1 + ... + scoreN * weightN) / (weight1 + ... + weightN)

计算平均值

Date[0]:  May 6      Rating[0]: 1     Weight[0]: 0
Date[1]:  May 7      Rating[1]: 3     Weight[1]: 1
Date[2]:  May 8      Rating[2]: 5     Weight[2]: 2
Date[3]:  May 9      Rating[3]: 7     Weight[3]: 3
Date[4]:  May 10     Rating[4]: 9     Weight[4]: 4

计算:

Weight[i] = Date[i] - Date[0]

同样,评级随着时间的推移而下降:

( Rating[0]*Weight[0] + Rating[1]*Weight[1] + ... + Rating[N]*Weight[N] ) / 
( Weight[0] + Weight[1] + ... + Weight[N] ) 

计算将是:

(1*0 + 3*1 + 5*2 + 7*3 + 9*4) / (0 + 1 + 2 + 3 + 4) = (0+3+10+21+36)/10 = 7.0

选择了重量,以便较大的重量对应于我想要更多重量的等级。