2012-04-05 55 views
0

我有范围从1 - 0.00000X范围的数字。大多数是像0.000823这样的小数字。我如何映射它们以使它们更接近范围?我使用sqrt方法,但任何其他建议?正常化数字从1-.0000X到1 - 0.0X?

更新

例1-0.1之间 数字我没有问题与他们。我的数字低于0.1的问题。我需要把它们接近0.1。

  • 0.00004 - > 0.0004或0.004英寸
  • 0.023 - > 0.05或0.09
+2

我可以想象映射这些值的方法很多;这将是最合适的取决于他们代表的东西以及他们如何使用。例如,使用sqrt会出现什么问题? – 2012-04-05 14:23:14

+0

我希望数字在1-0的范围内。我的问题是我有很多像0.000023这样的低数字。 sqrt缩小了它们,但我需要更好的东西。例如具有4个或更多个0,.0000X或0.00000000X的数字我想将它们映射到1个也更小的事物,可能是0.000X甚至0.0X – tnaser 2012-04-05 14:25:08

+0

再次,定义“更好”。例如,我们可以将所有数字映射到0.1到1之间,然后均匀分布在0到0.99之间。 – 2012-04-05 14:27:29

回答

3

Have you tried logarithms?

如果你的号码满足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)的ε,你会得到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时才使用比例函数。

+0

1- log(x),将给予低数字更多权重。例如.0003将会高于.3 – tnaser 2012-04-05 14:35:21

+0

当然可以。那么'sqrt',你给出的例子是什么? – hirschhornsalz 2012-04-05 14:38:26

+0

但是减去反向 – tnaser 2012-04-05 14:42:41

0

那么,一个简单的方法是计算的最小一个(比方说,1-t),并重新映射段[1-t, 1][0, 1]。映射函数可以是线性的:

xnew = (xold - 1)/t + 1 

(当然t = 1 - min value

+0

我需要映射在0和1之间 - – tnaser 2012-04-05 14:33:20

+0

@tnaser:是的,映射将在0和1之间。试试看:-) – Vlad 2012-04-05 14:34:14

+0

如果数字0.002和最小值0.00005,这会给-0.499? 。 used(X-1)/(1-min + 1) – tnaser 2012-04-05 14:41:14