Re: Laajennusehdotuksia matriisitulkkiin ym.

[vastaus aiempaan viestiin]

Kirjoittaja: Seppo Mustonen
Sähköposti:    -
Päiväys: 22.12.2003 14:04

Simo Puntanen kirjoitti 15.12.2003 12:58 :

> Se vaan on niin, että vaikka Survon suhteen "...sitä saa mitä
> tilaa...", niin silti siinä on jonkinmoinen kynnys ehdottaa niitä
> muutoksia, kun tietää että niissä helposti voi olla Sepolle kova homma
> toteuttaa, eikä yksinkertaisesti "kehtaa" (kai se paras sana on?)
> ottaa juttuja esille.
Onhan se jotenkin mukavaa, että joku sentään säälii näin meikäläistä,
mutta mielellään sitä aina yrittää tehdä jotain.
Simon ehdotukset Survon matriisitulkin lisätoiminnoiksi kiertyvät
etenkin yleistetyn käänteismatriisin (erityisesti ns. Moore-Penrose-
inverssin) ympärille.

Kuten hän toteaa, kyseinen käänteismatriisi on helppo muodostaa
matriisin singulaariarvohajotelman avulla, mutta uskaltaa nyt toivoa,
että se saataisiin Survossa suoraankin muotoa
MAT G=MPINV(A)
olevan komennon avulla.

Jotta nekin näitä keskusteluja seuraavat, jotka eivät riittävästi
tunne matriisilaskentaa, saisivat jonkinlaisen käsityksen siitä,
mistä on kysymys, yritän hiukan selittää taustaa esimerkein.

Tarkastellaan 3 yhtälön ja kolmen tuntemattoman (x1,x2,x3) lineaarista
yhtälöryhmää

    2*x1+5*x2-3*x3=3
(1) 5*x1-8*x2+5*x3=4
    3*x1+2*x2+7*x3=28

Käsin laskettaessa yhtälöryhmä ratkaistaan ns. eliminointimenetelmällä
ratkaisemalla ensin vaikka viimeinen yhtälö x3:n suhteen eli
x3=(28-3*x1-2*x2)/7 ja sijoittamalla tämä x3:n lauseke kahteen
ensimmäiseen yhtälöön. x3 on siis "eliminoitu" ja jäljellä on 2 yhtälön
ja kahden tuntemattoman (x1,x2) lineaarinen yhtälöryhmä. Soveltamalla
tähän vastaavaa menettelyä x2:n osalta päästään yhden tuntemattoman (x1)
lineaariseen yhtälöön, jonka ratkaisun jälkeen saadaan aikaisemmista
sijoituskaavoista lopullinen tulos eli tässä tapauksessa x1=1, x2=2 ja
x3=(28-3*x1-2*x2)/7=3. Ratkaisun voi tarkastaa sijoittamalla x-arvot
yhtälöiden vasemmanpuoleisiin osiin ja toteamalla, että ko. lausekkeet
ovat samanarvoisia oikealla puolella olevien vakioiden (3,4,28) kanssa.

"Matriisikielellä" sama yhtälöryhmä kirjoitetaan lyhyesti muodossa

    AX=C

missä
       | 2  5 -3 |     |x1|     | 3|
    A= | 5 -8  5 |  X= |x2|  C= | 4|
       | 3  2  7 |     |x3|     |28|

eli A on yhtälöryhmän kertoimien muodostama 3x3-matriisi, C on oikean
puolen vakioiden muodostama vektori (3x1-matriisi) ja X tuntemattomien
(x1,x2,x3) vektori.

Muodollisesti yhtälöryhmä ratkaistaan melkein kuten suureet A,X ja C
olisivat lukuja eli

         -1
    X = A  *C    (C kerrotaan siis A:n käänteisarvolla)

A:n käänteisarvo vain tässä yleisemmässä tilanteessa tarkoittaa
A:n käänteismatriisia, jota Survon matriisikielessä merkitään INV(A).

Survon matriisitulkilla lineaarisia yhtälöryhmiä on mahdollista
ratkaista tehokkaamminkin (esim. MAT SOLVE), mutta käänteismatriisin
avulla ratkaisu menee seuraavasti:

MATRIX A ///
2  5 -3
5 -8  5
3  2  7

MATRIX C ///
 3
 4
28

MAT SAVE A       / Matriisin A talletus
MAT SAVE C       / Matriisin C talletus
MAT X=INV(A)*C   / Yhtälöryhmän ratkaisu
MAT LOAD X       / Ratkaisuvektorin tulostus
MATRIX X
INV(A)*C
///             1
  1      1.000000
  2      2.000000
  3      3.000000

INV(A) vastaa A:n "käänteisarvoa" siinäkin mielessä, että esim.

MAT K=A*INV(A)
MAT LOAD K,12.123456789012345,CUR+1
MATRIX K
A*INV(A)
///                       1                  2                  3
  1       1.000000000000000 -0.000000000000000  0.000000000000000
  2       0.000000000000000  1.000000000000000  0.000000000000000
  3       0.000000000000000 -0.000000000000000  1.000000000000000

eli K=I (yksikkömatriisi) vastaten ykköstä reaaliluvuilla.

Kaikilla matriiseilla ei ole kuitenkaan ole käänteismatriisia.

Jos tarkastellaan yhtälöryhmän (1) asemasta seuraavaa

    2*x1+5*x2-3*x3=3
(2) 5*x1-8*x2+5*x3=4
    5*x1-8*x2+5*x3=4

jossa kolmas yhtälö on korvattu toisella, joka siis esiintyy kahdesti,
on selvää, ettei tällä yhtälöryhmällä voi olla yksikäsitteistä
ratkaisua, koska kolmas yhtälö ei anna mitään lisäinformaatiota.

Tämä näkyy teknisesti tarkastelemalla kerroinmatriisin anatomiaa
ns. singulaariarvohajotelman (SVD) avulla

MATRIX A2 /// Tässä on uusi kerroinmatriisi
2  5 -3
5 -8  5
5 -8  5

MATRIX C2 /// ja tässä uusi vakiovektori.
3
4
4

MAT SAVE A2
MAT SAVE C2
MAT SVD OF A2 TO U,D,V / Singulaariarvohajotelman muodostaminen
MAT LOAD D             / Singulaariarvojen tulostus
MATRIX D
Dsvd(A2)
///      sing.val
svd1     15.72724
svd2      4.31903
svd3      0.00000

Matriisille A2 on tehty SVD eli se esitetään kolmen matriisin tulona
A2=U*D*V'
missä U ja V ovat ns. ortogonaalisia matriiseja ja D on lävistäjä-
matriisi, jonka pelkkä lävistäjäosa on matriisitiedostossa D.
Edellä V' tarkoittaa, että V on transponoitu, eli rivit ja sarakkeet
vaihtavat paikkaa. Ortogonaalisuus merkitsee sitä, että U*U'=V*V'=I
eli ortogonaalisen matriisin käänteismatriisi saadaan yksinkertaisesti
transponoimalla.
Singulaariarvohajotelman muodostus (MAT SVD) on esim. matriisin kääntä-
miseen verrattuna aika raskas toimenpide (ei tosin tunnu missään
nykyisillä koneilla kohtuudimensioilla), mutta se lienee turvallisin
tapa tutkia matriisin rakennetta ja avain mitä moninaisimpiin
sovelluksiin.

Se, että ainakin yksi singulaariarvoista (D:n lävistäjäalkioista)
on 0, merkitsee säännöllisyyden menetystä eikä matriisilla voi silloin
olla käänteismatriisia; matriisi on vajaa-asteinen.

Muodollisesti matriisin A2 käänteismatriisi voitaisiin esittää SVD:n
kautta muodossa (Huom. tulon A*B*C inverssi on INV(C)*INV(B)*INV(A))

(3)  INV(A2)=V*INV(D)*U'

ja tässä INV(D) saadaan yksinkertaisesti korvaamalla lävistäjäalkiot
käänteisarvoillaan. Näin ei kuitenkaan voi tehdä, jos yksikin on
nolla, kuten on asian laita äskeisellä A2:lla.

Nyt seuraa ratkaiseva askel eli yleistetyn käänteismatriisin
muodostaminen.
Koska nollia ei voi "kääntää", käännetään vain nollasta poikkeavat
alkiot, minkä Survossa voi tehdä näin: (arvot alle 10^(-14) katsotaan
nolliksi.)
MAT DI=DINV(DV(D),1e-14)
MAT LOAD DI
MATRIX DI
DINV(DV(Dsvd(A2)))
///          svd1     svd2     svd3
svd1     0.063584 0.000000 0.000000
svd2     0.000000 0.231533 0.000000
svd3     0.000000 0.000000 0.000000

ja sovelletaan kaavaa (3) käyttäen INV:in sijasta DINV:iä eli
A2:n yleistetty käänteismatriisi on silloin

MAT A2_INV=V*DI*U'
MAT LOAD A2_INV
MATRIX A2_INV
Vsvd(A2)*DINV(DV(Dsvd(A2)))*Usvd(A2)'
///             1        2        3
  1       0.19636  0.06068  0.06068
  2       0.09103 -0.01712 -0.01712
  3      -0.05072  0.01192  0.01192

Simon ensimmäistä toivomusta noudattaen olen nyt toteuttanut äskeisen
menettelyn suorana komentona

MAT G=MPINV(A2)     / *G~MPINV(A2) 3*3
MAT LOAD G
MATRIX G
MPINV(A2)
///             1        2        3
  1       0.19636  0.06068  0.06068
  2       0.09103 -0.01712 -0.01712
  3      -0.05072  0.01192  0.01192

eli G täsmää äsken vaiheittain laskettuun A_INV-matriisiin. Laskentatapa
on käytännössä sama eli mennään SVD:n kautta. MAT MPINV on sikäli vielä
yleisempi, että sillä voi "kääntää mitä tahansa" eli mm. muitakin kuin
neliömatriiseja.

Katsotaan saatua yhtälöryhmän ratkaisua:
MAT X2=G*C2        / *X2~MPINV(B)*C2 3*1
MAT LOAD X2
MATRIX X2
MPINV(B)*C2
///             1
  1       1.07456
  2       0.13611
  3      -0.05678

Ratkaisu ei ole sama kuin yhtälöryhmälle (1) saatu (1,2,3), mutta
kuitenkin kelvollinen eli yhtälöt (2) toteutuvat mikä nähdään näin:

MAT E=A2*X2-C2
MAT LOAD E,12.12345678901234,CUR+1
MATRIX E
A2*MPINV(B)*C2-C2
///                      1
  1       0.00000000000000
  2      -0.00000000000000
  3      -0.00000000000000

Miksi ei siis saatu sitä "alkuperäistä" ratkaisua?
Yhtälöryhmän (2) ratkaisu ei ole yksikäsitteinen, sillä eliminointi-
menettelyn ensimmäinen vaihe johtaa tässä tapauksessa yleiseen
ratkaisuun

(4) x1=(44-t)/41, x2=(7+25t)/41, x3=t,

missä t voi olla mikä tahansa reaaliluku. Jos valitaan t=3, saadaan
taas alkuperäinen ratkaisu (1,2,3), mutta mitä onkaan nyt saadun
ratkaisun (likim.) X1=1.07456, X2=0.13611, X3=-0.05678 salaisuus?
Se on kaikista mahdollisista ratkaisuista (4) "geometrisesti lyhin"
eli silloin ratkaisuvektorin alkioiden neliösumma on pienin mahdollinen.
Tämä on eräänlaista matematiikan ekonomiaa parhaimmillaan, mitä siis
SVD (ja yleistetty käänteismatriisi) tarjoaa.

Vastaavasti, kun tarkastellaan yhtälöryhmää

    2*x1+5*x2-3*x3=3
    5*x1-8*x2+5*x3=4
    5*x1-8*x2+5*x3=28

jossa kerroinmatriisi on (1):stä ja vakiovektori (2):sta, syntyy risti-
riitainen tilanne: 2 viimeistä yhtälöä eivät voi olla voimassa saman-
aikaisesti.

Yritetään kuitenkin ratkaista se muodollisesti yleistetyn käänteismat-
riisin avulla:

MAT X3=MPINV(A2)*C
MAT LOAD X3
MATRIX X3
MPINV(A2)*C
///             1
  1       2.53099
  2      -0.27482
  3       0.22930

MAT E=A2*X3-C
MAT LOAD E
MATRIX E
A2*MPINV(A2)*C-C
///             1
  1        0.0000
  2       12.0000
  3      -12.0000

Nähdään, että vain ensimmäinen yhtälö toteutuu, mutta jälleen
metematiikan ekonomia toteutuu, sillä nyt "virhevektori" E=(0,12,-12)
on tälle ratkaisulle pienimmän neliösumman mielessä kaikkein lyhin.
Tämän voi päätellä mm. näin: Kahden viimeisen yhtälön vakiotermejä
koskeva ristiriita on kooltaan 28-4=24. Saatu ratkaisu yksinkertaisesti
puolittaa tämän riidan, jolloin E-vektorin alkioiden neliösumma on
pienin mahdollinen.

Puheena ollut matematiikan ekonomia on tässä yleisesti yhteydessä
pienimmän neliösumman keinoon lineaarisessa regressioanalyysissa.
Jos X on selittävien muuttujien matriisi ja y selitettävän muuttujan
vektori, niin yleisesti regressiokertoimet b saadaan suoraan lausekkeena
b=MPINV(X)*y
ja huomattakoon, että tässä X ei enää ole neliömatriisi, vaan siinä
on rivejä yleensä huomattavasti enemmän kuin sarakkeita ja lisäksi
X:n sarakkeet voivat olla lineaarisesti toisistaan riippuvia.
Viimeksi mainitusta vajavaisuudesta seuraa tiettyjä ongelmia mutta
ei laskuteknisiä.

Jos X on täysiasteinen, eli sen kaikki singulaariarvot ovat
positiivisia, MPINV(X) on sama kuin INV(X'X)*X' eli regressiokertoimille
saadaan oppikirjoista tuttu matriisilauseke.
Vajaa-asteisissa tilanteissa tuo tuttu kaava "räjähtää", mutta
MAT MPINV toimii.

Oma "pikku" juttunsa on se, mitä tarkoitetaan "nollalla" singulaari-
arvojen yhteydessä, koska "nollia" ei käännetä. Vaikka teoreettisesti
jollain matriisilla olisi singulaariarvoina tarkkoja nollia, koneen
laskiessa kaksoistarkkudella (noin 16 merkitsevän numeron) nollat
saattavat loksahtaa hieman paikoiltaan.
Näin on viisasta tulkita nolliksi aina tietyn rajan alittavat arvot.
MAT MPINV:issä noudatetaan seuraavaa sääntöä. Jos matriisin A suurin
singulaariarvo on s, nolliksi katsotaan sellaiset singulaariarvot,
jotka ovat pienempiä kuin 10^(-15)*s.
Tätä rajaa käyttäjä voi säädellä antamalla komennon muodossa
MAT G=MPINV(A,eps)
jolloin po. raja on eps*s.

Koska viestini on jo tässä vaiheessa ylipitkä, palaan vielä
Simon muihin toivomuksiin myöhemmin erikseen.
Joka tapauksessa kaikille (jotka ovat jaksaneet tunnollisesti kahlata
läpi tämän litanian) Hyvää Joulua!

-Seppo

Vastaukset:

Survo-keskustelupalstan (2001-2013) viestit arkistoitiin aika ajoin sukrolla, joka automaattisesti rakensi viesteistä (yli 1600 kpl) HTML-muotoisen sivukokonaisuuden. Vuoden 2013 alusta Survo-keskustelua on jatkettu entistäkin aktiivisemmin osoitteessa forum.survo.fi. Tervetuloa mukaan!

Etusivu  |  Keskustelu
Copyright © Survo Systems 2001-2013. All rights reserved.
Updated 2013-06-15.