2017-03-09 4 views
1

Der folgende Code normalisiert einen Vektor, der sowohl positive als auch negative Werte in einem Bereich von [-1,1] hat. Wenn Sie sich jedoch das Diagramm ansehen, werden Sie feststellen, dass das Diagramm aufgrund der Art der Normalisierung nach unten verschoben ist.Normalisieren durch Quetschen/Dehnen von Daten zwischen -1 und 1

Frage:

Gibt es eine Möglichkeit, die Methode zu ändern, um die Daten zwischen -1 und 1 ohne Verschieben der Daten zu normalisieren?

%# generate some vector 
vec = [0,0.5,0.8660254040,.8,0.866025404,0.5,1.22E-16,-0.1,-0.4,-0.3, ... 
-0.6,-0.5,-2.45E-16,0.5,0.866025404,1.3,0.866025404,0.5,3.67E-16, ... 
-0.5,-0.4,-0.7,-0.7,-0.5,-4.90E-16]; 

%# get max and min 
maxVec = max(vec); 
minVec = min(vec); 

%# normalize to -1...1 
vecN = ((vec-minVec)./(maxVec-minVec) - 0.5) *2; 

% plot results 
plot(vec,'k'); hold on; 
plot(vecN,'--r'); hold off; 

Plot von Original-Vektor (schwarz) vs normalisierte Vektor (rot gestrichelt)

Dieses Verhalten des Vektors normalisiert aber verschiebt sich die Handlung, die nicht erwünscht ist.

Plot of original vector (black) vs normalized vector (red dashed)

Antwort

1

Die obige Antwort von Ander hat mich dazu gebracht zu denken, dass die beste Lösung wäre, positive und negative Werte separat zu behandeln und dann die Ergebnisse aus der "normalisiertes" gequetschtes/gestrecktes Ergebnis

Die folgende Funktion quetscht oder dehnt den Eingabevektor nach Bedarf zwischen -1 und 1 und erzeugt so eine Art "Normalisierung".

-Code

function [vecN] = normSquish(vec) 
% Returns a "squished" normalized vector (vecN). 
% The function squishes/stretches the positive/negative relative to the 
% max/min of vec. 

%% Normalize input vector 
% get max and min 
maxVec = max(vec); 
minVec = min(vec); 

vecPos = vec; 
vecNeg = vec; 
vecPos(vecPos<0) = 0; 
vecNeg(vecNeg>0) = 0; 

vecPosN = vecPos./abs(maxVec); 
vecNegN = vecNeg./abs(minVec); 

vecN = vecPosN; 
zs = find(vecPos==0); 
for i = 1:size(zs,2) 
    index = zs(i); 
    vecN(index)=vecNegN(index); 
end 

Plot ursprüngliche Methoden und Lösungsvorschläge zu vergleichen Comparison of methods

+0

Das ändert auch den Mittelwert, oder? –

+0

Ja, tut es. Ich verwendete "gemein", weil es kein besseres Wort gab, und versuchte, es besser zu machen, indem ich "relativ gemein" sagte. Es war eindeutig nicht sehr effektiv. Verzeihe die Verwirrung. Ich versuchte herauszufinden, dass ich eine Methode wollte, die die Daten nicht auf Null verschiebt. –

4

Wenn Sie auf Ihre Daten normalisieren zwischen -1 und 1 dann sicher die Daten ändern, damit die Mittel sein. Wenn Sie "normalisieren", können Sie das nicht vermeiden.

Stattdessen skaliert die Daten innerhalb des Bereichs sein, die Sie wünschen:

vecN=vec*1/max(abs(max(vec)),abs(min(vec)));

Die mittlere wird Änderung aber, wenn Sie die Daten ändern. Dieser Weg ist einfacher zu finden (mean(vec)==mean(vecN)*max(abs(max(vec)),abs(min(vec))))

+0

Vielen Dank für Ihre Eingabe. Die Lösung, die Sie zur Verfügung gestellt haben, war nicht ganz das, was ich beschreiben wollte. Offensichtlich ändert sich der Mittelwert. Ich versuchte zu beschreiben, was ich meinte, indem ich "relativ gemein" sagte. Aber verloren in der Übersetzung, weißt du? Ihre Antwort brachte mich dazu, auf einer anderen Strecke zu denken, also konnte ich die Lösung finden, die ich suchte. +1 für deine Hilfe! –

Verwandte Themen