我的数字范围为 1 - 0.00000X 。大多数是小数字,例如 0.000823。我如何映射它们以使它们的范围更近?我使用 sqrt 方法,但还有其他建议吗?
更新
1-0.1 之间的示例数字我对它们没有问题。我的问题是低于 0.1 的数字。我需要使它们更接近 0.1。
- .00004 -> 0.0004 或 0.004
- 0.023 -> 0.05 或 0.09
我的数字范围为 1 - 0.00000X 。大多数是小数字,例如 0.000823。我如何映射它们以使它们的范围更近?我使用 sqrt 方法,但还有其他建议吗?
更新
1-0.1 之间的示例数字我对它们没有问题。我的问题是低于 0.1 的数字。我需要使它们更接近 0.1。
如果你的数字满足eps < x <= 1
,函数
y = 1 - C*log(x)
在哪里C = 1/-log(eps)
将数字映射到范围 0..1。如果不需要范围,只要数字靠近,您可以删除比例因子。
编辑:这当然可以不用减法来表达。
y = 1 + C*log(x)
在哪里C = 1/log(eps)
例如,对于 0.0000000001 (10^-10) 的 epsilon,您会得到 C = -0.1 并且:
0.0000000001 => 0
0.000000001 => 0.1
0.00000001 => 0.2
...
0.1 => 0.9
1 => 1
编辑:如果您不想将范围从 0.1 ... 1.0 更改为较小的数字,则只需将范围从 0 ... 0.1 缩放。这可以通过在应用函数之前将 x 乘以 10 来完成,然后再除以 10。当然,在这种情况下,仅当值小于 0.1 时才使用比例函数。
好吧,一种简单的方法是计算最小值(例如1-t
),然后将段重新映射[1-t, 1]
到[0, 1]
。映射函数可以是线性的:
xnew = (xold - 1) / t + 1
(当然t = 1 - min value
)