我正在寻找一种算法来将值映射到具有对数间距的单位尺度。比例范围从 0 到 1。传入值将在 0 到 10000 的范围内。
0 映射到 0,1 映射到 .2,10 映射到 .4,100 映射到 .6 1000 个映射到 .8,10000 个映射到 1.0
帮助/指点将不胜感激。
最佳答案
如果您从字面上看是“将值映射到具有对数间距的单位刻度”,并且 f(0)=0,那么您的示例值是错误的。
但是,您可以使用 f(x) = log(1+x)/log(1+max)
所以对于 max=10000
,我们有:
f(0)=0
f(1)=0.0753
f(2)=0.1193
f(10)=0.2603
f(100)=0.5010
f(1000)=0.7501
f(10000)=1
这在对数尺度上是有道理的:如果 1 接近 0 并且 10000 是 1,那么 100 具有前面数字的平均零数,应该在 0.5 左右。您真的不会开始考虑将 log(0)
作为一个选项。
但是,只要您的最小值不再是 0
(即使 min
值非常非常小,只要它不为零),你可以做一个更合理的插值:
f(x) = (log(x) - log(min)) / (log(max) - log(min))
这是the same作为 user3246191 在他的回答下的评论:
f(x) = log(x/min) / log(max/min)
由于本文中 f
返回的所有值都是对数的分数,因此您可以取任何底数的对数。我会为你的编程语言推荐原生的(即如果 log10(x)
被定义为 ln(x)/ln(10)
,取 ln( x)
代替)。
关于将值映射到具有对数间距的单位刻度的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28125439/