2009-10-02 16 views
10

Ich habe einen Datensatz, der im Bereich von 1 bis 30.000Normalisieren Datensatz mit Rubin

ich mag es normalisieren, so dass es 0,1 bis 10

Was wird die beste Methode/Funktion, das zu tun?

Würde es sehr schätzen, wenn Sie einige Beispielcode geben könnten!

+0

Sind Sie sicher, dass dies Datennormalisierung genannt wird? Sie sollten erwägen, diese Datenumwandlung aufzurufen. Ich glaube, dass sich die Normalisierung auf die Topologie der Daten bezieht. – jrhicks

Antwort

14

Hier ist ein Code-Schnipsel, vorausgesetzt, Sie eine lineare Normalisierung wollen. Es ist eine sehr einfache Version (nur gerade Code, keine Methoden), so können Sie sehen, "wie es funktioniert" und es auf alles anwenden können.

xmin = 1.0 
xmax = 30000.0 
ymin = 0.1 
ymax = 10.0 

xrange = xmax-xmin 
yrange = ymax-ymin 

y = ymin + (x-xmin) * (yrange/xrange) 

Und hier wird es als Funktion getan:

def normalise(x, xmin, xmax, ymin, ymax) 
    xrange = xmax - xmin 
    yrange = ymax - ymin 
    ymin + (x - xmin) * (yrange.to_f/xrange) 
end 

puts normalise(2000, 1, 30000, 0.1, 10) 

(Hinweis: die to_f stellt sicher, wir fallen in das schwarze Loch der Integer-Division nicht)

+1

Danke Brent! das ist eine schöne und elegante Art dies zu tun =) –

6

Diese ist ein bekannter Weg, um eine Sammlung Zahlen zu skalieren. Es hat einen präziseren Namen, aber ich kann mich nicht erinnern und versage es zu googeln.

def scale(numbers, min, max) 
    current_min = numbers.min 
    current_max = numbers.max 
    numbers.map {|n| min + (n - current_min) * (max - min)/(current_max - current_min)} 
end 

dataset = [1,30000,15000,200,3000] 
result = scale(dataset, 0.1, 10.0) 
=> [0.1, 10.0, 5.04983499449982, 0.165672189072969, 1.08970299009967] 
scale(result, 1, 30000) 
=> [1.0, 30000.000000000004, 15000.0, 199.99999999999997, 3000.0000000000005] 

Wie Sie sehen können, müssen Sie Rundungsfragen beachten. Sie sollten wahrscheinlich auch sicherstellen, dass Sie keine ganzen Zahlen als min & max erhalten, weil eine Ganzzahl-Division das Ergebnis beschädigen wird.

7

Hier ist der Ruby Way für den häufigen Fall, dass ein Array auf 0.0 und maximal auf 1.0 gesetzt wird.

class Array 
    def normalize! 
    xMin,xMax = self.minmax 
    dx = (xMax-xMin).to_f 
    self.map! {|x| (x-xMin)/dx } 
    end 
end 

a = [3.0, 6.0, 3.1416] 
a.normalize! 
=> [0.0, 1.0, 0.047199999999999985] 

Für eine min und max andere als 0 und 1, fügen Argumente normalize! in der Art Elfstrom Antwort.