这是一个关于数据标准化的问题,它考虑了不同的参数。
我在网站上有一组文章。用户使用评级系统并对1至5星的文章进行评级。 1星意味着一篇糟糕的文章,标志着文章“糟糕”。 2星级的平均值为'评分。 3,4和5星评价良好','非常好'并且'优秀'。
我想将这些评级标准化为[0 - 2]。标准化值将代表分数,并将用作在文章列表中向上或向下提升文章的因素。具有2颗或更少恒星的文章应该得到[0-1]范围内的分数,因此这个提升因子将产生负面影响。评级为2或者更高的星的文章应该得到[1-2]的分数,所以这个提升因子将有积极的推动作用。
例如,一篇拥有3.6颗星的文章将获得1.4的提升因子。这将在文章列表中提升文章。一篇1.9星的文章得分为0.8。该评分将推动该文章在上市中进一步下滑。一篇2星的文章将得到1的提升因子 - 没有提升。
此外,我想考虑每篇文章的投票数量。单票3星的文章必须比4票和2.8星的平均值更差。 (提升因子可分别为1.2和1.3)
答案 0 :(得分:2)
如果我理解正确,您应该使用Sigmoid function,这是Logistic function的特例。 Sigmoid和其他逻辑函数通常用于神经网络中以缩小(压缩或标准化)数据的输入范围(例如,到[-1,1]或[0,1]范围)。
答案 1 :(得分:0)
根据数字和我自己制作的一些数字,我得出了这5分
Rating Boost
1.0 0.5
1.9 0.8
2.0 1.0
3.6 1.4
5.0 2.0
为此计算一个近似linear regression,我得到了公式y=0.3x+0.34
。
因此,您可以创建转换函数
float ratingToBoost(float rating) {
return 0.3 * rating + 0.34;
}
使用此功能,您将获得大约符合您要求的输出。样本数据:
Rating Boost
1.0 0.64
2.0 0.94
3.0 1.24
4.0 1.54
5.0 1.84
这显然有线性增长,可能不是你想要的,但只指定了三个值,很难确切地知道你期望的增长类型。如果您对线性增长不满意,并且您需要例如通过较低的提升来惩罚不好的文章,你总是可以尝试提出更多的值并生成指数或对数方程。
答案 2 :(得分:0)
我不打算解决您的评级系统,但这是一种标准化值的一般方法。
Java方法:
public static float normalise(float inValue, float min, float max) {
return (inValue - min)/(max - min);
}
C函数:
float normalise(float inValue, float min, float max) {
return (inValue - min)/(max - min);
}
此方法允许您在max和min上都有负值。例如:
variable = normalise(-21.9, -33.33, 18.7);
注意:您不能让 max 和 min 为相同的值,或者lett max小于min。并且 inValue 在给定范围内应该是winth。
如果您需要更多详细信息,请撰写评论。