2012-04-05 6 views
0

Ich habe einen Zahlenbereich von 1 - 0,00000X. Die meisten sind kleine Zahlen wie 0,000823. Wie kann ich sie so abbilden, dass sie näher in Reichweite sind? Ich habe die Methode sqrt verwendet, aber andere Vorschläge?Zahlen von 1-.0000X auf 1 - 0.0X normalisieren?

aktualisieren

Beispiel Zahlen zwischen 1-0,1 ich mit ihnen Problem nicht. Mein Problem mit Zahlen unter 0,1. Ich muss sie näher an 0.1 bringen.

  • .00004 -> 0,0004 oder 0,004
  • 0,023 -> 0,05 oder 0,09
+2

Ich kann mir viele Möglichkeiten vorstellen, diese Werte abzubilden; Was am geeignetsten wäre, würde davon abhängen, was sie darstellen und wie sie verwendet werden sollen. Zum Beispiel, was ist falsch mit der Verwendung von sqrt? –

+0

Ich möchte die Nummer in Reichweite 1-0 sein. Mein Problem ist, dass ich viele niedrige Zahlen wie 0,000023 habe. Sqrt schrumpft sie gut, aber ich brauche etwas Besseres. Zum Beispiel Zahlen, die 4 oder mehr 0, .0000X oder 0.00000000X haben Ich möchte sie auf 1 Ding abbilden, das auch kleiner ist, vielleicht 0.000X oder sogar 0.0X – tnaser

+0

Definieren Sie wieder "besser". Zum Beispiel könnten wir alle obigen Zahlen abbilden, sagen wir 0,1 bis 1, und dann die unten genannten gleichmäßig über 0-0,99 verteilen. –

Antwort

3

Have you tried logarithms?

Wenn Ihre Zahlen erfüllen eps < x <= 1, die Funktion

y = 1 - C*log(x) wo C = 1/-log(eps)

wird Karte die Zahlen in einem Bereich 0 ..1. Wenn der Bereich nicht benötigt wird, nur dass die Zahlen dicht beieinander liegen, können Sie den Skalierungsfaktor löschen.

Edit: Dies kann natürlich ohne Subtraktion ausgedrückt werden.

y = 1 + C*log(x) wo C = 1/log(eps)

Zum Beispiel mit einem Epsilon von 0,0000000001 (10^-10), erhalten Sie C = -0,1 und:

0.0000000001 => 0 
0.000000001 => 0.1 
0.00000001 => 0.2 
... 
0.1   => 0.9 
1   => 1 

Edit: Wenn Sie nicht wollen, zu Ändern Sie den Bereich von 0,1 ... 1,0, aber nur kleinere Zahlen, skalieren Sie dann den Bereich von 0 ... 0,1. Dies kann erfolgen, indem man x mit 10 multipliziert, bevor die Funktion angewendet wird, und danach erneut durch 10 dividieren. Verwenden Sie in diesem Fall natürlich nur die Skalierungsfunktion, wenn der Wert kleiner als 0,1 ist.

+0

1- log (x), wird niedrigen Zahlen mehr Gewicht geben. Zum Beispiel ist .0003 höher als .3 – tnaser

+0

Ja, natürlich. Also, 'sqrt', was du als Beispiel gegeben hast, na und? – hirschhornsalz

+0

Aber Subtrahieren machen das Gegenteil – tnaser

0

Nun, eine einfache Möglichkeit wäre es, die minimal eine berechnen (sagen wir, 1-t) und das Segment neu zuzuordnen [1-t, 1] bis [0, 1]. Die Abbildungsfunktion kann linear sein:

xnew = (xold - 1)/t + 1 

(natürlich t = 1 - min value)

+0

Ich brauche das Mapping zwischen 0 und 1 nein - – tnaser

+0

@tnaser: Ja, das Mapping wird zwischen 0 und 1 sein.Versuchen Sie es :-) – Vlad

+0

Wenn Nummer 0.002 und min 0.00005, dies ergibt -0,499? . benutzt (X-1)/(1-min + 1) – tnaser