22.1 Geometrija ir tiesinės algebros operacijos

2.3 skyrelis susipažinome su tiesinės algebros pagrindais ir matėme, kaip ją galima naudoti įprastoms duomenų transformavimo operacijoms išreikšti. Tiesinė algebra yra vienas pagrindinių matematinių ramsčių, slypinčių po didele dalimi darbo, kurį atliekame giliajame mokyme ir plačiau – mašininiame mokyme. Nors 2.3 skyrelis buvo pakankamai priemonių, kad perteiktume šiuolaikinių giliojo mokymosi modelių veikimo mechaniką, šioje temoje yra daug daugiau. Šiame skyriuje pasigilinsime, išryškindami kai kurias geometrines tiesinės algebros operacijų interpretacijas ir pristatydami keletą pagrindinių sąvokų, įskaitant tikrines reikšmes ir tikrinius vektorius.

22.1.1 Vektorių geometrija

Pirmiausia turime aptarti dvi įprastas geometrines vektorių interpretacijas – kaip taškus arba kryptis erdvėje. Iš esmės vektorius yra skaičių sąrašas, pavyzdžiui, toliau pateiktas Python sąrašas.

v = [1, 7, 0, 1]

Matematikai dažniausiai tai užrašo kaip stulpelio arba eilutės vektorių, t. y. kaip

x=[1701],\mathbf{x} = \begin{bmatrix}1\\7\\0\\1\end{bmatrix},

arba

x⊤=[1701].\mathbf{x}^\top = \begin{bmatrix}1 & 7 & 0 & 1\end{bmatrix}.

Jie dažnai turi skirtingas interpretacijas: duomenų pavyzdžiai yra stulpelio vektoriai, o svoriai, naudojami svertinėms sumoms sudaryti, yra eilutės vektoriai. Vis dėlto gali būti naudinga būti lanksčiam. Kaip aprašėme 2.3 skyrelis, nors vieno vektoriaus numatytoji orientacija yra stulpelio vektorius, bet kuriai matricai, vaizduojančiai lentelinį duomenų rinkinį, įprasčiau kiekvieną duomenų pavyzdį matricoje laikyti eilutės vektoriumi.

Turint vektorių, pirmoji interpretacija, kurią turėtume jam suteikti, yra taškas erdvėje. Dviejose ar trijose dimensijose šiuos taškus galime pavaizduoti naudodami vektorių komponentes taškų vietai erdvėje nustatyti palyginti su fiksuotu atskaitos tašku, vadinamu koordinačių pradžia. Tai matyti 22.1.1 pav..

Iliustracija, kaip vektorius pavaizduoti kaip taškus plokštumoje.  Pirmoji vektoriaus komponentė duoda \mathit{x} koordinatę, antroji – \mathit{y} koordinatę.  Aukštesnės dimensijos yra analogiškos, nors daug sunkiau pavaizduojamos.

22.1.1 pav. Iliustracija, kaip vektorius pavaizduoti kaip taškus plokštumoje. Pirmoji vektoriaus komponentė duoda x\mathit{x} koordinatę, antroji – y\mathit{y} koordinatę. Aukštesnės dimensijos yra analogiškos, nors daug sunkiau pavaizduojamos.

Šis geometrinis požiūris leidžia nagrinėti problemą abstraktesniu lygmeniu. Nebesusidūrę su atrodančia neįveikiama problema, tokia kaip paveikslėlių klasifikavimas į kates ar šunis, galime pradėti nagrinėti užduotis abstrakčiai – kaip taškų rinkinius erdvėje – ir įsivaizduoti užduotį kaip būdo atskirti du skirtingus taškų klasterius paiešką.

Lygiagrečiai egzistuoja antras požiūris, kurį žmonės dažnai taiko vektoriams: kaip kryptims erdvėje. Vektorių v=[3,2]⊤\mathbf{v} = [3,2]^\top galime laikyti ne tik tašku, esančiu 33 vienetus į dešinę ir 22 vienetus aukštyn nuo koordinačių pradžios, bet ir pačia kryptimi: žengti 33 žingsnius į dešinę ir 22 žingsnius aukštyn. Šitaip visus vektorius 22.1.2 pav. laikome tuo pačiu.

Bet kurį vektorių galima pavaizduoti kaip rodyklę plokštumoje.  Šiuo atveju kiekvienas nubrėžtas vektorius yra vektoriaus (3,2)^\top atvaizdas.

22.1.2 pav. Bet kurį vektorių galima pavaizduoti kaip rodyklę plokštumoje. Šiuo atveju kiekvienas nubrėžtas vektorius yra vektoriaus (3,2)⊤(3,2)^\top atvaizdas.

Vienas šio poslinkio privalumų yra tas, kad galime vizualiai suprasti vektorių sudėties veiksmą. Visų pirma sekame vieno vektoriaus nurodytas kryptis, o tada sekame kito vektoriaus nurodytas kryptis, kaip matyti 22.1.3 pav..

Vektorių sudėtį galime pavaizduoti pirmiausia sekdami vieną vektorių, o tada kitą.

22.1.3 pav. Vektorių sudėtį galime pavaizduoti pirmiausia sekdami vieną vektorių, o tada kitą.

Vektorių atimtis turi panašią interpretaciją. Nagrinėdami tapatybę u=v+(u−v)\mathbf{u} = \mathbf{v} + (\mathbf{u}-\mathbf{v}), matome, kad vektorius u−v\mathbf{u}-\mathbf{v} yra kryptis, kuri mus nuveda iš taško v\mathbf{v} į tašką u\mathbf{u}.

22.1.2 Skaliarinės sandaugos ir kampai

Kaip matėme 2.3 skyrelis, jei paimame du stulpelio vektorius u\mathbf{u} ir v\mathbf{v}, jų skaliarinę sandaugą galime sudaryti apskaičiuodami:

u⊤v=∑iui⋅vi.(22.1.1)\mathbf{u}^\top\mathbf{v} = \sum_i u_i\cdot v_i. \tag{22.1.1}

Kadangi (22.1.1) yra simetrinė, atkartosime klasikinės daugybos žymėjimą ir rašysime

u⋅v=u⊤v=v⊤u,\mathbf{u}\cdot\mathbf{v} = \mathbf{u}^\top\mathbf{v} = \mathbf{v}^\top\mathbf{u},

kad pabrėžtume faktą, jog sukeitus vektorių tvarką gaunamas tas pats atsakymas.

Skaliarinė sandauga (22.1.1) taip pat turi geometrinę interpretaciją: ji glaudžiai susijusi su kampu tarp dviejų vektorių. Panagrinėkime kampą, parodytą 22.1.4 pav..

Tarp bet kurių dviejų vektorių plokštumoje yra gerai apibrėžtas kampas \theta.  Pamatysime, kad šis kampas glaudžiai susijęs su skaliarine sandauga.

22.1.4 pav. Tarp bet kurių dviejų vektorių plokštumoje yra gerai apibrėžtas kampas θ\theta. Pamatysime, kad šis kampas glaudžiai susijęs su skaliarine sandauga.

Pradžiai panagrinėkime du konkrečius vektorius:

v=(r,0)  and  w=(scos⁡(θ),ssin⁡(θ)).\mathbf{v} = (r,0) \; \textrm{and} \; \mathbf{w} = (s\cos(\theta), s \sin(\theta)).

Vektorius v\mathbf{v} yra ilgio rr ir eina lygiagrečiai xx ašiai, o vektorius w\mathbf{w} yra ilgio ss ir sudaro kampą θ\theta su xx ašimi. Jei apskaičiuosime šių dviejų vektorių skaliarinę sandaugą, matome, kad

v⋅w=rscos⁡(θ)=∥v∥∥w∥cos⁡(θ).\mathbf{v}\cdot\mathbf{w} = rs\cos(\theta) = \|\mathbf{v}\|\|\mathbf{w}\|\cos(\theta).

Atlikę paprastą algebrinį pertvarkymą, galime pertvarkyti narius ir gauti

θ=arccos⁡(v⋅w∥v∥∥w∥).\theta = \arccos\left(\frac{\mathbf{v}\cdot\mathbf{w}}{\|\mathbf{v}\|\|\mathbf{w}\|}\right).

Trumpai tariant, šiems dviem konkretiems vektoriams skaliarinė sandauga kartu su normomis mums pasako kampą tarp dviejų vektorių. Tas pats faktas teisingas ir bendru atveju. Čia neišvesime išraiškos, tačiau jei nagrinėsime ∥v−w∥2\|\mathbf{v} - \mathbf{w}\|^2 užrašymą dviem būdais: vienu su skaliarine sandauga, o kitu geometriškai naudodami kosinusų teoremą, galime gauti pilną ryšį. Iš tiesų bet kuriems dviem vektoriams v\mathbf{v} ir w\mathbf{w} kampas tarp dviejų vektorių yra

θ=arccos⁡(v⋅w∥v∥∥w∥).(22.1.2)\theta = \arccos\left(\frac{\mathbf{v}\cdot\mathbf{w}}{\|\mathbf{v}\|\|\mathbf{w}\|}\right). \tag{22.1.2}

Tai gražus rezultatas, nes niekas skaičiavime neužsimena apie dvi dimensijas. Iš tiesų galime tai naudoti trijose ar trijuose milijonuose dimensijų be jokių problemų.

Kaip paprastą pavyzdį pažiūrėkime, kaip apskaičiuoti kampą tarp vektorių poros:

%matplotlib inline
from d2l import mxnet as d2l
from IPython import display
from mxnet import gluon, np, npx
npx.set_np()

def angle(v, w):
    return np.arccos(v.dot(w) / (np.linalg.norm(v) * np.linalg.norm(w)))

angle(np.array([0, 1, 2]), np.array([2, 3, 4]))
%matplotlib inline
from d2l import torch as d2l
from IPython import display
import torch
from torchvision import transforms
import torchvision

def angle(v, w):
    return torch.acos(v.dot(w) / (torch.norm(v) * torch.norm(w)))

angle(torch.tensor([0, 1, 2], dtype=torch.float32), torch.tensor([2.0, 3, 4]))
%matplotlib inline
from d2l import tensorflow as d2l
from IPython import display
import tensorflow as tf

def angle(v, w):
    return tf.acos(tf.tensordot(v, w, axes=1) / (tf.norm(v) * tf.norm(w)))

angle(tf.constant([0, 1, 2], dtype=tf.float32), tf.constant([2.0, 3, 4]))

Dabar to nenaudosime, tačiau naudinga žinoti, kad vektorius, kurių kampas yra π/2\pi/2 (arba, ekvivalenčiai, 90∘90^{\circ}), vadinsime ortogonaliaisiais. Nagrinėdami aukščiau pateiktą lygtį, matome, kad taip nutinka, kai θ=π/2\theta = \pi/2, o tai tas pats, kas cos⁡(θ)=0\cos(\theta) = 0. Vienintelis būdas tam nutikti yra tada, kai pati skaliarinė sandauga lygi nuliui, ir du vektoriai yra ortogonalūs tada ir tik tada, kai v⋅w=0\mathbf{v}\cdot\mathbf{w} = 0. Tai pasirodys esanti naudinga formulė geometriškai suprantant objektus.

Pagrįsta klausti: kodėl naudinga skaičiuoti kampą? Atsakymas slypi tokioje invariantiškumo rūšyje, kokios tikimės iš duomenų. Panagrinėkime paveikslėlį ir jo dublikatą, kuriame kiekvieno pikselio reikšmė ta pati, bet 10%10\% ryškumo. Pavienių pikselių reikšmės apskritai yra toli nuo pradinių reikšmių. Taigi jei apskaičiuotume atstumą tarp pradinio paveikslėlio ir tamsesnio, atstumas gali būti didelis. Tačiau daugumai MM taikymų turinys yra tas pats – katės / šuns klasifikatoriui tai vis dar katės paveikslėlis. Vis dėlto jei nagrinėsime kampą, nesunku pamatyti, kad bet kuriam vektoriui v\mathbf{v} kampas tarp v\mathbf{v} ir 0,1⋅v0{,}1\cdot\mathbf{v} yra nulis. Tai atitinka faktą, kad vektorių skalėjimas palieka tą pačią kryptį ir tik pakeičia ilgį. Kampas tamsesnį paveikslėlį laiko identišku.

Tokių pavyzdžių yra visur. Tekste galime norėti, kad aptariama tema nepasikeistų, jei parašysime dvigubai ilgesnį dokumentą, sakantį tą patį. Kai kuriems kodavimams (pavyzdžiui, skaičiuojant žodžių pasikartojimus kokiame nors žodyne) tai atitinka dokumentą koduojančio vektoriaus padvigubinimą, taigi vėl galime naudoti kampą.

22.1.2.1 Kosinusinis panašumas

MM kontekstuose, kuriuose kampas naudojamas dviejų vektorių artumui matuoti, praktikai naudoja terminą kosinusinis panašumas daliai

cos⁡(θ)=v⋅w∥v∥∥w∥.\cos(\theta) = \frac{\mathbf{v}\cdot\mathbf{w}}{\|\mathbf{v}\|\|\mathbf{w}\|}.

žymėti.

Kosinusas įgyja didžiausią reikšmę 11, kai du vektoriai rodo ta pačia kryptimi, mažiausią reikšmę −1-1, kai jie rodo priešingomis kryptimis, ir reikšmę 00, kai du vektoriai yra ortogonalūs. Atkreipkite dėmesį, kad jei aukštų dimensijų vektorių komponentės atrenkamos atsitiktinai su vidurkiu 00, jų kosinusas beveik visada bus artimas 00.

22.1.3 Hiperplokštumos

Be darbo su vektoriais, kitas esminis objektas, kurį turite suprasti, norėdami toli nueiti tiesinėje algebroje, yra hiperplokštuma – tiesės (dvi dimensijos) arba plokštumos (trys dimensijos) apibendrinimas aukštesnėms dimensijoms. dd dimensijų vektorinėje erdvėje hiperplokštuma turi d−1d-1 dimensijų ir padalija erdvę į dvi puserdves.

Pradėkime nuo pavyzdžio. Tarkime, turime stulpelio vektorių w=[2,1]⊤\mathbf{w}=[2,1]^\top. Norime žinoti: „kokie yra taškai v\mathbf{v}, kuriems w⋅v=1\mathbf{w}\cdot\mathbf{v} = 1?“ Prisiminę aukščiau pateiktą ryšį tarp skaliarinių sandaugų ir kampų (22.1.2), matome, kad tai ekvivalentu

∥v∥∥w∥cos⁡(θ)=1    ⟺    ∥v∥cos⁡(θ)=1∥w∥=15.\|\mathbf{v}\|\|\mathbf{w}\|\cos(\theta) = 1 \; \iff \; \|\mathbf{v}\|\cos(\theta) = \frac{1}{\|\mathbf{w}\|} = \frac{1}{\sqrt{5}}.

Prisiminę trigonometriją, matome, kad formulė \|\mathbf{v}\|\cos(\theta) yra vektoriaus \mathbf{v} projekcijos į \mathbf{w} kryptį ilgis

22.1.5 pav. Prisiminę trigonometriją, matome, kad formulė ∥v∥cos⁡(θ)\|\mathbf{v}\|\cos(\theta) yra vektoriaus v\mathbf{v} projekcijos į w\mathbf{w} kryptį ilgis

Jei nagrinėsime geometrinę šios išraiškos prasmę, matome, kad tai ekvivalentu teiginiui, jog v\mathbf{v} projekcijos į w\mathbf{w} kryptį ilgis yra tiksliai 1/∥w∥1/\|\mathbf{w}\|, kaip parodyta 22.1.5 pav.. Visų taškų, kuriems tai teisinga, aibė yra tiesė, statmena vektoriui w\mathbf{w}. Jei norėtume, galėtume rasti šios tiesės lygtį ir pamatyti, kad ji yra 2x+y=12x + y = 1 arba, ekvivalenčiai, y=1−2xy = 1 - 2x.

Jei dabar pažiūrėsime, kas nutinka klausiant apie taškų aibę, kuriems w⋅v>1\mathbf{w}\cdot\mathbf{v} > 1 arba w⋅v<1\mathbf{w}\cdot\mathbf{v} < 1, matome, kad tai atvejai, kai projekcijos yra atitinkamai ilgesnės arba trumpesnės nei 1/∥w∥1/\|\mathbf{w}\|. Taigi šios dvi nelygybės apibrėžia abi tiesės puses. Šitaip radome būdą padalyti savo erdvę į dvi puses, kur visi vienoje pusėje esantys taškai turi skaliarinę sandaugą žemiau slenksčio, o kitoje pusėje – aukščiau, kaip matome 22.1.6 pav..

Jei dabar nagrinėsime nelygybės išraiškos versiją, matome, kad mūsų hiperplokštuma (šiuo atveju tiesiog tiesė) padalija erdvę į dvi puses.

22.1.6 pav. Jei dabar nagrinėsime nelygybės išraiškos versiją, matome, kad mūsų hiperplokštuma (šiuo atveju tiesiog tiesė) padalija erdvę į dvi puses.

Aukštesnėse dimensijose istorija labai panaši. Jei dabar paimsime w=[1,2,3]⊤\mathbf{w} = [1,2,3]^\top ir paklausime apie taškus trijose dimensijose, kuriems w⋅v=1\mathbf{w}\cdot\mathbf{v} = 1, gausime plokštumą, statmeną duotam vektoriui w\mathbf{w}. Dvi nelygybės vėl apibrėžia dvi plokštumos puses, kaip parodyta 22.1.7 pav..

Bet kurios dimensijos hiperplokštumos padalija erdvę į dvi puses.

22.1.7 pav. Bet kurios dimensijos hiperplokštumos padalija erdvę į dvi puses.

Nors mūsų gebėjimas vizualizuoti čia baigiasi, niekas netrukdo to daryti dešimtyse, šimtuose ar milijarduose dimensijų. Tai dažnai nutinka galvojant apie išmoktus mašininio mokymo modelius. Pavyzdžiui, tiesinius klasifikavimo modelius, tokius kaip aprašyti 4.1 skyrelis, galime suprasti kaip metodus hiperplokštumoms, skiriančioms skirtingas tikslines klases, rasti. Šiame kontekste tokios hiperplokštumos dažnai vadinamos sprendimų plokštumomis. Dauguma giluminių klasifikavimo modelių baigiasi tiesiniu sluoksniu, paduodamu į softmax, todėl giliojo neuroninio tinklo vaidmenį galima interpretuoti kaip netiesinio įterpinio paiešką, kad tikslines klases būtų galima švariai atskirti hiperplokštumomis.

Kad pateiktume ranka sukurtą pavyzdį, atkreipkite dėmesį, kad galime sukurti pagrįstą modelį mažiems marškinėlių ir kelnių paveikslėliams iš Fashion-MNIST duomenų rinkinio (matytam 4.2 skyrelis) klasifikuoti tiesiog paėmę vektorių tarp jų vidurkių sprendimų plokštumai apibrėžti ir akimis įvertinę grubų slenkstį. Pirmiausia įkelsime duomenis ir apskaičiuosime vidurkius.

# Load in the dataset
train = gluon.data.vision.FashionMNIST(train=True)
test = gluon.data.vision.FashionMNIST(train=False)

X_train_0 = np.stack([x[0] for x in train if x[1] == 0]).astype(float)
X_train_1 = np.stack([x[0] for x in train if x[1] == 1]).astype(float)
X_test = np.stack(
    [x[0] for x in test if x[1] == 0 or x[1] == 1]).astype(float)
y_test = np.stack(
    [x[1] for x in test if x[1] == 0 or x[1] == 1]).astype(float)

# Compute averages
ave_0 = np.mean(X_train_0, axis=0)
ave_1 = np.mean(X_train_1, axis=0)
# Load in the dataset
trans = []
trans.append(transforms.ToTensor())
trans = transforms.Compose(trans)
train = torchvision.datasets.FashionMNIST(root="../data", transform=trans,
                                          train=True, download=True)
test = torchvision.datasets.FashionMNIST(root="../data", transform=trans,
                                         train=False, download=True)

X_train_0 = torch.stack(
    [x[0] * 256 for x in train if x[1] == 0]).type(torch.float32)
X_train_1 = torch.stack(
    [x[0] * 256 for x in train if x[1] == 1]).type(torch.float32)
X_test = torch.stack(
    [x[0] * 256 for x in test if x[1] == 0 or x[1] == 1]).type(torch.float32)
y_test = torch.stack([torch.tensor(x[1]) for x in test
                      if x[1] == 0 or x[1] == 1]).type(torch.float32)

# Compute averages
ave_0 = torch.mean(X_train_0, axis=0)
ave_1 = torch.mean(X_train_1, axis=0)
# Load in the dataset
((train_images, train_labels), (
    test_images, test_labels)) = tf.keras.datasets.fashion_mnist.load_data()

X_train_0 = tf.cast(tf.stack(train_images[[i for i, label in enumerate(
    train_labels) if label == 0]] * 256), dtype=tf.float32)
X_train_1 = tf.cast(tf.stack(train_images[[i for i, label in enumerate(
    train_labels) if label == 1]] * 256), dtype=tf.float32)
X_test = tf.cast(tf.stack(test_images[[i for i, label in enumerate(
    test_labels) if label == 0]] * 256), dtype=tf.float32)
y_test = tf.cast(tf.stack(test_images[[i for i, label in enumerate(
    test_labels) if label == 1]] * 256), dtype=tf.float32)

# Compute averages
ave_0 = tf.reduce_mean(X_train_0, axis=0)
ave_1 = tf.reduce_mean(X_train_1, axis=0)

Gali būti informatyvu išsamiai panagrinėti šiuos vidurkius, todėl nubraižykime, kaip jie atrodo. Šiuo atveju matome, kad vidurkis iš tiesų primena neryškų marškinėlių paveikslėlį.

# Plot average t-shirt
d2l.set_figsize()
d2l.plt.imshow(ave_0.reshape(28, 28).tolist(), cmap='Greys')
d2l.plt.show()
# Plot average t-shirt
d2l.set_figsize()
d2l.plt.imshow(tf.reshape(ave_0, (28, 28)), cmap='Greys')
d2l.plt.show()

Antruoju atveju vėl matome, kad vidurkis primena neryškų kelnių paveikslėlį.

# Plot average trousers
d2l.plt.imshow(ave_1.reshape(28, 28).tolist(), cmap='Greys')
d2l.plt.show()
# Plot average trousers
d2l.plt.imshow(tf.reshape(ave_1, (28, 28)), cmap='Greys')
d2l.plt.show()

Visiškai mašinomis išmoktame sprendime slenkstį išmoktume iš duomenų rinkinio. Šiuo atveju aš tiesiog ranka akimis įvertinau slenkstį, kuris atrodė gerai mokymo duomenims.

# Print test set accuracy with eyeballed threshold
w = (ave_1 - ave_0).T
predictions = X_test.reshape(2000, -1).dot(w.flatten()) > -1500000

# Accuracy
np.mean(predictions.astype(y_test.dtype) == y_test, dtype=np.float64)
# Print test set accuracy with eyeballed threshold
w = (ave_1 - ave_0).T
# '@' is Matrix Multiplication operator in pytorch.
predictions = X_test.reshape(2000, -1) @ (w.flatten()) > -1500000

# Accuracy
torch.mean((predictions.type(y_test.dtype) == y_test).float(), dtype=torch.float64)
# Print test set accuracy with eyeballed threshold
w = tf.transpose(ave_1 - ave_0)
predictions = tf.reduce_sum(X_test * tf.nest.flatten(w), axis=0) > -1500000

# Accuracy
tf.reduce_mean(
    tf.cast(tf.cast(predictions, y_test.dtype) == y_test, tf.float32))

22.1.4 Tiesinių transformacijų geometrija

Per 2.3 skyrelis ir aukščiau pateiktas diskusijas turime tvirtą vektorių, ilgių ir kampų geometrijos supratimą. Tačiau yra vienas svarbus objektas, kurio aptarimą praleidome – tai geometrinis matricomis vaizduojamų tiesinių transformacijų supratimas. Visiškai suvokti, ką matricos gali padaryti transformuodamos duomenis tarp dviejų potencialiai skirtingų aukštų dimensijų erdvių, reikia daug praktikos, ir tai viršija šio priedo aprėptį. Vis dėlto intuiciją galime pradėti kaupti dviejose dimensijose.

Tarkime, turime kokią nors matricą:

A=[abcd].\mathbf{A} = \begin{bmatrix} a & b \\ c & d \end{bmatrix}.

Jei norime ją pritaikyti savavališkam vektoriui v=[x,y]⊤\mathbf{v} = [x, y]^\top, padauginame ir matome, kad

Av=[abcd][xy]=[ax+bycx+dy]=x[ac]+y[bd]=x{A[10]}+y{A[01]}.\begin{aligned} \mathbf{A}\mathbf{v} & = \begin{bmatrix}a & b \\ c & d\end{bmatrix}\begin{bmatrix}x \\ y\end{bmatrix} \\ & = \begin{bmatrix}ax+by\\ cx+dy\end{bmatrix} \\ & = x\begin{bmatrix}a \\ c\end{bmatrix} + y\begin{bmatrix}b \\d\end{bmatrix} \\ & = x\left\{\mathbf{A}\begin{bmatrix}1\\0\end{bmatrix}\right\} + y\left\{\mathbf{A}\begin{bmatrix}0\\1\end{bmatrix}\right\}. \end{aligned}

Tai gali atrodyti kaip keistas skaičiavimas, kuriame kažkas aiškaus tapo šiek tiek neįveikiama. Tačiau tai mums sako, kad galime užrašyti, kaip matrica transformuoja bet kurį vektorių, per tai, kaip ji transformuoja du konkrečius vektorius: [1,0]⊤[1,0]^\top ir [0,1]⊤[0,1]^\top. Tai verta akimirką apmąstyti. Iš esmės begalinę problemą (kas nutinka bet kuriai realiųjų skaičių porai) sumažinome iki baigtinės (kas nutinka šiems konkretiems vektoriams). Šie vektoriai yra bazės pavyzdys, kai bet kurį mūsų erdvės vektorių galime užrašyti kaip šių bazės vektorių svertinę sumą.

Nubraižykime, kas nutinka naudojant konkrečią matricą

A=[12−13].\mathbf{A} = \begin{bmatrix} 1 & 2 \\ -1 & 3 \end{bmatrix}.

Jei pažiūrėsime į konkretų vektorių v=[2,−1]⊤\mathbf{v} = [2, -1]^\top, matome, kad tai 2⋅[1,0]⊤+−1⋅[0,1]⊤2\cdot[1,0]^\top + -1\cdot[0,1]^\top, taigi žinome, kad matrica AA jį nusiųs į 2(A[1,0]⊤)+−1(A[0,1])⊤=2[1,−1]⊤−[2,3]⊤=[0,−5]⊤2(\mathbf{A}[1,0]^\top) + -1(\mathbf{A}[0,1])^\top = 2[1, -1]^\top - [2,3]^\top = [0, -5]^\top. Jei atidžiai pasieksime šią logiką iki galo, tarkime, nagrinėdami visų sveikųjų skaičių porų taškų tinklelį, matome, kad nutinka tai, jog matricos daugyba gali iškreipti, pasukti ir perskalėti tinklelį, tačiau tinklelio struktūra turi išlikti, kaip matote 22.1.8 pav..

Matrica \mathbf{A}, veikianti duotus bazės vektorius.  Atkreipkite dėmesį, kaip kartu su jais perkeliamas visas tinklelis.

22.1.8 pav. Matrica A\mathbf{A}, veikianti duotus bazės vektorius. Atkreipkite dėmesį, kaip kartu su jais perkeliamas visas tinklelis.

Tai svarbiausias intuityvus dalykas, kurį reikia įsisavinti apie matricomis vaizduojamas tiesines transformacijas. Matricos negali iškreipti vienų erdvės dalių kitaip nei kitų. Viskas, ką jos gali padaryti, – paimti pradines mūsų erdvės koordinates ir jas iškreipti, pasukti ir perskalėti.

Kai kurie iškraipymai gali būti stiprūs. Pavyzdžiui, matrica

B=[2−14−2],\mathbf{B} = \begin{bmatrix} 2 & -1 \\ 4 & -2 \end{bmatrix},

suspaudžia visą dvimatę plokštumą į vieną tiesę. Tokių transformacijų atpažinimas ir darbas su jomis yra vėlesnio skyriaus tema, tačiau geometriškai matome, kad tai iš esmės skiriasi nuo aukščiau matytų transformacijų tipų. Pavyzdžiui, matricos A\mathbf{A} rezultatą galima „sulenkti atgal“ į pradinį tinklelį. Matricos B\mathbf{B} rezultatų negalima, nes niekada nežinosime, iš kur atsirado vektorius [1,2]⊤[1,2]^\top – ar iš [1,1]⊤[1,1]^\top, ar iš [0,−1]⊤[0, -1]^\top?

Nors šis vaizdas buvo 2×22\times2 matricai, niekas netrukdo išmoktas pamokas perkelti į aukštesnes dimensijas. Jei paimsime panašius bazės vektorius, pavyzdžiui, [1,0,…,0][1,0, \ldots,0], ir pažiūrėsime, kur matrica juos nusiunčia, galime pradėti jausti, kaip matricos daugyba iškreipia visą erdvę, kad ir kokios dimensijos erdvėje dirbtume.

22.1.5 Tiesinė priklausomybė

Dar kartą panagrinėkime matricą

B=[2−14−2].\mathbf{B} = \begin{bmatrix} 2 & -1 \\ 4 & -2 \end{bmatrix}.

Ji suspaudžia visą plokštumą taip, kad ji telpa vienoje tiesėje y=2xy = 2x. Dabar kyla klausimas: ar yra koks nors būdas tai aptikti žiūrint tiesiog į matricą? Atsakymas – taip, galime. Tegu b1=[2,4]⊤\mathbf{b}_1 = [2,4]^\top ir b2=[−1,−2]⊤\mathbf{b}_2 = [-1, -2]^\top yra du matricos B\mathbf{B} stulpeliai. Prisiminkite, kad viską, ką transformuoja matrica B\mathbf{B}, galime užrašyti kaip matricos stulpelių svertinę sumą: kaip a1b1+a2b2a_1\mathbf{b}_1 + a_2\mathbf{b}_2. Tai vadiname tiesiniu dariniu. Tai, kad b1=−2⋅b2\mathbf{b}_1 = -2\cdot\mathbf{b}_2, reiškia, kad bet kurį šių dviejų stulpelių tiesinį darinį galime užrašyti vien per, tarkime, b2\mathbf{b}_2, nes

a1b1+a2b2=−2a1b2+a2b2=(a2−2a1)b2.a_1\mathbf{b}_1 + a_2\mathbf{b}_2 = -2a_1\mathbf{b}_2 + a_2\mathbf{b}_2 = (a_2-2a_1)\mathbf{b}_2.

Tai reiškia, kad vienas iš stulpelių tam tikra prasme yra perteklinis, nes neapibrėžia unikalios krypties erdvėje. Tai neturėtų pernelyg stebinti, nes jau matėme, kad ši matrica sutraukia visą plokštumą į vieną tiesę. Be to, matome, kad tiesinė priklausomybė b1=−2⋅b2\mathbf{b}_1 = -2\cdot\mathbf{b}_2 tai užfiksuoja. Kad tai būtų simetriškiau tarp dviejų vektorių, užrašysime

b1+2⋅b2=0.\mathbf{b}_1 + 2\cdot\mathbf{b}_2 = 0.

Bendru atveju sakysime, kad vektorių rinkinys v1,…,vk\mathbf{v}_1, \ldots, \mathbf{v}_k yra tiesiškai priklausomas, jei egzistuoja koeficientai a1,…,aka_1, \ldots, a_k, ne visi lygūs nuliui, kad

∑i=1kaivi=0.\sum_{i=1}^k a_i\mathbf{v_i} = 0.

Šiuo atveju galime vieną iš vektorių išreikšti per kokį nors kitų derinį ir taip jį faktiškai paversti pertekliniu. Taigi tiesinė priklausomybė matricos stulpeliuose yra faktas, liudijantis, kad mūsų matrica suspaudžia erdvę į kažkokią žemesnę dimensiją. Jei tiesinės priklausomybės nėra, sakome, kad vektoriai yra tiesiškai nepriklausomi. Jei matricos stulpeliai yra tiesiškai nepriklausomi, suspaudimo nevyksta ir operaciją galima atšaukti.

22.1.6 Rangas

Jei turime bendrą n×mn\times m matricą, pagrįsta klausti, kokios dimensijos erdvę matrica atvaizduoja. Atsakymas bus sąvoka, vadinama rangu. Ankstesniame skyrelyje pastebėjome, kad tiesinė priklausomybė liudija apie erdvės suspaudimą į žemesnę dimensiją, todėl galėsime tai naudoti rango sąvokai apibrėžti. Visų pirma matricos A\mathbf{A} rangas yra didžiausias tiesiškai nepriklausomų stulpelių skaičius tarp visų stulpelių poaibių. Pavyzdžiui, matrica

B=[24−1−2],\mathbf{B} = \begin{bmatrix} 2 & 4 \\ -1 & -2 \end{bmatrix},

turi rank(B)=1\textrm{rank}(B)=1, nes du stulpeliai yra tiesiškai priklausomi, bet nė vienas stulpelis pats savaime nėra tiesiškai priklausomas. Sudėtingesniam pavyzdžiui galime panagrinėti

C=[130−10−1011−10310−123−1−21],\mathbf{C} = \begin{bmatrix} 1& 3 & 0 & -1 & 0 \\ -1 & 0 & 1 & 1 & -1 \\ 0 & 3 & 1 & 0 & -1 \\ 2 & 3 & -1 & -2 & 1 \end{bmatrix},

ir parodyti, kad C\mathbf{C} turi rangą du, nes, pavyzdžiui, pirmieji du stulpeliai yra tiesiškai nepriklausomi, tačiau bet kuris iš keturių trijų stulpelių rinkinių yra priklausomas.

Ši procedūra, kaip aprašyta, yra labai neefektyvi. Ji reikalauja peržiūrėti kiekvieną duotos matricos stulpelių poaibį, todėl potencialiai yra eksponentinė pagal stulpelių skaičių. Vėliau pamatysime skaičiavimo požiūriu efektyvesnį būdą matricos rangui apskaičiuoti, bet kol kas pakanka matyti, kad sąvoka yra gerai apibrėžta, ir suprasti jos prasmę.

22.1.7 Apverčiamumas

Aukščiau matėme, kad dauginimo iš matricos su tiesiškai priklausomais stulpeliais negalima atšaukti, t. y. nėra atvirkštinės operacijos, kuri visada galėtų atkurti įvestį. Tačiau dauginimą iš pilno rango matricos (t. y. kokios nors A\mathbf{A}, kuri yra n×nn \times n matrica su rangu nn) visada turėtume galėti atšaukti. Panagrinėkime matricą

I=[10⋯001⋯0⋮⋮⋱⋮00⋯1].\mathbf{I} = \begin{bmatrix} 1 & 0 & \cdots & 0 \\ 0 & 1 & \cdots & 0 \\ \vdots & \vdots & \ddots & \vdots \\ 0 & 0 & \cdots & 1 \end{bmatrix}.

kuri yra matrica su vienetais išilgai įstrižainės ir nuliais kitur. Tai vadiname vienetine matrica. Tai matrica, kuri pritaikyta palieka mūsų duomenis nepakeistus. Kad rastume matricą, kuri atšaukia tai, ką padarė mūsų matrica A\mathbf{A}, norime rasti matricą A−1\mathbf{A}^{-1}, kad

A−1A=AA−1=I.\mathbf{A}^{-1}\mathbf{A} = \mathbf{A}\mathbf{A}^{-1} = \mathbf{I}.

Jei į tai žiūrėsime kaip į sistemą, turime n×nn \times n nežinomųjų (A−1\mathbf{A}^{-1} elementų) ir n×nn \times n lygčių (lygybė, kuri turi galioti tarp kiekvieno sandaugos A−1A\mathbf{A}^{-1}\mathbf{A} elemento ir kiekvieno I\mathbf{I} elemento), taigi bendru atveju turėtume tikėtis, kad sprendinys egzistuoja. Iš tiesų kitame skyrelyje pamatysime dydį, vadinamą determinantu, kuris turi savybę, kad kol determinantas nelygus nuliui, galime rasti sprendinį. Tokią matricą A−1\mathbf{A}^{-1} vadiname atvirkštine matrica. Pavyzdžiui, jei A\mathbf{A} yra bendroji 2×22 \times 2 matrica

A=[abcd],\mathbf{A} = \begin{bmatrix} a & b \\ c & d \end{bmatrix},

tada matome, kad atvirkštinė yra

1ad−bc[d−b−ca].\frac{1}{ad-bc} \begin{bmatrix} d & -b \\ -c & a \end{bmatrix}.

Galime tai patikrinti pamatydami, kad dauginimas iš atvirkštinės matricos, duotos aukščiau pateikta formule, praktikoje veikia.

M = np.array([[1, 2], [1, 4]])
M_inv = np.array([[2, -1], [-0.5, 0.5]])
M_inv.dot(M)
M = torch.tensor([[1, 2], [1, 4]], dtype=torch.float32)
M_inv = torch.tensor([[2, -1], [-0.5, 0.5]])
M_inv @ M
M = tf.constant([[1, 2], [1, 4]], dtype=tf.float32)
M_inv = tf.constant([[2, -1], [-0.5, 0.5]])
tf.matmul(M_inv, M)

22.1.7.1 Skaitinės problemos

Nors matricos atvirkštinė yra naudinga teorijoje, turime pasakyti, kad dažniausiai praktikoje nenorime problemai spręsti naudoti atvirkštinės matricos. Apskritai yra daug skaitiškai stabilesnių algoritmų tiesinėms lygtims, tokioms kaip

Ax=b,\mathbf{A}\mathbf{x} = \mathbf{b},

spręsti, nei atvirkštinės apskaičiavimas ir dauginimas, kad gautume

x=A−1b.\mathbf{x} = \mathbf{A}^{-1}\mathbf{b}.

Kaip dalyba iš mažo skaičiaus gali lemti skaitinį nestabilumą, taip gali lemti ir matricos, artimos žemo rango, apvertimas.

Be to, įprasta, kad matrica A\mathbf{A} yra retoji, t. y. joje yra tik nedidelis skaičius nenulinių reikšmių. Jei nagrinėtume pavyzdžius, pamatytume, kad tai nereiškia, jog atvirkštinė yra retoji. Net jei A\mathbf{A} būtų 11 milijono kartų 11 milijono matrica su tik 55 milijonais nenulinių elementų (taigi mums reikėtų saugoti tik tuos 55 milijonus), atvirkštinė paprastai turės beveik kiekvieną elementą nenulinį, todėl reikės saugoti visus 1M21\textrm{M}^2 elementų – tai yra 11 trilijonas elementų!

Nors neturime laiko pasinerti iki galo į dygius skaitinius klausimus, dažnai sutinkamus dirbant su tiesine algebra, norime suteikti jums šiek tiek intuicijos, kada elgtis atsargiai, o bendra gera taisyklė – praktikoje vengti apvertimo.

22.1.8 Determinantas

Geometrinis tiesinės algebros požiūris suteikia intuityvų būdą interpretuoti esminį dydį, žinomą kaip determinantas. Panagrinėkime ankstesnį tinklelio vaizdą, bet dabar su paryškinta sritimi (22.1.9 pav.).

Matrica \mathbf{A} vėl iškreipia tinklelį.  Šį kartą noriu ypač atkreipti dėmesį į tai, kas nutinka paryškintam kvadratui.

22.1.9 pav. Matrica A\mathbf{A} vėl iškreipia tinklelį. Šį kartą noriu ypač atkreipti dėmesį į tai, kas nutinka paryškintam kvadratui.

Pažiūrėkite į paryškintą kvadratą. Tai kvadratas, kurio kraštines nusako (0,1)(0, 1) ir (1,0)(1, 0), taigi jo plotas lygus vienam. Kai A\mathbf{A} transformuoja šį kvadratą, matome, kad jis tampa lygiagretainiu. Nėra priežasties, kodėl šio lygiagretainio plotas turėtų būti toks pat, nuo kurio pradėjome, ir iš tiesų čia parodytu konkrečiu atveju

A=[12−13],\mathbf{A} = \begin{bmatrix} 1 & 2 \\ -1 & 3 \end{bmatrix},

tai koordinatinės geometrijos pratimas – apskaičiuoti šio lygiagretainio plotą ir gauti, kad plotas yra 55.

Apskritai, jei turime matricą

A=[abcd],\mathbf{A} = \begin{bmatrix} a & b \\ c & d \end{bmatrix},

atlikę šiek tiek skaičiavimų matome, kad gauto lygiagretainio plotas yra ad−bcad-bc. Šis plotas vadinamas determinantu.

Greitai tai patikrinkime su pavyzdiniu kodu.

import numpy as np
np.linalg.det(np.array([[1, -1], [2, 3]]))
torch.det(torch.tensor([[1, -1], [2, 3]], dtype=torch.float32))
tf.linalg.det(tf.constant([[1, -1], [2, 3]], dtype=tf.float32))

Arūniai tarp mūsų pastebės, kad ši išraiška gali būti lygi nuliui ar net neigiama. Neigiamam nariui tai yra susitarimo klausimas, paprastai priimtas matematikoje: jei matrica apverčia figūrą, sakome, kad plotas neigiamas. Dabar pažiūrėkime, kad kai determinantas lygus nuliui, sužinome daugiau.

Panagrinėkime

B=[24−1−2].\mathbf{B} = \begin{bmatrix} 2 & 4 \\ -1 & -2 \end{bmatrix}.

Jei apskaičiuosime šios matricos determinantą, gausime 2⋅(−2)−4⋅(−1)=02\cdot(-2 ) - 4\cdot(-1) = 0. Atsižvelgiant į aukščiau pateiktą supratimą, tai prasminga. B\mathbf{B} suspaudžia kvadratą iš pradinio paveikslėlio iki atkarpos, kurios plotas lygus nuliui. Ir iš tiesų suspaudimas į žemesnės dimensijos erdvę yra vienintelis būdas gauti nulinį plotą po transformacijos. Taigi matome, kad teisingas toks rezultatas: matrica AA yra apverčiama tada ir tik tada, kai determinantas nelygus nuliui.

Paskutinė pastaba: įsivaizduokite, kad turime bet kokią plokštumoje nubrėžtą figūrą. Galvodami kaip informatikai, galime išskaidyti tą figūrą į mažų kvadratėlių rinkinį, kad figūros plotas iš esmės būtų tiesiog skaidos kvadratų skaičius. Jei dabar transformuosime tą figūrą matrica, kiekvieną iš šių kvadratų nusiųsime į lygiagretainius, kurių kiekvieno plotą duoda determinantas. Matome, kad bet kuriai figūrai determinantas duoda (ženklinį) skaičių, kuriuo matrica perskalėja bet kurios figūros plotą.

Didesnių matricų determinantų skaičiavimas gali būti sunkus, tačiau intuicija ta pati. Determinantas išlieka daugikliu, kuriuo n×nn\times n matricos perskalėja nn dimensijų tūrius.

22.1.9 Tenzoriai ir įprastos tiesinės algebros operacijos

2.3 skyrelis buvo pristatyta tenzorių sąvoka. Šiame skyrelyje giliau panagrinėsime tenzorių sutraukimus (tenzorių atitikmenį matricų daugybai) ir pamatysime, kaip tai gali suteikti vieningą požiūrį į daugelį matricų ir vektorių operacijų.

Su matricomis ir vektoriais žinojome, kaip juos dauginti duomenims transformuoti. Panašų apibrėžimą turime turėti ir tenzoriams, jei jie mums bus naudingi. Pagalvokime apie matricų daugybą:

C=AB,\mathbf{C} = \mathbf{A}\mathbf{B},

arba ekvivalenčiai

ci,j=∑kai,kbk,j.c_{i, j} = \sum_{k} a_{i, k}b_{k, j}.

Šį dėsningumą galime pakartoti tenzoriams. Tenzoriams nėra vieno atvejo, pagal ką sumuoti, kurį galima būtų pasirinkti universaliai, todėl turime tiksliai nurodyti, pagal kuriuos indeksus norime sumuoti. Pavyzdžiui, galėtume nagrinėti

yil=∑jkxijklajk.y_{il} = \sum_{jk} x_{ijkl}a_{jk}.

Tokia transformacija vadinama tenzorių sutraukimu. Ji gali atvaizduoti gerokai lankstesnę transformacijų šeimą nei vien matricų daugyba.

Kaip dažnai naudojamą žymėjimo supaprastinimą, galime pastebėti, kad suma yra tiksliai pagal tuos indeksus, kurie išraiškoje pasitaiko daugiau nei vieną kartą, todėl žmonės dažnai naudoja Einšteino žymėjimą, kai sumavimas netiesiogiai atliekamas pagal visus pasikartojančius indeksus. Tai duoda kompaktišką išraišką:

yil=xijklajk.y_{il} = x_{ijkl}a_{jk}.

22.1.9.1 Įprasti tiesinės algebros pavyzdžiai

Pažiūrėkime, kiek tiesinės algebros apibrėžimų, kuriuos matėme anksčiau, galima išreikšti šiuo suglaustu tenzorių žymėjimu:

  • v⋅w=∑iviwi\mathbf{v} \cdot \mathbf{w} = \sum_i v_iw_i
  • ∥v∥22=∑ivivi\|\mathbf{v}\|_2^{2} = \sum_i v_iv_i
  • (Av)i=∑jaijvj(\mathbf{A}\mathbf{v})_i = \sum_j a_{ij}v_j
  • (AB)ik=∑jaijbjk(\mathbf{A}\mathbf{B})_{ik} = \sum_j a_{ij}b_{jk}
  • tr(A)=∑iaii\textrm{tr}(\mathbf{A}) = \sum_i a_{ii}

Šitaip galime pakeisti begalę specializuotų žymėjimų trumpomis tenzorių išraiškomis.

22.1.9.2 Išraiška kode

Su tenzoriais taip pat galima lanksčiai operuoti kode. Kaip matėme 2.3 skyrelis, tenzorius galime sukurti, kaip parodyta toliau.

# Define tensors
B = np.array([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]])
A = np.array([[1, 2], [3, 4]])
v = np.array([1, 2])

# Print out the shapes
A.shape, B.shape, v.shape
# Define tensors
B = torch.tensor([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]])
A = torch.tensor([[1, 2], [3, 4]])
v = torch.tensor([1, 2])

# Print out the shapes
A.shape, B.shape, v.shape
# Define tensors
B = tf.constant([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]])
A = tf.constant([[1, 2], [3, 4]])
v = tf.constant([1, 2])

# Print out the shapes
A.shape, B.shape, v.shape

Einšteino sumavimas yra realizuotas tiesiogiai. Indeksai, pasitaikantys Einšteino sumavime, gali būti perduodami kaip eilutė, po kurios pateikiami tenzoriai, su kuriais atliekami veiksmai. Pavyzdžiui, norėdami realizuoti matricų daugybą, galime panagrinėti aukščiau matytą Einšteino sumavimą (Av=aijvj\mathbf{A}\mathbf{v} = a_{ij}v_j) ir pašalinti pačius indeksus, gaudami realizaciją:

# Reimplement matrix multiplication
np.einsum("ij, j -> i", A, v), A.dot(v)
# Reimplement matrix multiplication
torch.einsum("ij, j -> i", A, v), A@v
# Reimplement matrix multiplication
tf.einsum("ij, j -> i", A, v), tf.matmul(A, tf.reshape(v, (2, 1)))

Tai labai lankstus žymėjimas. Pavyzdžiui, jei norime apskaičiuoti tai, kas tradiciškai būtų užrašoma kaip

ckl=∑ijbijkailvj.c_{kl} = \sum_{ij} \mathbf{b}_{ijk}\mathbf{a}_{il}v_j.

tai galima realizuoti per Einšteino sumavimą taip:

np.einsum("ijk, il, j -> kl", B, A, v)
torch.einsum("ijk, il, j -> kl", B, A, v)
tf.einsum("ijk, il, j -> kl", B, A, v)

Šis žymėjimas yra skaitomas ir efektyvus žmonėms, tačiau nepatogus, jei dėl kokios nors priežasties tenzorių sutraukimą reikia generuoti programiškai. Dėl šios priežasties einsum siūlo alternatyvų žymėjimą, kiekvienam tenzoriui nurodydamas sveikuosius indeksus. Pavyzdžiui, tą patį tenzorių sutraukimą galima užrašyti ir taip:

np.einsum(B, [0, 1, 2], A, [0, 3], v, [1], [2, 3])
# PyTorch does not support this type of notation.
# TensorFlow does not support this type of notation.

Abu žymėjimai leidžia glaustai ir efektyviai atvaizduoti tenzorių sutraukimus kode.

22.1.10 Santrauka

  • Vektorius geometriškai galima interpretuoti kaip taškus arba kryptis erdvėje.
  • Skaliarinės sandaugos apibrėžia kampo sąvoką savavališkai aukštos dimensijos erdvėms.
  • Hiperplokštumos yra tiesių ir plokštumų apibendrinimai aukštoms dimensijoms. Jos gali būti naudojamos sprendimų plokštumoms, dažnai naudojamoms kaip paskutinis klasifikavimo užduoties žingsnis, apibrėžti.
  • Matricų daugybą geometriškai galima interpretuoti kaip vienodus pagrindinių koordinačių iškraipymus. Jos yra labai ribotas, bet matematiškai tvarkingas vektorių transformavimo būdas.
  • Tiesinė priklausomybė yra būdas pasakyti, kada vektorių rinkinys yra žemesnės dimensijos erdvėje, nei tikėtume (tarkime, turite 33 vektorius, esančius 22 dimensijų erdvėje). Matricos rangas yra didžiausio jos stulpelių poaibio, kuris yra tiesiškai nepriklausomas, dydis.
  • Kai apibrėžta matricos atvirkštinė, matricos apvertimas leidžia rasti kitą matricą, kuri atšaukia pirmosios veikimą. Matricos apvertimas yra naudingas teorijoje, bet praktikoje reikalauja atsargumo dėl skaitinio nestabilumo.
  • Determinantai leidžia išmatuoti, kiek matrica išplečia ar suspaudžia erdvę. Nenulinis determinantas reiškia apverčiamą (neišsigimusią) matricą, o nulinės reikšmės determinantas reiškia, kad matrica neapverčiama (išsigimusi).
  • Tenzorių sutraukimai ir Einšteino sumavimas suteikia tvarkingą ir aiškų žymėjimą daugeliui skaičiavimų, matomų mašininiame mokyme, išreikšti.

22.1.11 Pratimai

  1. Koks yra kampas tarp
v⃗1=[10−12],v⃗2=[3101]?\vec v_1 = \begin{bmatrix} 1 \\ 0 \\ -1 \\ 2 \end{bmatrix}, \qquad \vec v_2 = \begin{bmatrix} 3 \\ 1 \\ 0 \\ 1 \end{bmatrix}?
  1. Teisinga ar klaidinga: [1201]\begin{bmatrix}1 & 2\\0&1\end{bmatrix} ir [1−201]\begin{bmatrix}1 & -2\\0&1\end{bmatrix} yra viena kitos atvirkštinės?
  2. Tarkime, kad plokštumoje nubrėžėme figūrą, kurios plotas 100m2100\textrm{m}^2. Koks bus plotas po figūros transformavimo matrica
[2312].\begin{bmatrix} 2 & 3\\ 1 & 2 \end{bmatrix}.
  1. Kurie iš šių vektorių rinkinių yra tiesiškai nepriklausomi?
  • {(10−1),(21−1),(311)}\left\{\begin{pmatrix}1\\0\\-1\end{pmatrix}, \begin{pmatrix}2\\1\\-1\end{pmatrix}, \begin{pmatrix}3\\1\\1\end{pmatrix}\right\}
  • {(311),(111),(000)}\left\{\begin{pmatrix}3\\1\\1\end{pmatrix}, \begin{pmatrix}1\\1\\1\end{pmatrix}, \begin{pmatrix}0\\0\\0\end{pmatrix}\right\}
  • {(110),(01−1),(101)}\left\{\begin{pmatrix}1\\1\\0\end{pmatrix}, \begin{pmatrix}0\\1\\-1\end{pmatrix}, \begin{pmatrix}1\\0\\1\end{pmatrix}\right\}
  1. Tarkime, turite matricą, užrašytą kaip A=[cd]⋅[ab]A = \begin{bmatrix}c\\d\end{bmatrix}\cdot\begin{bmatrix}a & b\end{bmatrix} su kokiu nors reikšmių a,b,ca, b, c ir dd pasirinkimu. Teisinga ar klaidinga: tokios matricos determinantas visada lygus 00?
  2. Vektoriai e1=[10]e_1 = \begin{bmatrix}1\\0\end{bmatrix} ir e2=[01]e_2 = \begin{bmatrix}0\\1\end{bmatrix} yra ortogonalūs. Kokia sąlyga matricai AA, kad Ae1Ae_1 ir Ae2Ae_2 būtų ortogonalūs?
  3. Kaip galite užrašyti tr(A4)\textrm{tr}(\mathbf{A}^4) Einšteino žymėjimu savavališkai matricai AA?

Diskusijos

Diskusijos

Diskusijos