WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

efiizienterer Code -> Vektorisierung??

 

Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 03.10.2012, 00:28     Titel:
  Antworten mit Zitat      
Hallo Christina,

Zusätzliche eckige Klammern reduzieren die Lesbarkeit und Laufzeit (wenn auch nur sehr wenig). Noch ein paar ander Vorschläge:
Code:
function y_predict = kregression(x_train,y_train, x_predict, h)
SizeOfX = size(x_train,1);
n = size(x_predict, 1);

y_predict = zeros(n,1);
W = zeros(SizeOfX, 1);
K = 0;
c = 2 * h ^ 2;

for i = 1:n
    for j = 1:SizeOfX
        W(j) = exp(-sum((x_predict(i,:) - x_train(j, :)) .^ 2) / c);
    end

    K = K + sum(W);
    if K ~= 0
       y_predict(i) = sum(W .* y_train) / K;
    end
end

Ich habe die Kommentare hier weggelassen, in den richtigen Code gehören sie aber unbedingt rein.

Unter welchen Bedingungen kann K überhaupt 0 werden?

Dies wäre schneller, wenn Du "x_predict" und "x_train" transponierst. Dann könnte in:
Code:
W(j) = exp(-sum((x_predict(:, i) - x_train(:, j)) .^ 2) / c);

auch benachbarte Speicherzellen im RAM zugegriffen werden, was deutlich effizienter ist.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen


Christina

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.10.2012, 09:49     Titel:
  Antworten mit Zitat      
Hallo Harald, Hallo Jan,
vielen Dank für eure Tips! Harald, ich werde mal versuchen ob ich das hin bekomme, glaube zwar nicht daran, aber ich versuche es =)

Jan, auch dir vielen Dank, das hilft mir schon einmal sehr. Zu der Frage wann K null werden kann. Also ich brauche die abfrage auf jeden fall, denn K wird am anfang sehr oft null, denn genau dann wenn die betrachteten Punkte zu weit von dem eigentlich punkt weg sind. wenn K sehr groß wird, und das wird es häufig, dann muss ich y_predict(i)=0 setzten denn sonst wird y_predict=[NaN,....NaN] und das zerstört dann den kompletten Algorithmus..
Also dass K=0 ist kein Sonderfall. x_train ist entweder 2000x1 oder 2000x5 groß und x_perdict 12000x1 oder 12000x5, somit wird K schon sehr groß, denn es berechnet exp(quadratischem Abstand zwischen den beiden Punkten).

Eine allgemeine Frage noch an dich Jan, warum kann man [] weg lassen? bzw wann braucht man es denn dann? ich dachte man benutzt das um der neu definierten variable "zu sagen, dass sie ein vektor/matrix ist". brauche ich dies also nur, wenn ich tatsächlich was in den vektor/,atrix rein schreiben will?
 
Christina

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.10.2012, 10:04     Titel:
  Antworten mit Zitat      
noch eine Frage an dich Harald,
Zitat:
Du könntest die W(j) am Anfang berechnen und sie dann in der Schleife verwenden.


Wie meinst du das am anfang? also vor der aller ersten for schleife? aber ich brauche doch die indizes der for schleife.. oder meintest du das so, wie es Jan nach dir beschrieben hat?

Zitat:
Die Berechnung der W(j) ist für verschiedene h sehr ähnlich. Es wäre also wohl möglich, dass kregression einen Vektor von h's entgegennimmt und das ganze sp effizienter abgearbeitet wird.

Schließlich kann man wohl noch bsxfun verwenden, um x_predict(i,Smile-x_train(j,Smile für festes i effizienter zu berechnen.


Das bedeutet, wenn ich [h] übergebe, müsste ich dann an die funktion smoothingParameter eine Matrix übergeben, in der in jeder spalte y_predict für verschiedene h steht, und dann in smoothingParameter y_h auf jede Spalte anwenden um dann mit der min funktion das kleinste element mit der zugehörigen position zu bekommen?

ich müsste dann also auch für W eine matrix bekommen, nur wie verbinde ich das dann alles mit bsxfun? habe mir schon die doku dazu durchgelesen, nur ist mir noch nicht ganz klar an welcher stelle ich das machen soll...

Tut mir leid, dass ich mich da so blöd anstelle und vielen dank für eure geduld...
 
Christina

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.10.2012, 13:17     Titel:
  Antworten mit Zitat      
Zitat:
Code:
K = K + sum(W);

Hier brauche ich doch dann nur noch K = sum(W) weil ich es nicht mehr schritt für schritt hochzähle und somit keinen initialwert von K benötige, oder?
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 03.10.2012, 15:57     Titel:
  Antworten mit Zitat      
Hallo Christina,

Harald's Tip W(j) am Anfang zu berechnen, habe ich in mein Code-Beispiel eingebaut.

Ich glaube, dass BSXFUN hier nicht viel bringen wird, da das Erzeugen großer temprärer Matrizen wieder mehr Zeit benötigt. Insgesamt ist das teure EXP aber wohl viel dominanter und die anzahl der Elemente, auf die EXP angewendet wird lässt sich nicht reduzieren.

Man kann [] weglassen, wenn der Inhalt ein Skalar ist, oder sowieso bereit ein Vektor:
Code:
X = 25;  % [X] = 25 bringt hier nichts
Y = 1:5;          % [1:5] macht aus dem Vektor 1:5 einen Vektor, also überflüssig
Z = [1, 2, 4:6];  % Zusammenfassung zu Vektor notwendig

Vielleicht wird es klarer, wenn man bedenkt, dass für "[x,y]" intern die Funktion horzcat() aufgerufen wird, und für "[x;y]" vertcat(). Für einen Skalar gibt es aber nichts zusammen zu fassen.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Christina

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.10.2012, 18:34     Titel:
  Antworten mit Zitat      
oh man ich verzweifel hier gerade sowas von, sitze den ganzen Tag schon dran und verstehe einafch nicht wo der fehler ist...

also an sich macht dein code beispiel, jan, das ganze doppelt so schnell, würde dann also für den einfachen fall anstatt 29 stunden nur noch 14.5 brauchen, ist immernoch nicht top, aber schon um einiges besser. ABER: es kommt einfach nicht das richtige erbegnis raus, der wert den das liefert, ist zwisch 3,8 und 4,1 und bei meiner langsamen implementation zwischen 1,8 und 2,1. ich verstehe aber einfach nicht wo die differenz her kommen soll?!

Kann es vielleicht sein, dass

Code:
for j=1:SizeOfX
        K=K+ exp(-sum((x_predict(i,:)-x_train(j,:)).^2)/(2*h^2));
    end

nicht das richitge berechnet?

K=K+... bedeutet doch, dass in jeder iteration der vorherige K wert genommen wird und darauf dann der neue term (exp...) drauf addiert wird oder?
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 03.10.2012, 22:31     Titel:
  Antworten mit Zitat      
Hallo Christina,

Ich habe keine Ahnung, ob wir wissen können, ob Dein Code das Richtige berechnet. Wir wissen ja noch nicht mal, was Du überhaupt berechnen möchtest. Zudem stehen hier im Thread viele einzelne Code-Fragmente und wir kennen nicht die unterschiedlichen Codes, die Du miteinander vergleichst.

Es ist merkwürdig, das K nicht in jeder Iteration auf 0 gesetzt wird, sondern auf die vorherigen Werte aufsummiert wird. Aber das könnte auch richtig sein.

Wenn Du Code mit Input-Daten postest, so dass wir ihn selbst laufen lassen können, wäre eine Laufzeit-Optimierung deutlich einfacher.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Christina

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.10.2012, 11:34     Titel:
  Antworten mit Zitat      
ok, also ich lade jetzt auf zwei mal alle datein hoch, die in der monte carlo simulation verwendet werden, inclusive der zwei Aufrufe mit kontreketen daten.

bei meiner Regressionsfunktion soll der nadaraya watson kernschätzer berechnet und implementiert werden, ich habe die zugeörigen gleichungen als bild beigefügt!

payoff2.m
 Beschreibung:

Download
 Dateiname:  payoff2.m
 Dateigröße:  153 Bytes
 Heruntergeladen:  300 mal
payoff1.m
 Beschreibung:

Download
 Dateiname:  payoff1.m
 Dateigröße:  345 Bytes
 Heruntergeladen:  260 mal
paths.m
 Beschreibung:

Download
 Dateiname:  paths.m
 Dateigröße:  475 Bytes
 Heruntergeladen:  286 mal
Main.m
 Beschreibung:

Download
 Dateiname:  Main.m
 Dateigröße:  511 Bytes
 Heruntergeladen:  303 mal
index.m
 Beschreibung:

Download
 Dateiname:  index.m
 Dateigröße:  121 Bytes
 Heruntergeladen:  273 mal
 
Christina

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.10.2012, 11:44     Titel:
  Antworten mit Zitat      
hier der restliche teil der daten.

Ich hofffe es kann dir helfen zu verstehen, was ich da eigentlich mache.

Ich habe auch mal versucht, Haralds Tip mit bsxfun und h als vektor zu implementieren. Es läuft durch, es kommt aber auch ein komplett anderes Ergebnis, bin auch hier noch einmal alles durchgegangen um zu überprufen ob theoretisch das richtige berechnet wird, tut es meiner meinung nach, aber das bedeut ja nicht viel -.- habe das auch mal hochgeladen: smoothingParameter2.m und k.m

kregression.m
 Beschreibung:
das ist dir ursprüngliche form meine implementierung des kernschätzers

Download
 Dateiname:  kregression.m
 Dateigröße:  873 Bytes
 Heruntergeladen:  278 mal
pricing szenarios.rar
 Beschreibung:
konnte sie einzeln irgendwie nicht hoch laden, deshalb hab ich sie verpackt

Download
 Dateiname:  pricing szenarios.rar
 Dateigröße:  568 Bytes
 Heruntergeladen:  263 mal
kernschätzer.jpg
 Beschreibung:

Download
 Dateiname:  kernschätzer.jpg
 Dateigröße:  10.06 KB
 Heruntergeladen:  433 mal
smoothingParameter.m
 Beschreibung:

Download
 Dateiname:  smoothingParameter.m
 Dateigröße:  1.56 KB
 Heruntergeladen:  304 mal
pricing2.m
 Beschreibung:

Download
 Dateiname:  pricing2.m
 Dateigröße:  2.66 KB
 Heruntergeladen:  295 mal
 
Christina

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.10.2012, 11:46     Titel:
  Antworten mit Zitat      
hier der nun wirklich letzte rest

smoothingParameter2.m
 Beschreibung:
zugehörige andere Funktion Version harald

Download
 Dateiname:  smoothingParameter2.m
 Dateigröße:  1.38 KB
 Heruntergeladen:  291 mal
k.m
 Beschreibung:
version Harald

Download
 Dateiname:  k.m
 Dateigröße:  983 Bytes
 Heruntergeladen:  281 mal
kr.m
 Beschreibung:
version jan

Download
 Dateiname:  kr.m
 Dateigröße:  489 Bytes
 Heruntergeladen:  286 mal
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 04.10.2012, 14:45     Titel:
  Antworten mit Zitat      
Hallo Christina,

Dies sind nun 13 einzelne Files. Sie enthalten offenbar eine Version von Harald, eine von mir und sicherlich auch eine von Dir.
Dies ist für eine kurze Kontrolle viel zu kompliziert. Du musst bedenken, das wir keine Ahnung haben, was Du eigentlich machst. Wir könne nur versuchen ein Code-Fragment zu verbessern, aber dafür muss es 1. bereits korrekt laufen und 2. ohne Handbuch startbar sein.

Ich meine das Limit liegt bei einem M-file und einem Daten-File (welches besser gezippt wird, da RAR-Files z.B. unter Linux nicht standardmäßig erkannt werden). Das M-file kann die Unterfunktionen natürlich enthalten, allerdings sollte es ohne Input-Argumente starten.

Es ist schmeichelhaft, dass Du uns zutraust durch diesen Code durchzublicken. Danke. Ich schaffe das aber leider nicht. Ich rate mal ganz mutig, dass das auch für Dich nicht ganz leicht ist, was das debuggen umso schwerer macht.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 04.10.2012, 14:52     Titel:
  Antworten mit Zitat      
Hallo,

ich habe mich da nun mal durchgewühlt:

ich kann dir schon mal einen Unterschied in den Versionen sagen:
In kregression.m setzt du K einmalig außerhalb der i-Schleife auf 0, d.h. bei i=2 wird der Wert am Ende der Iteration i = 1 genommen etc.
Bei k.m und kr.m wird K in jeder Iteration unabhängig von den vorherigen Iterationen berechnet. Das führt zwangsläufig zu anderen Ergebnissen als bei kregression.m.

Leider ist die Graphik sehr klein, so dass ich die Indizes nicht entziffern kann. Auf den ersten Blick würde ich das jedoch so interpretieren, dass die Implementierung in kregression.m wie von Jan und mir bereits zuvor vermutet nicht korrekt ist.

Wie soll pricing2.m aufgerufen werden? Mir fehlt hier die Information, was die Eingabeargumente sein sollen. In den .mat - Dateien ist jeweils nur 1 Vektor mit 100 Werten enthalten - was soll man damit anfangen?
Und: selbst wenn geklärt ist, was die Eingabeargumente sein sollen: was sollen die Ausgabe sein? Gibt es eine einigermaßen einfache Möglichkeit (z.B. Plot) zu sehen, ob die Ausgabe annähernd richtig ist?

Ich habe nun zwei Versionen der Datei angehängt, mit denen ich bei einem Testaufruf mit Zufallszahlen vergleichbare Ergebnisse wie in kregression.m bzw. kr.m bekomme.

Da meine Versionen auf meinem Rechner 8 Sekunden gegenüber 226s bzw. 462s brauchen, würde ich an deiner Stelle versuchen, meine Version zu hinzubekommen, dass sie das macht, was sie soll.

Viele Grüße,
Harald

k_hb_kaccum.m
 Beschreibung:
Version mit ähnlichen Ergebnissen wie deine ursprüngliche Version (nach meiner Vermutung aber nicht korrekt)

Download
 Dateiname:  k_hb_kaccum.m
 Dateigröße:  978 Bytes
 Heruntergeladen:  274 mal
k_hb.m
 Beschreibung:
Version mit ähnlichen Ergebnissen wie Jans Version

Download
 Dateiname:  k_hb.m
 Dateigröße:  961 Bytes
 Heruntergeladen:  283 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Christina

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.10.2012, 15:04     Titel:
  Antworten mit Zitat      
Hallo Jan,

ok ja also der Code ist nicht ganz einfach zu verstehen. Wir können aber davon ausgehen, dass Main, Pricing2, Index, Paths, Payoff1, Payoff2 richtig sind. Das Problem liegt in den beiden von mir implementierten Funktionen: smooothingParameter und Kregression. k und auch kr sind nur zwei verschieden Varianten die eigentlich vom funktionalen her, das gleiche machen sollten. jedoch braucht man für k smoothingParameter2, denn hier werden die verschiedenen h's als Vektor übergeben und nicht als einzelne Skalare.

Also, von der funktionalen Seite muss ich den Kernregressionsschätzer:

 q=\sum_{i=1}^n (K((x-X_i)/h)*Y_i)/ (\sum_{j=1}^n K((x-X_j)/h))

implementieren, wobei K(u)=exp(||u||^2/2) ist. (Dies sind die Gleichungen auf dem image).
Die Funktion smoothingParameter brauche ich, um ein optimales h zu bestimmen.
 
Christina

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.10.2012, 15:39     Titel:
  Antworten mit Zitat      
Hallo Harald,
Zitat:
In kregression.m setzt du K einmalig außerhalb der i-Schleife auf 0, d.h. bei i=2 wird der Wert am Ende der Iteration i = 1 genommen etc.

Das ist auch richtig so, ich habe K nur einmalig null setzten wollen, damit ich es dann in der for Schleife hochzählen kann und dazu immer den jeweils vorherigen Wert von K verwenden kann.

Zitat:
Bei k.m und kr.m wird K in jeder Iteration unabhängig von den vorherigen Iterationen berechnet. Das führt zwangsläufig zu anderen Ergebnissen als bei kregression.m.

Aber warum? Im Prinzip müsste es doch das gleiche sein, ob ich zuerst W(i) ausrechne, also die quadratische Differenz aller Einträge aus x_train mit einem Eintrag aus x_predict, diese dann in dem Vektor W(i) abspeichere und dann aufaddiere um K zu bekommen, oder ob ich zuerst K berechne, indem ich alle quadratischen Differenzen der einzelen Eintrage aufsummiere, und dann das ganze nochmal mache um W zu bestimmen, der Unterschied ist hier ja nur, dass ich für W jeden einzelen Eintrag noch durch K teile, doch das müsste doch egal sein ob ich es an der Stelle mache oder erst wenn ich y_predict ausrechne. Ich muss ehrlich sagen, ich sehe den Unterschied einfach nicht. K wird doch auch (wenn es in der for-Schleife steht) in jeder Iteration von i neu berechnet, genau wie in der Version von Jan auch...

Zitat:
Wie soll pricing2.m aufgerufen werden? Mir fehlt hier die Information, was die Eingabeargumente sein sollen. In den .mat - Dateien ist jeweils nur 1 Vektor mit 100 Werten enthalten - was soll man damit anfangen?
Und: selbst wenn geklärt ist, was die Eingabeargumente sein sollen: was sollen die Ausgabe sein? Gibt es eine einigermaßen einfache Möglichkeit (z.B. Plot) zu sehen, ob die Ausgabe annähernd richtig ist?


pricing2 wird doch von der main methode aufgerufen und diese erstellt aus output einen boxplot.
Die Eingabeargumente sind die falschen gewesen, sorry, dass war das was gespeicht wird, als "values" womit am Schluß dann der Boxplot gebildet wird.
Es gibt keine richtigen Eingabeargumente, nur die Variablen die am Anfang der main Methode gesetzt werden. Der Rest wird dann in pricing mit Hilfe von path erzeugt...

Ich habe dir die Gleichungen nochmal leserlich in einem PDf angehängt. ebenso wie man in der Theorie h bestimmt. angemerkt sei, dass X_i die i-te Zeile aus x_train ist und x eine einzige Zeile aus x_predict ist. Y_i ist iter eintrag aus y_predict.

schätzer.pdf
 Beschreibung:

Download
 Dateiname:  schätzer.pdf
 Dateigröße:  16.71 KB
 Heruntergeladen:  340 mal
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 04.10.2012, 17:02     Titel:
  Antworten mit Zitat      
Hallo,

der Unterschied ist, ob K innerhalb jeder i-Iteration unabhängig berechnet wird, oder ob es zu dem K der vorherigen i-Iterationen dazugezählt wird.

Ich hatte übersehen, dass es noch einen weiteren Beitrag mit weiteren Dateien gibt.

Im Anhang ein Vorschlag. Läuft so bei mir in ca. 1/2 Stunde durch. Ob die Resultate in dem Boxplot nun die sind, die du dir erhoffst, weiß ich natürlich nicht. Man kann da sicher noch kleine Verbesserungen vornehmen.

Wenn nicht, kann ich nur empfehlen, Stück für Stück und am besten mit dem Debugger da durchzugehen.

Und vor allem: du hast dir ja mit k.m wirklich Mühe gemacht. Ich würde nie mehrere Änderungen am Stück machen, sondern immer jede einzelne testen und schauen, ob noch alles passt. Ansonsten stehst du schnell vor der Situation, dass was anderes herauskommt und du keine Ahnung hast wieso.
Ich glaube, ein paar der bsxfun haben hier nicht das gemacht, was sie sollten.

Grüße,
Harald

k_hb.m
 Beschreibung:

Download
 Dateiname:  k_hb.m
 Dateigröße:  1.19 KB
 Heruntergeladen:  287 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite Zurück  1, 2, 3  Weiter

Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.