2014-10-27 65 views
0

我有一个数组,我想根据给数组中的每个元素赋值得分进行排序。非线性比较排序/得分

假设可能的分数范围是0-100。为了得到这个分数,我们将使用2个比较数据点,一个权重为75,另一个权重为25.我们称它们为valueA和valueB。我们将把每个值转换成一个分数。所以:

值a(范围= 0-10,000)
VALUEB(范围= 0-70)
scoreA(范围= 0 - 75)
scoreB(范围= 0 - 25)
scoreTotal = scoreA + scoreB(0 - 100)

现在的问题是如何以非线性方式将valueA转置为scoreA,并且接近最小值的权重更大。我的意思是,对于valueA来说,0将是一个完美的得分(75),但是一个20的值会得到37.5的中点分数,而一个100的值会得到非常低的分数5 ,然后更大的趋势将趋于0(例如,5000的值基本上为0)。理想情况下,我可以用一些数据点(例如4个四分点)设置曲线,然后该算法适合该曲线。或者,也许最简单的解决方案是在曲线上创建一堆点(如10),并在这10个点之间进行线性转换?但我希望有一个更简单的算法来完成这个,而不需要自己弄清楚曲线上的所有点,然后调整10个变量。我宁愿用1或2个输入来定义曲线的陡峭程度。可能?

我不需要超级复杂或精确的东西,只是一个简单的算法,因此接近范围最小值的权重更大,接近范围最大值的权重更小。希望这是有道理的。

我的统计数学是如此生疏我甚至不知道这是要求寻找解决方案。所有那些年份的微积分和统计数字都没有。

我在Objective C中实现了这一点,但任何c-ish/java-ish伪代码都可以。

回答

2

你可能想尝试的功能是

max/[(log(x+2)/log(2))^N] 

其中max你的情况75或25。 log(x+2)/log(2)部分确保f(0) == max(您可以用log(x+C)/log(C)代替C > 0;更高的C会减慢曲线的下降); ^N决定了你的功能下降到0的速度(你可以通过功能here来获得正在发生的事情)

+0

非常简单的解决方案。谢谢! – Joel 2014-10-27 03:43:00

+0

有没有办法让这条曲线变成更多的“S”形状,从而它最初保持高位,然后在中点处下降并改变形状?上述问题是始终有一个快速下降,这不是预期的结果。 – Joel 2014-10-27 04:28:10

+1

@Joel您可以尝试一个[后勤功能](http://en.wikipedia.org/wiki/Logistic_function),参见[这里](https://www.desmos.com/calculator/xzggc2jmhu)。 '(max * 2)/(1 + 2^[x/C])',其中'C'确定下降速率;这将消除下降趋势 – 2014-10-27 04:39:18