Toon posts:

[MATLAB/PYTHON] eigenvectors

Pagina: 1
Acties:

Onderwerpen


Anoniem: 67917

Topicstarter
hallo, ik was bezig met een programma vertalen van matlab naar python (scipy), waarbij ik het volgende probleem tegenkom:

In MATLAB wordt er gebruik gemaakt van:

[V,D] = eig(A)
Help

Waarbij mijn A een 4x4 is met :
code:
1
2
3
4
5
6
A:
1.0e-017 *
    0.4412   -0.0000    0.0000    0.0059
   -0.0000   -0.4262    0.1143    0.0000
    0.0000    0.1143    0.4262    0.0000
    0.0059    0.0000    0.0000   -0.4412

En V en D geven:
code:
1
2
3
4
5
V:
   -0.0000    0.0067    0.8652    0.5014
   -0.9914   -0.0025   -0.0655    0.1131
    0.1307    0.0003   -0.4971    0.8578
    0.0026   -1.0000    0.0058    0.0034

code:
1
2
3
4
5
6
D:
1.0e-017 *
   -0.4412         0         0         0
         0   -0.4412         0         0
         0         0    0.4412         0
         0         0         0    0.4412



Nu gebruik ik volgens deze website de functie in PYTHON:

V,D = linalg.eig(A)

Wat mij met dezelfde N de volgende V en D geeft:
code:
1
2
V:
[  4.41238126e-18  -4.41238126e-18  -4.41238126e-18   4.41238126e-18]

code:
1
2
3
4
5
D:
[[ -9.99977427e-01  -6.59161113e-03   1.47423226e-03  -2.52148002e-04]
 [  4.10095667e-08  -1.92151816e-01  -9.67262021e-01   1.30699053e-01]
 [ -2.56309792e-09   2.53309361e-02   1.27514131e-01   9.91422056e-01]
 [ -6.71900741e-03   9.81016093e-01  -2.19413209e-01  -1.27469632e-06]]


Nu valt het me op dat de D van matlab LIJKT op V van python, maar het gaat mij eigenlijk om de waarden van V (matlab), maar python geeft me toch iets anders.
Ik heb alleen de 4e kolom van V (matlab) nodig in python.

Is er iemand die wat licht erop kan schijnen?

@Hieronder: dank je, het resultaat is elke keer hetzelfde in python (en zover ik weet ook in matlab)

[Voor 4% gewijzigd door Anoniem: 67917 op 24-04-2008 10:19]


  • blaataaps
  • Registratie: Juli 2001
  • Niet online
Ik zou aanraden je matrices en vectoren even tussen code- of cmd-tags (of iets anders dat een monospaced font regelt) want zo zijn ze niet te lezen. De V van python en de D van matlab geven inderdaad dezelfde informatie, namelijk de eigenvalues, alleen matlab geeft ze in een diagonaalmatrix en python in een vector.
Helpt het om te zeggen dat eigenvectoren niet uniek zijn (er zijn zelfs oneindig veel)?

  • ravenger
  • Registratie: Juli 2001
  • Laatst online: 26-04-2022
blaataaps schreef op donderdag 24 april 2008 @ 09:57:
Ik zou aanraden je matrices en vectoren even tussen code- of cmd-tags (of iets anders dat een monospaced font regelt) want zo zijn ze niet te lezen. De V van python en de D van matlab geven inderdaad dezelfde informatie, namelijk de eigenvalues, alleen matlab geeft ze in een diagonaalmatrix en python in een vector.
Helpt het om te zeggen dat eigenvectoren niet uniek zijn (er zijn zelfs oneindig veel)?
Daarom is het handig om eigenvectoren altijd te normalizen ;)

  • Sallin
  • Registratie: Mei 2004
  • Niet online
De waardes die je in A hebt gestopt zitten volgens mij akelig dichtbij de standaard nauwkeurigheid van matlab (jouw waardes zijn 1.0e-017 * de waardes in je matrix). Wellicht dat het niet help als je eigenwaardes probeert te trekken uit een matrix die ongeveer uit nullen bestaat.


edit de eps van matlab is 2.2204e-016

help eps geeft:
EPS Spacing of floating point numbers.
D = EPS(X), is the positive distance from ABS(X) to the next larger in
magnitude floating point number of the same precision as X.
X may be either double precision or single precision.
For all X, EPS(X) is equal to EPS(ABS(X)).

[Voor 46% gewijzigd door Sallin op 24-04-2008 15:43]

This too shall pass
Debian | VirtualBox (W7), Flickr


Anoniem: 67917

Topicstarter
Ik weet niet goed wat je bedoelt met EPS, maar de eig() functie gaat in matlab gewoon goed, daar gaat het niet om. Het frustrerende is dat een zelfde functie in een andere taal heel wat anders lijkt te doen. (Gaat tegen me principes in :P)
Maar goed ik zal het nog eens testen met andere waarden, misschien dat tot de -17e niet zo goed gaat in python.

Of misschien heeft iemand een voorbeeld hoe ik de juiste eigenvectors te pakken krijg in python met een omweg. Al wel naar gezocht maar overal vind ik alleen wiskundige uitleg waar ik weinig van begrijp ;)

  • pkuppens
  • Registratie: Juni 2007
  • Laatst online: 16-03 17:26
Anoniem: 67917 schreef op donderdag 24 april 2008 @ 09:48:
hallo, ik was bezig met een programma vertalen van matlab naar python (scipy), waarbij ik het volgende probleem tegenkom:

In MATLAB wordt er gebruik gemaakt van:

[V,D] = eig(A)
Help

Waarbij mijn A een 4x4 is met :
code:
1
2
3
4
5
6
A:
1.0e-017 *
    0.4412   -0.0000    0.0000    0.0059
   -0.0000   -0.4262    0.1143    0.0000
    0.0000    0.1143    0.4262    0.0000
    0.0059    0.0000    0.0000   -0.4412

En V en D geven:
code:
1
2
3
4
5
V:
   -0.0000    0.0067    0.8652    0.5014
   -0.9914   -0.0025   -0.0655    0.1131
    0.1307    0.0003   -0.4971    0.8578
    0.0026   -1.0000    0.0058    0.0034

code:
1
2
3
4
5
6
D:
1.0e-017 *
   -0.4412         0         0         0
         0   -0.4412         0         0
         0         0    0.4412         0
         0         0         0    0.4412



Nu gebruik ik volgens deze website de functie in PYTHON:

V,D = linalg.eig(A)

Wat mij met dezelfde N de volgende V en D geeft:
code:
1
2
V:
[  4.41238126e-18  -4.41238126e-18  -4.41238126e-18   4.41238126e-18]

code:
1
2
3
4
5
D:
[[ -9.99977427e-01  -6.59161113e-03   1.47423226e-03  -2.52148002e-04]
 [  4.10095667e-08  -1.92151816e-01  -9.67262021e-01   1.30699053e-01]
 [ -2.56309792e-09   2.53309361e-02   1.27514131e-01   9.91422056e-01]
 [ -6.71900741e-03   9.81016093e-01  -2.19413209e-01  -1.27469632e-06]]


Nu valt het me op dat de D van matlab LIJKT op V van python, maar het gaat mij eigenlijk om de waarden van V (matlab), maar python geeft me toch iets anders.
Ik heb alleen de 4e kolom van V (matlab) nodig in python.

Is er iemand die wat licht erop kan schijnen?

@Hieronder: dank je, het resultaat is elke keer hetzelfde in python (en zover ik weet ook in matlab)
Je hebt een probleem met je model.
Alle 4 de eigenwaarden zijn in absolute zin gelijk.
Dat betekent dat je eigenvectoren niet uniek zijn, maar een basis vormen voor je eigenruimte.
Er zijn dan meerdere mogelijkheden voor je eigenvectoren, implementatie afhankelijk.

Dan kun je niet eens verwachten dat 2 matlab implementaties dezelfde waarde geven, laat staan matlab en python.

  • pkuppens
  • Registratie: Juni 2007
  • Laatst online: 16-03 17:26
Wat betekent je 4e kolom eigenlijk? Met gelijke eigenwaarden had de 1e of de 3e, of iedere lineaire combinatie ook in de 4e kolom kunnen staan.

Het maakt me trouwens nieuwsgierig naar je achterliggende probleem.
Met 6 jaar wiskunde studie en matlab/lineare algebra als dagelijks werk denk ik wel wat te kunnen helpen.

  • BestTested!
  • Registratie: Oktober 2003
  • Laatst online: 07:11
Anoniem: 67917 schreef op donderdag 24 april 2008 @ 16:46:
Ik weet niet goed wat je bedoelt met EPS, maar de eig() functie gaat in matlab gewoon goed, daar gaat het niet om. Het frustrerende is dat een zelfde functie in een andere taal heel wat anders lijkt te doen. (Gaat tegen me principes in :P)
Maar goed ik zal het nog eens testen met andere waarden, misschien dat tot de -17e niet zo goed gaat in python.

Of misschien heeft iemand een voorbeeld hoe ik de juiste eigenvectors te pakken krijg in python met een omweg. Al wel naar gezocht maar overal vind ik alleen wiskundige uitleg waar ik weinig van begrijp ;)
Wat Sallin denk ik bedoeld ik dat de waardes in je matrix A redelijk dicht bij 0 liggen. Aangezien MatLab rekent met floating points krijg je miniscule afwijkingen. Deze miniscule afwijkingen hebben normaal gezien een verwaarloosbare invloed, maar nu je waardes van A zijn zelf als zo klein, kunnen deze afwijkingen wel degelijk je antwoord beinvloeden. Met deze functie lijkt het inderdaag goed te gaan.


Als je op 'safe' wilt spelen kan je ook je matrix A schalen zodat je waardes 'groter' worden
code:
1
 [V,D] = eig(1e17*A); D=diag(D*1e-17)';


Ik weet niet je matrix A enkel een test is, en of dat je normaal gezien 'grotere' matrices gebruikt, want dan is het misschien aan te raden de functie eigs() te gebruiken. Je matrix A ziet er al behoorlijk sparse uit.
pkuppens schreef op donderdag 24 april 2008 @ 18:07:

Je hebt een probleem met je model.
Alle 4 de eigenwaarden zijn in absolute zin gelijk.
Dat betekent dat je eigenvectoren niet uniek zijn, maar een basis vormen voor je eigenruimte.
Er zijn dan meerdere mogelijkheden voor je eigenvectoren, implementatie afhankelijk.

Dan kun je niet eens verwachten dat 2 matlab implementaties dezelfde waarde geven, laat staan matlab en python.
Probeer eens andere matrix A, deze matrix is wel heel symmetrisch.
code:
1
A = rand(4,4);

Hoe reageert je Python code trouwens op niet-reeele eigenvalues?

Ik ben ook wel benieuwd naar je toepassing, maar dan enkel met 4 jaar MatLab+lineaire algebra kennis :9

Anoniem: 20740

Als je Matlab dezelfde implementatie van BLAS laat gebruiken als Python, zou er wel hetzelfde uit moeten komen. Je kunt dit doen door de environment variabele BLAS_VERSION in te stellen naar de BLAS-library van Python, en Matlab opnieuw op te starten. Beetje afhankelijk van je platform:

code:
1
export BLAS_VERSION /Developer/SDKs/MacOSX10.4u.sdk/usr/lib/libblas.dylib


Je probleem zul je niet oplossen, je zit te dicht tegen machine precision aan te werken (eps = 2.2204e-16 in Matlab).

Anoniem: 20740

BestTested! schreef op donderdag 24 april 2008 @ 20:45:
[...]

Ik weet niet je matrix A enkel een test is, en of dat je normaal gezien 'grotere' matrices gebruikt, want dan is het misschien aan te raden de functie eigs() te gebruiken. Je matrix A ziet er al behoorlijk sparse uit.

[...]
Het lijkt me dat eigs() juist nog meer last heeft van machine precision problemen, omdat het een iteratieve (Arnoldi) methode gebruikt om de eigenwaarden te vinden. Ik vermoed dat eigs() er vrijwel meteen mee stopt met NaNs of een melding dat hij niet convergeert...
Pagina: 1


Tweakers maakt gebruik van cookies

Tweakers plaatst functionele en analytische cookies voor het functioneren van de website en het verbeteren van de website-ervaring. Deze cookies zijn noodzakelijk. Om op Tweakers relevantere advertenties te tonen en om ingesloten content van derden te tonen (bijvoorbeeld video's), vragen we je toestemming. Via ingesloten content kunnen derde partijen diensten leveren en verbeteren, bezoekersstatistieken bijhouden, gepersonaliseerde content tonen, gerichte advertenties tonen en gebruikersprofielen opbouwen. Hiervoor worden apparaatgegevens, IP-adres, geolocatie en surfgedrag vastgelegd.

Meer informatie vind je in ons cookiebeleid.

Sluiten

Toestemming beheren

Hieronder kun je per doeleinde of partij toestemming geven of intrekken. Meer informatie vind je in ons cookiebeleid.

Functioneel en analytisch

Deze cookies zijn noodzakelijk voor het functioneren van de website en het verbeteren van de website-ervaring. Klik op het informatie-icoon voor meer informatie. Meer details

janee

    Relevantere advertenties

    Dit beperkt het aantal keer dat dezelfde advertentie getoond wordt (frequency capping) en maakt het mogelijk om binnen Tweakers contextuele advertenties te tonen op basis van pagina's die je hebt bezocht. Meer details

    Tweakers genereert een willekeurige unieke code als identifier. Deze data wordt niet gedeeld met adverteerders of andere derde partijen en je kunt niet buiten Tweakers gevolgd worden. Indien je bent ingelogd, wordt deze identifier gekoppeld aan je account. Indien je niet bent ingelogd, wordt deze identifier gekoppeld aan je sessie die maximaal 4 maanden actief blijft. Je kunt deze toestemming te allen tijde intrekken.

    Ingesloten content van derden

    Deze cookies kunnen door derde partijen geplaatst worden via ingesloten content. Klik op het informatie-icoon voor meer informatie over de verwerkingsdoeleinden. Meer details

    janee