非线性比较排序/评分



我有一个数组,我想根据给数组中的每个元素赋值来排序。

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

valueA(范围=0-10000)
值B(范围=0-70)
scoreA(范围=0-75)
记分B(范围=0-25)
scoreTotal=分数A+分数B(0-100)

现在的问题是如何以非线性的方式将值a转换为分数a,因为它接近最小值,所以权重更大。我的意思是,对于值a,0将是一个完美的分数(75),但值20将给出37.5的中点分数,值100将给出5的非常低的分数,然后所有更大的值都将趋向于0(例如,值5000将基本上为0)。理想情况下,我可以用几个数据点(比如4个四分位点)建立一条曲线,然后算法将适合该曲线。或者最简单的解决方案是在曲线上创建一组点(比如10个),并在这10个点之间进行线性换位?但我希望有一种更简单的算法来实现这一点,而无需自己计算曲线上的所有点,然后再调整10多个变量。我宁愿用1或2个输入来定义曲线的陡峭程度。可能吗?

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

我的统计数学太生疏了,我甚至不知道这对寻找解决方案来说是什么。那些年的微积分和统计学都是徒劳的。

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

您可能想要尝试的函数是

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

其中CCD_ 1在您的情况下是75或25。log(x+2)/log(2)部分确保f(0) == max(您可以在此处用log(x+C)/log(C)代替任何C > 0;较高的C将减缓曲线的下降);^N决定你的函数降到0的速度(你可以在这里玩这个函数来了解发生了什么)

最新更新