2012-04-05 1 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を使用すると何が問題になりますか? –

+0

番号が範囲1-0になるようにします。私の問題は、私は0.000023のような低い数字がたくさんあることです。 sqrtはそれらをうまく収縮させますが、私はより良いものが必要です。たとえば、4以上の0、.0000X、または0.00000000Xの数字は、小さいもの、つまり0.000Xでも0.0Xでも1つのものにマップしたいと考えています。 – tnaser

+0

もう一度、「より良い」を定義します。たとえば、上のすべての数値、たとえば0.1〜1をマッピングして、0〜0.99の範囲に均等に分散します。 –

答えて

3

Have you tried logarithms?

あなたの番号はeps < x <= 1を満たしている場合、機能C = 1/-log(eps)

がマップされます

y = 1 - C*log(x)範囲0の数値..1。範囲が必要ではなく、数値が接近している場合にのみ、スケール係数を削除することができます。

編集: これは、もちろん減算することなく表すことができます。 0.0000000001(10^-10)のイプシロンとC = 1/log(eps)例えば

は、あなたが得る

y = 1 + C*log(x) 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

+0

もちろんです。例として与えた 'sqrt'もそうですが、何ですか? – hirschhornsalz

+0

ただし、1を下回る数の対数が負であるため、逆数を減算すると – tnaser

0

さて、簡単な方法は、最小限の一方(たとえば、1-t)を算出することで、セグメントを再マップであろう[1-t, 1]~[0, 1]。マッピング関数は、線形のようになります。

(もちろん t = 1 - min valueの)
xnew = (xold - 1)/t + 1 

+0

マッピングが0と1の間でないようにする必要はありません。 – tnaser

+0

@tnaser:はい、マッピングは0と1の間になります。試してみましょう:-) – Vlad

+0

数字が0.002、最小値が0.00005の場合、-0.499になりますか? 。 (X-1)/(1-min + 1) – tnaser

関連する問題