Wie soll ich einen Vektor in Matlab normalisieren, wo die Summe 1 ist?

8

Ich muss einen Vektor von N ganzen Zahlen normalisieren, so dass:

  • Jeder Wert ist proportional zu seinem ursprünglichen Wert (der Wert liegt zwischen 0 und 1)
  • Die Summe aller Werte ist = 1

Zum Beispiel:

Wenn ich einen Vektor habe

%Vor%

sollte der normalisierte Vektor sein:

%Vor%

Ich habe versucht, mit vielen Lösungen in dieser Community und im Internet gefunden und schließlich habe ich es mit diesem Code gemacht:

%Vor%

Das Problem funktioniert, wenn:

  • Alle Elemente des Arrays sind "0" - & gt; resultierendes Array ändert sich nicht
  • nur ein Element des Arrays ist & gt; 0 und alle anderen Elemente sind = 0 - & gt; resultierendes Array: das Element & gt; 0 ist 1 und das andere 0

Aber wenn ich einen anderen Fall habe, obwohl das Ergebnis proportional ist, ist die Summe nicht 0. Zum Beispiel:

%Vor%

(Ich bin mir nicht sicher, ob die Zahl korrekt ist, weil ich Matlab momentan nicht benutzen kann, aber ich bin mir sicher, dass die Summe & gt; 1)

ist

Ahy Hinweis?

Vielen Dank im Voraus

    
dragonmnl 27.06.2012, 10:52
quelle

3 Antworten

8
  

... sollte der normalisierte Vektor sein:

     

v_norm = [0.4, 0.4, 0.2, 0]; % 0.4+0.4+0.2 = 1   

Das kommt darauf an. Was ist Ihre Norm Funktion?

norm(x) in MATLAB gibt die Standardnorm zurück, dh die Summe der Quadrate der Elemente eines normalisierten Vektors x ist 1.

In Ihrem Beispiel:

%Vor%

sum(v_norm .^ 2) liefert zwar 1, aber sum(v_norm) nicht wie erwartet.


  

Ich muss einen Vektor von N ganzen Zahlen normalisieren, so dass jeder Wert proportional zu seinem ursprünglichen Wert ist (der Wert wird zwischen 0 und 1 liegen) und die Summe aller Werte ist 1.

Was meinst du mit " normalisieren "? Bedeutet das Teilen durch einen Wert, der eine gültige mathematische Normfunktion ist, gemäß der Normdefinition ?

Was meinst du mit " proportional "? Bedeutet das, dass alle Elemente mit dieser gleichen Zahl multipliziert werden? Wenn dies der Fall ist und es sich um eine gültige mathematische Norm handelt, können Sie nicht garantieren, dass die Summe der Elemente immer 1 ist.
Betrachten wir zum Beispiel v = [1, -2] . Dann sum(v) = -1 .

Oder vielleicht ist sum die Funktion, nach der Sie suchen, aber sie ist nicht mathematisch als Norm zu qualifizieren, weil eine Norm eine Funktion ist, die allen Vektoren in a eine streng positive Länge oder Größe zuweist Vektorraum .
Im obigen Beispiel ist sum(v) negativ.


  

Ahy Hinweis?

Sie können wählen zwischen:

  1. sum(x) , das beide Anforderungen erfüllt, aber nicht als Normfunktion gilt, da es negative Werte ergeben kann.
  2. norm(x, 1) , wie OleThomsenBuus vorgeschlagen, die tatsächlich sum(abs(x(:))) berechnet.
    Es wird nicht beide Anforderungen erfüllen, es sei denn, Sie beschränken Ihren Vektorraum auf nicht-negative Vektoren.
Eitan T 27.06.2012, 11:25
quelle
9

Was Sie tun müssen, ist, glaube ich, Normalisierung mit der 1-Norm ( Taxicab-Norm):

%Vor%

Die Variable v_normed sollte jetzt [0.4, 0.4, 0.2, 0.0] sein. Die 1-Norm von v_normed ist gleich 1. Sie können auch den Vektor summieren (ähnlich der 1-Norm, aber ohne die absolute Funktion auf jeden Wert anzuwenden), aber der Bereich dieser Summe liegt zwischen -1 und 1 im allgemeinen Fall (wenn Werte in v unter 0 liegen). Sie könnten abs auf die resultierende Summe verwenden, aber mathematisch wird es nicht länger als Norm gelten.

    
Ole Thomsen Buus 27.06.2012 11:42
quelle
6

Wenn es zu Ihrer Normalisierung keine weiteren Bedingungen gibt, als Sie zu Beginn Ihrer Frage angegeben haben, wäre eine mögliche Lösung

%Vor%     
Deve 27.06.2012 11:16
quelle

Tags und Links