Matroids Matheplanet Forum Index
Moderiert von mire2
Mathematische Software & Apps » Matlab » emprische Kovarianzfunktion ; Matlab
Autor
Kein bestimmter Bereich J emprische Kovarianzfunktion ; Matlab
vk88
Junior Letzter Besuch: vor mehr als 3 Monaten
Dabei seit: 14.11.2003
Mitteilungen: 17
  Themenstart: 2003-12-05

Guten Abend, ich weiß, dass die Frage im Grunde hier nicht hingehört aber indirekt schon. :-) Vielleicht hilft mir trotzdem jemand. Ich bin nämlich blutjunge Matlab-Anfängerin und habe so meine Probleme. Ich soll eine Funktion zur Berechnung der empirischen Kovarianzfunktion c_xx(k) = 1/N* sum(X_(n+abs(k))*X_n,n=1,N-abs(k)) in Matlab schreiben. Ich weiß, dass es in Matlab bereits eine solche Funktion xcov gibt, aber diese soll nicht verwendet werden. Für die Berechnung sollen die ersten 200 Werte des Vektors x_n=rand(1,1000)  verwendet werden. rand erzeugt einen Vektor mit 1000 gleichverteilten Zufallszahlen im Intervall [0,1]. Ich habe schon eine Menge probiert, bekomme aber nicht das richtige Ergebnis hin. Was geht denn überhaupt genau vor sich, sprich wie lässt sich die Summe interpretieren? Ich hoffe jemand kann und mag mir helfen Viele liebe Grüsse Sandra P.S. Bei der von mir angegebenen empirischen Kovarianzfunktion gehe ich von Mittelwertfreiheit aus, weshalb der Schätzwert des Mittelwertes nicht in der Gleichung auftaucht. [ Nachricht wurde editiert von vk88 am 2003-12-05 20:24 ] [ Nachricht wurde editiert von vk88 am 2003-12-05 20:26 ]


   Profil
vk88
Junior Letzter Besuch: vor mehr als 3 Monaten
Dabei seit: 14.11.2003
Mitteilungen: 17
  Beitrag No.1, vom Themenstarter, eingetragen 2003-12-06

Hallo Forum, hm das ist nun schon das dritte Posting von mir auf das kein User antwortet, :-( liegt es vielleicht an mir? Stelle ich meine Fragen nicht korrekt? Ein meiner Ungeduld sollte es eigentlich nicht liegen. Viele Grüsse Sandra


   Profil
lochi
Senior Letzter Besuch: vor mehr als 3 Monaten
Dabei seit: 19.08.2002
Mitteilungen: 1484
Wohnort: Allgäu
  Beitrag No.2, eingetragen 2003-12-06

Hallo vk88, nein, das liegt nicht an dir. Deine Fragen sind aus dem Bereich Stochastik, und auch dort nicht mehr Grundlagen. Und da gibt es bis jetzt recht wenig Leute auf dem MP, die sich damit gut auskennen. Insbesondere wird nicht jeder Mathematiker Matlab kennen. Wenn du mir aber erklärst, was eine empirische Kovarianz-Funktion ist, insbesondere, was das k in der Formel zu bedeuten hat, dann helfe ich gerne. Ich schlage mich zur Zeit nämlich auch mit Matlab herum. Viele Grüße, Lochi


   Profil
vk88
Junior Letzter Besuch: vor mehr als 3 Monaten
Dabei seit: 14.11.2003
Mitteilungen: 17
  Beitrag No.3, vom Themenstarter, eingetragen 2003-12-06

Hallo Lochi, vielen Dank für deine Antwort. Ich will gerne versuchen es dir zu erklären, bin allerdings selbst noch nicht beliebig fit in der Thematik. Falls ich Fehler in der Erklärung machen sollte, kann mich bestimmt jemand berichtigen! Bei einem stationären Prozess, sind alle Verteilungsfunktionenen unabhängig von der Wahl des Zeitursprunges. Praktisch bedeutet das, dass es gleichgültig ist, ob die Messung einer beliebigen n-Dimensionalen Verteilungsfunktion zu einem früheren oder späteren Zeitpunkt erfolgt. Die Verteilungsfunktion und die zugehörige Dichte hängen also nur von den Zeitdifferenzen zweier Messungen ab, nicht aber vom Zeitpunkt der Messungen. Allgemein gilt dann für die Kovarianzfunktion eines stationären Prozesses c_(xx)(k) = Cov(X(t+k),X(t)) = E(X(t+k)-\mue_x)(X(t)-\mue_x Wäre der Prozess nicht stationär, so ließe sich die Kovarianzfunktion wie folgt berechnen c_(xx)(k) = Cov(X(t_1),X(t_2)) = E(X(t_1)-\mue_x)(X(t_2)-\mue_x In der Praxis, besitzt man häufig nur ungefähre Vorstellungen über Modelle, die die betrachtete Größe beschreiben sollen. So ist die Kovarianzfunktion im allgemeinen unbekannt. Also will man die Kovarianzfunktion aus einer endlich langen Messung einer Realisierung eines z.B. stationären Prozesses schätzen. Für einen diskreten stationären Prozess, bei dem nur Werte diskreter Zeitpunkte vorliegen, lautet ein Schätzer für die oben angegebene Kovarianzfunktion eines stationären Prozesses eben c^^_xx(k) = fdef(1/N* sum((X_(n+abs(k))-X^-)*(X_n-X^-),n=1,N-abs(k)) für abs(k)=1,2,...,N-1;0       sonst) Der Mittelwert in der Gleichung ist ein Schätzer für den Erwartungswert. Ich gehe aber von einer Mittelwertfreiheit aus, weswegen der Schätzer der Kovarianzfunktion zu c^^_xx(k) = fdef(1/N* sum(X_(n+abs(k))*X_n,n=1,N-abs(k)) für abs(k)=1,2,...,N-1;0       sonst) wird. In Abhängigkeit von k wird   c^^_xx(k) als empirische Kovarianzfunktion bezeichnet. Der Parameter k ist also die Zeitverschiebung, die ich oben bereits beschrieben habe. Die Aufgabenstellung lautet nun: "Schreiben sie eine Funktion covfct um die empirische Kovarianzfunktion zu berechnen. Dazu nehmem sie die ersten 200 Werte des Vektors x_n = rand(1,1000). Stellen sie das Ergebnis graphisch dar. Klingt einfach, nur habe ich selbst Schwierigkeiten die Parameter k und N in die Aufgabenstellung einzuordnen. Theoretisch verstehe ich es, aber wie soll ich das nun anwenden? Besteht mein N nun aus allen 1000 Zufallszahlen und meine Zeitverschiebung k läuft von 1 bis 200? Wenn ich aber tatsächlich nur 200 Werte betrachte, ist N dann gleich k? Fragen über Fragen. Ich hoffe, ich konnte mein Problem ein wenig präzisieren. Viele Grüsse und vielen Dank Sandra    


   Profil
lochi
Senior Letzter Besuch: vor mehr als 3 Monaten
Dabei seit: 19.08.2002
Mitteilungen: 1484
Wohnort: Allgäu
  Beitrag No.4, eingetragen 2003-12-06

Hallo Sandra, gut, jetzt verstehe ich, um was es geht. Man lernt nie aus! Also, ich verstehe die Aufgabe so: Du erzeugst 1000 Zufallszahlen. Von diesen willst du die emp. Kovarianz der Zeitpunkteverschiebungen 1 bis 200 berechnen. Diese sollst du dann graphisch ausgeben. Mein Vorschlag: Schreibe eine Funktion function c = covfct(X, n, k) die die Kovarianz, das ginge dann in etwa so (für einen Spaltenvektor X):
c = (X(k:n)'*X(1:n-k))/N;
wenn k > 0 ist. In deinem Hauptprogramm erzeugst du dir dann den entsprechenden Zufallsvektor und wertest (z.B. mit einer for-Schleife) diese Funktion für k=1 bis k=200 aus. Und anschließend zeichnest du die Ergebnisse (plot-Funktion) Kommst du damit schon mal weiter? Viele Grüße, Lochi



   Profil
vk88
Junior Letzter Besuch: vor mehr als 3 Monaten
Dabei seit: 14.11.2003
Mitteilungen: 17
  Beitrag No.5, vom Themenstarter, eingetragen 2003-12-07

Hallo Lochi, danke für die Mühe. Ich verstehe deine Zeile nicht ganz. Wäre Klasse, wenn du sie mir ganz genau erklären könntest und was du dir dabei gedacht hast. Vielen Dank und viele Grüsse Sandra


   Profil
lochi
Senior Letzter Besuch: vor mehr als 3 Monaten
Dabei seit: 19.08.2002
Mitteilungen: 1484
Wohnort: Allgäu
  Beitrag No.6, eingetragen 2003-12-07

Hallo vk88, wie gut kennst du dich mit Matlab schon aus? Kennst du den (für fast alles brauchbaren) :-Operator? Was wir ausrechnen wollen, ist die Summe X_(1+k)*X_1+X_(2+k)*X_2+...+X_N*X_(N-k) Dies ist aber gleich dem Skalarprodukt des Vektors, der nur aus den Komponenten 1+k bis N von X besteht, mit dem Vektor, der nur aus den Komponenten 1 bis N-k besteht. In Matlab lässt sich dies mit der Matrixmultiplikation schreiben (Zeilenvektor mal Spaltenvektor ergibt Skalarprodukt): X(k+1:N)'*X(1:N-k) (oben ist noch ein Tippfehler drin!) Wenn X also ein Spaltenvektor ist, dann macht die Zeile folgendes: X(k+1:N) = Bilde den Spaltenvektor aus den Komponenten k+1 bis N von X ' Transponiere ihn. * und matrixmultipliziere ihn mit X(1:N-k) dem Spaltenvektor aus den Komponenten 1 bis N-k von X Jetzt musst du nur noch durch N teilen, um den gewünschten Wert der emp. Covarianzfunktion zu erhalten. Du kannst das natürlich auch mit einer ganz gewöhnlichen for-Schleife rechnen, allerdings macht das in Matlab von der Laufzeit ganze Größenordnungen aus. Jetzt alles klar? Viele Grüße, Lochi


   Profil
vk88
Junior Letzter Besuch: vor mehr als 3 Monaten
Dabei seit: 14.11.2003
Mitteilungen: 17
  Beitrag No.7, vom Themenstarter, eingetragen 2003-12-07

Hallo Lochi, danke für deine Erklärung. Ich muß mich erst daran gewöhnen, dass Matlab ein Matrizenprogramm ist :-). Deine Lösung leuchtet mir vollkommen ein, aber trotz allem stimmt etwas nicht. Ich will versuchen dir zu erläutern warum. Zunächst einmal der Code den ich dank deiner Tips geschrieben habe: function c_xx = covfct(x_n,k)          for j=1:k            h_xx(j) = x_n(1+j:length(x_n))'*x_n(1:length(x_n)-j);          end          c_xx = (1/length(x_n))*h_xx Dann ein Hauptprogramm: clear all close all rand('seed',0) x_n = rand(200,1); k = 200; c_xx = covfct(x_n,k); subplot(2,1,1) plot(c_xx) subplot(2,1,2) z = xcov(x_n); plot(z) Ich habe also nur einen Vektor mit 200 Elementen erzeugt und darauf die covfct angewandt. Anschließend habe ich die von Matlab bereitgestellte Funktion xcov verwendet, da man die Ergebnisse der eigenen Funktion mit der Matlab-Funktion vergleichen sollte. Was mir nicht einleuchtet ist, xcov erzeugt, obwohl der Vektor x_n nur 200 Elemente enthält, einen Ergebnisvektor mit 399 Elementen. Für  unsere Funktion enthält der Ergebnisvektor c_xx lediglich 200 Elemente, was auch logisch erscheint. Wenn du Lust hast, kannst du dir die Lösung gerne mal unter folgendem Link anschauen http://www.sth.ruhr-uni-bochum.de/de/index.html dann links auf "Lehre" klicken, dann auf "Pratika" --> "Lösungen Matlab Pratikum" dann "P1-Zufallszahlen,Zufallsvariablen" und weiter unten findest du dann unter "Empirische Kovarianzfunktion" den Lösungsplot. (der für die modifizierte ist erstmal uninteressant) Vergleicht man den Plot selbst mit dem von xcov erzeugten, so sind die Amplitudenwerte aus meinem Programm sehr viel höher und der mit covfct erzeugte Plot entspricht der Lösung in keiner Weise. Hm, ich bin ratlos. Vielleicht hast du ja noch einmal Lust mir zu helfen, ich bin dir sehr dankbar. Gruss  Sandra [ Nachricht wurde editiert von vk88 am 2003-12-07 13:33 ]


   Profil
lochi
Senior Letzter Besuch: vor mehr als 3 Monaten
Dabei seit: 19.08.2002
Mitteilungen: 1484
Wohnort: Allgäu
  Beitrag No.8, eingetragen 2003-12-07

Hallo Sandra, so weit ich es sehe, sollte deine Kovarianzfunktion stimmen. (Ich habe bei mir daheim leider kein Matlab, um es ausprobieren zu können). Wenn du dir dagegen den Plot der xcov-Funktion anschaust, siehst du, dass die Skala für die k-Werte von -200 bis +200 geht. Außerdem fällt auf, dass die Darstellung zu k=0 symmetrisch ist. In deiner Funktion dagegen wertest du ja nur für k=1 bis 200 aus. Erinnerst du dich noch and die Betragsstriche in der ursprünglichen Formel? Damit deine Covarianzfunktion das gleiche wie xcov ausspuckt, müsstest du noch folgendes hinter der Schleife hinzufügen: h0=x_n'*x_n; h1=fliplr(h_xx); % wenn h_xx ein Spaltenvektor ist, dann nimm flipud statt fliplr h=[h1 h0 h_xx]; % wenn h_xx ein Spaltenvektor ist, dann nimm [h1;h0;h_xx] In c_xx=... nimmst du dann natürlich statt h_xx h. Probier das mal aus. Deine Amplitudenwerte sollten nicht höher sein, nur sehen sie wahrscheinlich höher aus, weil die Skalierung anders ist. Viele Grüße, Lochi


   Profil
vk88
Junior Letzter Besuch: vor mehr als 3 Monaten
Dabei seit: 14.11.2003
Mitteilungen: 17
  Beitrag No.9, vom Themenstarter, eingetragen 2003-12-08

Hallo Lochi, zunächst einmal danke für deine Hilfe. Das unterschiedliche Aussehen der Plots lag einfach und allein an meiner völlig falschen Annahme, wie ich gestern Abend noch bemerkt habe. Es handelte sich um einen Vektor mit "gleichverteilten" Zufalsszahlen. Von einer Mittelwertfreiheit bei einer Gleichverteilung auszugehen ist natürlich nicht richtig, weshalb der geschätzte Mittelwert doch in meiner empirischen Kovarianzfunktion auftauchen muss (erste Summe). Der Dreiecksverlauf ist dann auch so zu erklären, dass die Kovarianzfunktion im Grunde eine Faltungsoperation durchführt und ein Rechteck mit einem Rechteck gefaltet erzeugt ein Dreieck. :-) Ich habe also wieder mal sehr viel Zeit umsonst gegrübelt. Danke und viele Grüsse Sandra [ Nachricht wurde editiert von vk88 am 2003-12-08 17:22 ]


   Profil
vk88 hat die Antworten auf ihre/seine Frage gesehen.
Das Thema wurde von einem Senior oder Moderator abgehakt.

Wechsel in ein anderes Forum:
 Suchen    
 
All logos and trademarks in this site are property of their respective owner. The comments are property of their posters, all the rest © 2001-2023 by Matroids Matheplanet
This web site was originally made with PHP-Nuke, a former web portal system written in PHP that seems no longer to be maintained nor supported. PHP-Nuke is Free Software released under the GNU/GPL license.
Ich distanziere mich von rechtswidrigen oder anstößigen Inhalten, die sich trotz aufmerksamer Prüfung hinter hier verwendeten Links verbergen mögen.
Lesen Sie die Nutzungsbedingungen, die Distanzierung, die Datenschutzerklärung und das Impressum.
[Seitenanfang]