|
Autor |
emprische Kovarianzfunktion ; Matlab |
|
vk88
Junior  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  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  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  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  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  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  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  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  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  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. |
|
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]
|