Das Konzept des ** Eigenwerts ** erscheint in der linearen Algebra. Ich denke, es ist zunächst schwer vorstellbar, aber es ist ein wichtiges Konzept und wird häufig in der Statistik verwendet. Daher möchte ich versuchen, dies zu erklären, indem ich ein Animationsdiagramm als diese Visualisierungsserie schreibe.
Ich werde die Bedeutung eines solchen Graphen verstehen.
Was sind zunächst Eigenwerte und Eigenvektoren? Es ist wie folgt, wenn es durch eine mathematische Formel ausgedrückt wird.
A{\bf x} = \lambda {\bf x}
$ {\ bf x} $ in $ {\ bf x} \ neq {\ bf 0} $, multipliziert mit Matrix A, so dass die Länge $ \ lambda $ mal $ {\ bf x} $ ist Dinge heißen ** Eigenvektoren ** und $ \ lambda $ heißen ** Eigenwerte **. Wer weiß es nicht? ?? ?? Ich bin mir also allein nicht sicher. Ich möchte es sofort mit einer grafischen Erklärung erklären.
Bevor wir die Eigenwerte und Eigenvektoren erklären, werfen wir einen Blick auf die lineare Transformation durch Matrix. Angenommen, die Matrix $ A $ ist eine Matrix, deren Komponenten wie folgt sind.
A =
\left[
\begin{array}{cc}
2 & 1 \\
-0.5 & -1.5 \\
\end{array}
\right]
Zu diesem Zeitpunkt, wenn Sie $ Ax $ berechnen
A{\bf x} = \left[
\begin{array}{cc}
2 & 1 \\
-0.5 & -1.5 \\
\end{array}
\right]
\left[
\begin{array}{cc}
x_1 \\
x_2 \\
\end{array}
\right]
=
\left[
\begin{array}{cc}
2x_1 + x_2 \\
-0.5x_1 - 1.5x_2 \\
\end{array}
\right]
Und wird sein. Wenn $ {\ bf x} = (1, 1) $
A{\bf x} = \left[
\begin{array}{cc}
2 & 1 \\
-0.5 & -1.5 \\
\end{array}
\right]
\left[
\begin{array}{cc}
1 \\
1 \\
\end{array}
\right]
=
\left[
\begin{array}{cc}
2 + 1 \\
-0.5 - 1.5 \\
\end{array}
\right]
=
\left[
\begin{array}{cc}
3 \\
-2 \\
\end{array}
\right]
Wird sein.
Das Multiplizieren der Matrix $ A $ mit $ {\ bf x} = (1, 1) $ ergibt $ (3, -2) $. Um dies zu veranschaulichen,
Mit diesem Gefühl wird der blaue Vektor $ (1, 1) $ gedreht und gedehnt. Ich denke also, dass die Operation des Multiplizierens dieser Matrix als ** "Drehen und Strecken des Vektors" ** angesehen werden kann.
Lassen Sie uns mit dem Python-Code prüfen, ob er auch bei korrekter Berechnung identisch ist. Betrachtet man das Ergebnisdiagramm,
Mit diesem Gefühl ist die blaue Linie, die sich vom Ursprung erstreckt, der (1, 1) -Vektor, aber Sie können sehen, dass sich die rote Linie nach der Konvertierung auf (3, -2) erstreckt. Der Code ist unten.
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
from matplotlib import animation as ani
plt.figure(figsize=(8,8))
n=20
A = [[ 2, 1],
[-0.5,-1.5]]
x = [1, 1]
a = np.dot(A, x) #Ich berechne Axe hier
plt.plot([0, x[0]], [0, x[1]], "b", zorder=100)
plt.plot([0, a[0]], [0, a[1]], "r", zorder=100)
plt.plot([-15,50],[0,0],"k", linewidth=1)
plt.plot([0,0],[-40,40],"k", linewidth=1)
plt.xlim(-1,4)
plt.ylim(-3,2)
plt.show()
Zeichnen Sie auf ähnliche Weise 100 Punkte in einer quadratischen Fläche und transformieren Sie sie mit der Matrix $ A $, um sie in ein paralleles Viereck zu transformieren. Jeder Punkt im blauen Quadrat hat sich zu einem roten parallelen viereckigen Punkt bewegt.
Ich habe es numerisch dargestellt, damit die Entsprechung zwischen den blauen und den roten Punkten leicht verstanden werden kann.
Hier ist der Code zum Zeichnen des obigen Diagramms.
plt.figure(figsize=(10,10))
n=10
xmin = -5
xmax = 35
ymin = -20
ymax = 10
A = [[ 2, 1],
[-0.5,-1.5]]
for i in range(n):
for j in range(n):
x=j
y=i
a = np.dot(A, [x, y])
plt.scatter(x, y, facecolor="b", edgecolors='none', alpha=.7, s=20)
plt.scatter(a[0], a[1], facecolor="r", edgecolors='none', alpha=.7)
plt.plot([xmin,xmax],[0,0],"k", linewidth=1)
plt.plot([0,0],[ymin,ymax],"k", linewidth=1)
plt.xlim(xmin, xmax)
plt.ylim(ymin, ymax)
plt.show()
plt.figure(figsize=(10,10))
n=10
xmin = -5
xmax = 35
ymin = -20
ymax = 10
A = [[ 2, 1],
[-0.5,-1.5]]
for i in range(n):
for j in range(n):
x=j
y=i
a = np.dot(A, [x, y])
loc_adjust = .2 #Anzeigeposition einstellen
plt.text(x-loc_adjust, y-loc_adjust, "%d"%(i*n + j), color="blue")
plt.text(a[0]-loc_adjust, a[1]-loc_adjust, "%d"%(i*n + j), color="red")
plt.plot([xmin,xmax],[0,0],"k", linewidth=1)
plt.plot([0,0],[ymin,ymax],"k", linewidth=1)
plt.xlim(xmin, xmax)
plt.ylim(ymin, ymax)
plt.show()
Basierend auf dem vorherigen Abschnitt wurde die Formel von Eigenwert / Eigenvektor,
A{\bf x} = \lambda {\bf x}
Ist eine Kombination aus A und $ {\ bf x} $, die sich nicht dreht, selbst wenn sie von Matrix A konvertiert wird, sondern sich nur so erstreckt, dass sich nur die Länge ändert, wie in der folgenden Grafik gezeigt. ist.
Lassen Sie uns dies zu einer Animation machen. Bereiten Sie vor der Konvertierung zunächst einen Vektor der Länge 1 (blaue Linie) als Vektor vor und drehen Sie ihn um 360 Grad. Zeichnen Sie jeweils einen Vektor (rote Linie), der durch die Matrix A linear transformiert ist. Die Zeit, in der diese beiden Linien in einer geraden Linie ausgerichtet sind, ist der Zeitpunkt, an dem Eigenwert und Eigenvektor übereinstimmen. Die blaue Linie $ {\ bf x} $ und die rote Linie $ A {\ bf x} $ zeigen in die gleiche Richtung, unterscheiden sich jedoch in der Länge, dh $ A {\ bf x} = \ lambda {\ bf x} $ ist.
Aus Gründen der Klarheit werden die Linien verdickt, wenn sie in einer geraden Linie ausgerichtet sind.
Sie können Eigenwerte und Eigenvektoren mit numpy berechnen, also versuchen wir es.
la, v = np.linalg.eig(A)
print "la",la
print "v",v
Das Ergebnis ist unten.
output
la [ 1.85078106 -1.35078106]
v [[ 0.98904939 -0.28597431]
[-0.1475849 0.95823729]]
Es wurden zwei Eigenwerte $ \ lambda_1 = 1,85078106, \ lambda_2 = -1,35078106 $ und zwei Eigenvektoren $ x_1 = (0,98904939, -0,1475849), x_2 = (-0,28597431, 0,95823729) $ erhalten. Nehmen wir einen Frame der vorherigen Animation heraus und vergleichen Sie ihn. "Original (blau): (-0.989, -0.149)" im Titelteil entspricht fast $ x_1 $. Der leichte Fehler ist auf die grobe Bildrate der Animation zurückzuführen, die mit höheren Raten (höhere Genauigkeit) konsistenter ist. Außerdem "[Länge] rot: 1,849", was auch $ \ lambda_1 $ entspricht: smile:
In zwei Dimensionen ist der Eigenvektor also ein Vektor, in dem sich die Richtung nicht ändert und nur die Länge ändert, wenn Sie einen Vektor in alle Richtungen 360 Grad vom Ursprung versuchen. Der Eigenwert kann als das Verhältnis der Länge des Vektors vor und nach der Umwandlung in den Vektor in diese Richtung bezeichnet werden: erröten:
Ich möchte ein Beispiel geben, in dem Eigenwerte und Eigenvektoren in der Statistik verwendet werden. Schauen Sie sich zunächst dieses Diagramm an.
Der blaue Punkt oben ist eine Darstellung von 1000 Zufallszahlen, die einer zweidimensionalen Normalverteilung folgen. Wenn Sie die Verteilungs-Co-Verteilungsmatrix aus diesen Daten berechnen, erhalten Sie eine 2x2-Matrix. Die Berechnung der Eigenvektoren dieser Matrix ergibt zwei zweidimensionale Eigenvektoren. Wenn Sie zwei davon nebeneinander platzieren, können Sie erneut eine Linie erstellen. Die Grafik der roten Punkte unten ist eine grafische Darstellung der Daten, die durch Anwenden einer Matrix dieser Eigenvektoren auf den Ursprung der Originaldaten erzeugt wurden. Die Konvertierung ist so, als ob die längere Seite der Ellipse durch Drehen horizontal gebracht wurde, ohne die Form der Daten zu ändern. Diese Operation wird in der Tat zu einer Analysemethode, die in der Welt der Statistik als Hauptkomponentenanalyse bezeichnet wird. (Der Artikel, den ich über die Hauptkomponentenanalyse geschrieben habe, ist hier)
Auf diese Weise wird die Idee von Eigenwerten und Eigenvektoren auch im Bereich der Statistik verwendet.
Unten finden Sie den Python-Code für diesen Vorgang.
np.random.seed(0)
xmin = -10
xmax = 10
ymin = -10
ymax = 10
#durchschnittlich
mu = [2,2]
#Mitverteilt
cov = [[3,2.3],[1.8,3]]
#Bivariate Normalverteilungs-Zufallszahlengenerierung
x, y = np.random.multivariate_normal(mu,cov,1000).T
av_x = np.average(x)
av_y = np.average(y)
#Berechnen Sie die Verteilungs-Co-Verteilungsmatrix aus den Daten
S = np.cov(x, y)
print "S", S
#Eigenwert und Eigenvektor berechnen
la, v = np.linalg.eig(S)
print "la", la
print "v", v
#Schieben Sie so, dass der Ursprung in der Mitte liegt
x2 = x - av_x
y2 = y - av_y
#Multiplizieren Sie die Daten, die den Ursprung verschieben, mit einer Matrix, die durch Anordnen von Eigenvektoren erstellt wurde.
a1 = np.array([np.dot(v, [x2[i],y2[i]]) for i in range(len(x))])
#Zeichnen eines Diagramms
plt.figure(figsize=(8, 13))
#Originaldatenplot
plt.subplot(211)
plt.xlim(xmin, xmax)
plt.ylim(ymin, ymax)
plt.scatter(x, y, alpha=0.5, zorder=100)
plt.plot([0, 0], [ymin, ymax], "k")
plt.plot([xmin, xmax], [0, 0], "k")
#Darstellung von Daten multipliziert mit einer Matrix, die durch Anordnen von Eigenvektoren erstellt wurde
plt.subplot(212)
plt.xlim(xmin, xmax)
plt.ylim(ymin, ymax)
plt.scatter(a1[:,0], a1[:,1], c="r", alpha=0.5, zorder=100)
plt.plot([0, 0], [ymin, ymax], "k")
plt.plot([xmin, xmax], [0, 0], "k")
plt.show()
output
S [[ 2.6774093 1.93221432]
[ 1.93221432 3.05844013]]
la [ 0.92634075 4.80950869]
v [[-0.74098708 -0.67151928]
[ 0.67151928 -0.74098708]]
Wenn Sie die Matrixformel von v berechnen, ist sie 1, sodass Sie sehen können, dass sich diese Konvertierung nur dreht und sich die Länge nicht ändert.
Der gesamte Python-Code für diesen Artikel finden Sie hier [https://gist.github.com/matsuken92/47e5bf7b49e01f8a4a9d].
Recommended Posts