非线性比较排序/评分

时间:2014-10-27 03:00:16

标签: algorithm sorting scoring

我想要根据为数组中的每个元素分配分数来排序数组。

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

valueA(范围= 0-10,000)
valueB(范围= 0-70)
得分A(范围= 0 - 75)
得分B(范围= 0 - 25)
scoreTotal = scoreA + scoreB(0 - 100)

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

我不需要超级复杂或准确的东西,只需要一个简单的算法,因此接近范围的最小值时可以获得更大的权重,而接近范围的最大值则可以减少加权。希望这是有道理的。

我的统计数据是如此生疏,我甚至不确定搜索解决方案需要什么。所有这些年的微积分和统计数字都没有。

我在Objective C中实现了这个,但任何c-ish / java-ish伪代码都没问题。

1 个答案:

答案 0 :(得分: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来了解正在发生的事情)