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) の場合、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
)