2012-06-15 74 views
0

这是一个关于考虑到不同参数的数据标准化的问题。标准化[0 -1]范围内的值

我在网站上有一组文章。用户使用评分系统并评分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的提升因子 - 没有提升。

此外我想考虑每篇文章的票数。一票三星的文章排名要差于平均4票和2.8星的文章。 (助推系数分别为1.2和1.3)

+1

那么你的问题是什么?看起来你已经很好了。继续下去这个思路,你可能会想出来。 – Tenner

回答

2

如果我正确理解了你的话,你应该使用Sigmoid function,它指的是Logistic function的特殊情况。 Sigmoid和其他逻辑函数经常用于神经网络来收缩(压缩或规格化)数据的输入范围(例如,到[-1,1]或[0,1]范围)。

+0

也许也可以使用arctan,但我不会推荐它。 :-) – Mehrdad

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 

这显然线性增长,这可能不是你要找的是什么,但只有三个指定的值,这是很难知道您的期望究竟是什么样的增长。如果您对线性增长不满意,并且您希望不好的文章更多的受到更多的惩罚,你可以尝试提出更多的价值观并产生指数或对数方程。

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); 
} 

这种方法让你有两个最大和最小负值。例如:

variable = normalise(-21.9, -33.33, 18.7); 

注:,你不能让最大分钟是相同的值,或快报最大值小于分钟。并且inValue应该在给定范围内胜出。

如果您需要更多详细信息,请填写评论。

相关问题