\(\newcommand{L}[1]{\| #1 \|}\newcommand{VL}[1]{\L{ \vec{#1} }}\newcommand{R}[1]{\operatornaam{ Re}\,(#1)}\nieuwcommando{I}[1]{\operatornaam{Im}\, (#1)}\)
Derangvan een matrix is het aantal onafhankelijke rijen en/of kolommen van een matrix.
We zullen binnenkort definiëren wat we bedoelen met het woordonafhankelijk.
Voor een matrix met meer kolommen dan rijen is dit het aantal onafhankelijke rijen.
Voor een matrix met meer rijen dan kolommen, zoals een ontwerpmatrix, is dit het aantal onafhankelijke kolommen.
In feite vertelt lineaire algebra ons dat het onmogelijk is om meer onafhankelijke kolommen te hebben dan rijen, of meer onafhankelijke rijen dan kolommen. Probeer het eens met enkele testmatrices.
Een kolom isafhankelijkop andere kolommen als de waarden in de kolom kunnen worden gegenereerd door een gewogen som van een of meer andere kolommen.
Om dit formeler te zeggen: laten we zeggen dat we een matrix hebben\(\mathbf{X}\)met\(M\)rijen en\(N\)kolommen. Schrijf kolom\(i\)van\(\mathbf{X}\)als\(X_{:,i}\). Kolom\(i\)isonafhankelijkvan de rest van\(\mathbf{X}\)als er geen lengte is\(N\)kolomvector van gewichten\(\ding{c}\), waar\(c_i = 0\), zoals dat\(\mathbf{X}\cdot \vec{c} = X_{:,i}\).
Laten we een ontwerp maken met onafhankelijke kolommen:
>>>#: Standaard import>>>importeren onnozel als np>>># Maak numpy print 4 significante cijfers voor schoonheid>>>np.set_printopties(precisie=4, onderdrukken=WAAR)>>>importeren matplotlib.pyplot als plt>>># Standaard naar interpolatie van de dichtstbijzijnde buur, grijze kleurenkaart>>>importeren matplotlib>>>matplotlib.rcParams['beeld.interpolatie'] = 'dichtstbijzijnde'>>>matplotlib.rcParams['afbeelding.cmap'] = 'grijs'
Tip
Als u in de IPython-console draait, overweeg dan om te rennen%matplotlib
om interactieve plots in te schakelen. Als u in de Jupyter Notebook draait, gebruikt u%matplotlibin lijn
.
>>>tendens = np.linspatie(0, 1, 10)>>>X = np.degenen((10, 3))>>>X[:, 0] = tendens>>>X[:, 1] = tendens ** 2>>>plt.imshow(X)<...>
In dit geval kan er geen kolom worden gegenereerd door een gewogen som van de andere twee. We kunnen dit testen metnp.linalg.matrix_rank
:
>>>importeren numpy.linalg als nl>>>nl.matrix_rang(X)3
Dit betekent niet dat de kolommen orthogonaal zijn:
>>># Orthogonale kolommen hebben puntproducten van nul>>>X.T.punt(X)matrix([[ 3.5185, 2.7778, 5. ],[ 2.7778, 2.337, 3.5185],[ 5. , 3.5185, 10. ]])
Het betekent ook niet dat de kolommen geen correlatie hebben (zieCorrelatie en projectievoor de relatie tussen correlatie en het puntproduct van de vector):
>>>np.corrcoef(X[:,0], X[:, 1])matrix([[ 1. , 0.9627],[ 0.9627, 1. ]])
Zolang elke kolom dat niet kan zijngeheelvoorspeld door de anderen, is de colonne onafhankelijk.
Laten we nu een vierde kolom toevoegen die een gewogen som is van de eerste drie:
>>>X_not_full_rank = np.nullen((10, 4))>>>X_not_full_rank[:, :3] = X>>>X_not_full_rank[:, 3] = np.punt(X, [-1, 0,5, 0,5])>>>plt.imshow(X_not_full_rank)<...>
matrix_rang
is aan het werk:
>>>nl.matrix_rang(X_not_full_rank)3
Een meer typische situatie met ontwerpmatrices is dat we enkele kolommen met dummyvariabelen hebben die coderen voor groepslidmaatschap, wat neerkomt op een kolom met enen.
>>>dummy's = np.kroon(np.oog(3), np.degenen((4, 1)))>>>plt.imshow(dummy's)<...>
Tot nu toe, zo goed:
>>>nl.matrix_rang(dummy's)3
Als we een kolom met enen toevoegen om het gemiddelde te modelleren, hebben we nu een extra kolom die een lineaire combinatie is van andere kolommen in het model:
>>>dummies_with_mean = np.hstapel((dummy's, np.degenen((12, 1))))>>>plt.imshow(dummies_with_mean)<...>
>>>nl.matrix_rang(dummies_with_mean)3
Een matrix isvolledige rangals de matrixrang gelijk is aan het aantal kolommen / rijen. Dat wil zeggen, een matrix is een volledige rang als alle kolommen (of rijen) onafhankelijk zijn.
Als een matrix geen volledige rang heeft, dan is het dat welrang tekort.