我的数字范围为1 - 0.00000X。大多数是小数字,如0.000823。我如何映射它们以使它们更接近范围?我使用了sqrt方法但是还有其他建议吗?
更新
实施例 1-0.1之间的数字我对它们没有问题。我的数字低于0.1的问题。我需要让他们接近0.1。
答案 0 :(得分:3)
如果您的号码满足eps < x <= 1
,则函数
y = 1 - C*log(x)
其中C = 1/-log(eps)
将数字映射到范围0..1。如果不需要范围,只有数字靠近在一起,则可以删除比例因子。
编辑: 这可以在没有减法的情况下表达。
y = 1 + C*log(x)
其中C = 1/log(eps)
例如,如果epsil为0.0000000001(10 ^ -10),则得到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除以10。当然,在这种情况下,只有当值小于0.1时才使用缩放功能。
答案 1 :(得分:0)
嗯,一种简单的方法是计算最小值(例如1-t
),然后将段[1-t, 1]
重新映射到[0, 1]
。映射函数可以是线性的:
xnew = (xold - 1) / t + 1
(当然t = 1 - min value
)