Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

David_pb

Community-Fossil

  • »David_pb« ist der Autor dieses Themas

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

1

03.03.2010, 20:18

Kovarianzmatrix zu Punktewolke

Hi,

ich steh gerade vor folgendem Problem...

... ich möchte zu einer beliebigen Punktewolke die Kovarianzmatrix bestimmen und sowie deren Eigenvektoren/Eigenwerte.

[Theorie]
Dazu bestimme ich die Kofaktoren der Matrix C_{ij} = Cov(x_i, x_j)=\frac{1}{n} \sum\limits_{k=1}^n (p^{'k}_i p^{'k}_j) wobei p^{'k} = p^k-m also der Vektor zwischen dem Mittel m = E[x] = \frac{1}{n} \sum\limits_{k=1}^n p^k und dem k-ten Punkt der Punktewolke ist.
[/Theorie]

Das liefert mir die (3x3)-Matrix, die auf den ersten Blick den Kriterien genügt (symmetrisch, hauptdiagonale positiv, usw...). Ich bekomme auch immer 3 reelle Eigenwerte aber (Achtung: das Problem) nie entsprechende Eigenvektoren. Zum berechnen der Eigenwerte such ich die Nullstellen vom charakteristischen Polynom und führ dann 3x den Gaussalgorithmus C_e = (C - I\lambda) aus.

Vielleicht seh ich den Wald vor lauter Bäumen ja einfach nicht, aber hat jemand eine Idee warum ich damit die Eigenvektoren nicht geliefert bekomme? Gibt es bei meiner verwendeten Vorgehensweisse bekannte Probleme? Die Eigenwerte scheinen zu stimmen (trace(C) = ev[0] + ev[1] + ev[2] trifft zumindest zu).

Besten Dank,
David

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

2

03.03.2010, 21:31

Wie meinst du das, dass du keine Eigenvektoren bekommst?

Für die Eigenvektoren musst du ja noch, wenn du gegausst hast das hier lösen:
C_ex=0

Und das sollte sofern die vorherigen Berechnungen stimmen auch den zum Eigenwert gehörenden Eigenvektor geben.

Ob die Rechnung stimmt kannst du ja relativ leicht mit Matlab/Octave nachprüfen.

David_pb

Community-Fossil

  • »David_pb« ist der Autor dieses Themas

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

3

03.03.2010, 21:36

Ich meine damit, das C_ex nicht unterbestimmt ist, daher bekomm ich (meißtens) keinen Eigenwert für den entsprechenden Vektor. Natürlich wird bereits versucht das zu lösen.

Black-Panther

Alter Hase

Beiträge: 1 443

Wohnort: Innsbruck

  • Private Nachricht senden

4

04.03.2010, 09:53

Ich weiß nicht, ob du dich hier vertippt hast:

C_e = (C - I\lambda)

oder ich es schlicht falsch interpretiere (was soll der \ bedeuten?). Um aber aus einem gegeben EigenWert den eigenvektor zu bekommen musst du nur das lineare Gleichungssystem (Gauss) lösen:

(C - I3 * lambda) * EV = 0
stillalive studios
Drone Swarm (32.000 Dronen gleichzeitig steuern!)
facebook, twitter

David_pb

Community-Fossil

  • »David_pb« ist der Autor dieses Themas

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

5

04.03.2010, 10:35

Zitat von »"Black-Panther"«

Ich weiß nicht, ob du dich hier vertippt hast:

C_e = (C - I\lambda)

oder ich es schlicht falsch interpretiere (was soll der \ bedeuten?). Um aber aus einem gegeben EigenWert den eigenvektor zu bekommen musst du nur das lineare Gleichungssystem (Gauss) lösen:

(C - I3 * lambda) * EV = 0


Die Ausdrücke sind in Latex-Syntax, dort steht \lambda für... naja, Lambda! ;-)
Wie da Vorgehen funktioniert ist mir klar, das LGS löse ich (wie oben bereits geschrieben). Allerdings scheint die geometrische Vielfachheit in 99% der Fälle 0 zu sein, was nicht sein kann/darf. D.h. ich bekomme die gewünschten (korrekten Eigenwerte) aber aus der Umformung (per Gauss) resultiert nichts Sinnvolles.
Meine Vermutung ist, dass das Vorgehen numerisch zu instabil ist und daher keine sinnvollen Ergebnisse geliefert werden. Ich hab zwar versucht die Umformung zu stabilisieren indem ich pivotisiere, aber das hilft wohl auch nur unzureichend.

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

6

04.03.2010, 11:22

Schonmal einfach testweise ein einfaches Beispiel rausgesucht, bei dem das Berechnen scheitert und mal von Hand (oder mathematica/wolframalpha etc) nachgerechnet?
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

David_pb

Community-Fossil

  • »David_pb« ist der Autor dieses Themas

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

7

04.03.2010, 11:53

Zitat von »"Nox"«

Schonmal einfach testweise ein einfaches Beispiel rausgesucht, bei dem das Berechnen scheitert und mal von Hand (oder mathematica/wolframalpha etc) nachgerechnet?


Der Algorithmus funktioniert für "einfache" Beispiele. Das Problem tritt erst bei der Anwendung auf die berechneten Kovarianzmatrizen auf. Ich schätze mal das Verhalten lässt sich mit Mathematica nicht ohne weiteres simulieren, die rechnen dort mit wesentlich höherer Präzession. Ich hab den Test allerdings mal hier gemacht und bekomme dort ähnliches Fehlverhalten.

Beispielsweisse liefern mir folgende Daten, folgendes Ergebnis:

Quellcode

1
2
3
4
5
6
7
8
8.311852 -0.044869 -1.456249
-0.044869 32.876209 -2.432122
-1.456249 -2.432122 295.864197

Eigenwert => Eigenvektor
295.894073 => -0.005062 -0.009246 0.999944
8.304287 => 0.000000 0.000000 0.000000
32.853882 => 0.000000 0.000000 0.000000

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

8

04.03.2010, 14:41

Naja ich schlug mathematica vor, WEIL es wahrscheinlich sehr präzise ist und man so ggf. vergleichen kann.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

David_pb

Community-Fossil

  • »David_pb« ist der Autor dieses Themas

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

9

04.03.2010, 14:56

Zitat von »"Nox"«

Naja ich schlug mathematica vor, WEIL es wahrscheinlich sehr präzise ist und man so ggf. vergleichen kann.


Dafür müsste ich erstmal ein brauchbares Ergebnis bekommen. Ich weiß ja das die Matrix genau 3 Eigenvektoren haben muss. Vergleichen kann ich dann immer noch! ;)

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

10

04.03.2010, 15:51

Naja gut, aber wenn wir dir helfen sollen, brauchen wir schon ein paar infos mehr. Ggf. algorithmus etc. Grundidee scheint ja zu passen.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Werbeanzeige