将值映射到具有对数间距的单位刻度的算法

标签 algorithm math transform

我正在寻找一种算法来将值映射到具有对数间距的单位尺度。比例范围从 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/

相关文章:

math - ^ (XOR) 运算符有什么作用?

python - 使用Python 3.4和Pillow以及方法转换: AttributeError: Image

c++ - vector 的 vector 的 std::transform

c - 在存储在文件中的数字中找到再次出现的数字

python - 计算未成年人的矩阵行列式!

c++ - 你会如何转置二进制矩阵?

javascript - CSS 在容器内旋转元素

algorithm - 一个类似于 Levenshtein 但针对 Qwerty 键盘加权的好算法?

perl - 如何确定几个字符串中最长的相似部分?

algorithm - 对二进制二维矩阵进行排序?