我需要计算亚马逊网站上的五星评级.我已经做了足够的搜索来找到最好的算法,但我无法得到正确的答案.例如,如果这些是评级
5 star - 252
4 star - 124
3 star - 40
2 star - 29
1 star - 33
Run Code Online (Sandbox Code Playgroud)
共478条评论
亚马逊计算出这是"4.1星,5星".谁能告诉我这个数字是如何得出的?我只是通过平均而无法做到这一点.
我需要对2+个因子进行加权排序,按"相关性"排序.然而,这些因素并非完全孤立,因为我希望一个或多个因素影响其他因素的"紧迫性"(权重).
示例:贡献的内容(文章)可以上/下投票,因此具有评级; 他们有一个发布日期,他们也被标记为类别.用户撰写文章并可以投票,并且可能有也可能没有自己的某种排名(专家等).可能与StackOverflow类似,对吧?
我想为每个用户提供按标签分组但按"相关性"排序的文章列表,其中相关性是根据文章的评级和年龄计算的,并且可能受作者排名的影响.IE是几年前写的一篇排名很高的文章可能不一定像昨天写的中等文章一样重要.也许如果一篇文章是由专家撰写的,那么它将被视为比"Joe Schmoe"所写的文章更具相关性.
另一个很好的例子是为酒店分配一个由价格,评级和景点组成的"元评分".
我的问题是,多因素排序的最佳算法是什么?这可能是该问题的重复,但我对任意数量因素的通用算法感兴趣(更合理的期望是2 - 4个因素),最好是我不需要的"全自动"功能调整或要求用户输入,我无法解析线性代数和特征向量古怪.
到目前为止我找到的可能性:
注意:S是"排序分数"
我的目标是根据另一个表主键从一个表中获得加权平均值.
示例数据:
表格1
Key WEIGHTED_AVERAGE
0200 0
Run Code Online (Sandbox Code Playgroud)
表2
ForeignKey Length Value
0200 105 52
0200 105 60
0200 105 54
0200 105 -1
0200 47 55
Run Code Online (Sandbox Code Playgroud)
我需要根据段的长度得到加权平均值,我需要忽略值-1.我知道如何在SQL中执行此操作,但我的目标是在LINQ中执行此操作.它在SQL中看起来像这样:
SELECT Sum(t2.Value*t2.Length)/Sum(t2.Length) AS WEIGHTED_AVERAGE
FROM Table1 t1, Table2 t2
WHERE t2.Value <> -1
AND t2.ForeignKey = t1.Key;
Run Code Online (Sandbox Code Playgroud)
我仍然是LINQ的新手,并且很难弄清楚我将如何翻译它.结果加权平均值应该大约为55.3.谢谢.
Youtube提供两种排序选项:最新的第一和最高评论."最新的第一个"非常简单,我们只是根据他们的发布日期对评论进行排序.但"热门评论"似乎要比"大拇指"排序要复杂得多.

经过短暂的研究,我发现评论的顺序取决于这些:
但我不知道Youtube如何使用这些信息来决定顺序,比如什么信息更重要,什么不重要.
有没有关于这个主题的文章我可以参考?
谢谢!
我想实现一个迭代算法,计算加权平均值.具体权重法无关紧要,但最新值应接近1,最接近0.
算法应该是迭代的.即它不应该记住以前的所有值.它应该只知道一个最新的值和任何关于过去的汇总信息,比如以前的平均值,总和,计数等.
可能吗?
例如,以下算法可以是:
void iterate(double value) {
sum *= 0.99;
sum += value;
count++;
avg = sum / count;
}
Run Code Online (Sandbox Code Playgroud)
它会给指数减少的重量,这可能不好.是否有可能逐步减轻体重?
编辑1
称重法的要求如下:
1)重量减少到过去2)我有一些平均或特征持续时间,以便这个持续时间较旧的值比新的更小的值3)我应该能够设置这个持续时间
编辑2
我需要以下内容.假设v_i是值,其中v_1第一个是.还假设w_i是权重.但是w_0最后一次.
所以,在第一个价值来之后,我有第一个平均值
a_1 = v_1 * w_0
Run Code Online (Sandbox Code Playgroud)
在第二个值v_2来之后,我应该有平均值
a_2 = v_1 * w_1 + v_2 * w_0
Run Code Online (Sandbox Code Playgroud)
我应该有下一个值
a_3 = v_1 * w_2 + v_2 * w_1 + v_3 * w_0
Run Code Online (Sandbox Code Playgroud)
请注意,当我按照值序列移动时,重量轮廓随着我移动.
即每个值都没有自己的重量.我的目标是在过去的同时降低体重.
假设我有一个等级向量,其中等级是
struct Grade{
const int grade;
const int ECTS; // weight
};
Run Code Online (Sandbox Code Playgroud)
是否有STL / range-v3算法/算法使我能够做到这一点?
我知道我可以std:: accumulate用一些花哨的类型作为累加器(记住重量的总和)来做到这一点,但是我正在寻找一个更简单的替代方法(如果存在)。
所以有SQL函数AVG(),它取一列中所有值的平均值,忽略所有NULL值.如果需要进行加权平均,那么他们只需使用SUM(值*权重)/ SUM(权重)和Group By子句.
如果我愿意这样做后者,但我的一些数值是NULL,那么我将如何去告诉SQL忽略与在SUM(重量)函数NULL值的观察权重?
我的另一个问题是我一次平均取90个不同的列,所以我想避免为这个计算制作90个新的权重变量.
如果我明白了这一点,请告诉我.
我正在使用SQL Server 2005
让我们假设:
List<element> 哪个元素是:
public class Element(){
int Weight {get;set;}
}
Run Code Online (Sandbox Code Playgroud)
我想要实现的是,按重量随机选择一个元素.例如:
Element_1.Weight = 100;
Element_2.Weight = 50;
Element_3.Weight = 200;
Run Code Online (Sandbox Code Playgroud)
所以
Element_1选择的机会是100 /(100 + 50 + 200)= 28.57%Element_2选择的机会是50 /(100 + 50 + 200)= 14.29%Element_3选择的机会是200 /(100 + 50 + 200)= 57.14%我知道我可以创建一个循环,计算总数等...
我想要了解的是,Linq在一行(或尽可能短)中做到这一点的最佳方法,谢谢.
UPDATE
我在下面找到了答案.我学到的第一件事是:Linq不是魔术,它比设计良好的循环慢.
所以我的问题就是按重量找到一个随机元素,(尽可能短的东西:)
我有一个包含多列的pandas数据框.我想weighted_sum从行中的值和另一个列向量数据帧创建一个新列weight
weighted_sum 应具有以下值:
row[weighted_sum] = row[col0]*weight[0] + row[col1]*weight[1] + row[col2]*weight[2] + ...
我找到了这个功能sum(axis=1),但它不会让我倍增weight.
编辑:我改变了一点.
weight 看起来像这样:
0
col1 0.5
col2 0.3
col3 0.2
Run Code Online (Sandbox Code Playgroud)
df 看起来像这样:
col1 col2 col3
1.0 2.2 3.5
6.1 0.4 1.2
Run Code Online (Sandbox Code Playgroud)
df*weight返回一个充满Nan值的数据帧.
我有一个项目清单.当我创建列表时,每个项目都有相同的机会被选中.但是当一个项目被选中时,它的机会会下降,而其他机会会上升.如果在此过程中添加了一个新项目,那么它应该被选中的机会最大,并且在选中它时机会会下降.我正在寻找一个可以实现这个C#的好算法.
Generalizaed想法:我有5个项目,随着时间的推移,所有5个项目将被选中20%的时间.我试图让选择尽可能接近20%,减少对外界的影响.如果存在,将更多/更少地选择它以使其恢复正常.