我正在寻找一种基本的算法,可以更加重视最近的评论。
因此,算法的输出值是可变的。例如,具有完全相同分数的两个评论将根据创建的时间戳具有不同的排名。
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)
,对吧?由于没有新的评论,整体将是原始分数的一半。
答案 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
我选择了重量,以便较大的重量对应于我想要更多重量的等级。