[PYTHON] Mathematisches Verständnis der Hauptkomponentenanalyse von Anfang an

Einführung

Dieses Mal habe ich die Hauptkomponentenanalyse erneut studiert, daher werde ich sie zusammenfassen. Ich hatte zuvor die Hauptkomponentenanalyse selbst studiert, aber ich hatte nur das Wissen, den Eigenwertvektor aus der verteilten, gemeinsam verteilten Matrix zu berechnen und die Dimensionen zu komprimieren oder ihn mit Scikit-Learn zu implementieren. Ich wusste jedoch nicht, warum die Achse aus den Eigenwerten der Varianz-Kovarianz-Matrix erhalten werden konnte, und beschloss daher, die Berechnungstheorie von einem rudimentären Punkt aus zusammenzufassen. ~~ (weil ich leicht vergessen kann) ~~ Und schließlich habe ich es mit Python implementiert, basierend auf der Theorie. Bitte bleib bis zum Ende bei mir, wenn du möchtest.

Was ist Hauptkomponentenanalyse? (Übersicht)

Zunächst werde ich kurz die Hauptkomponentenanalyse und den Ablauf erläutern. Die Hauptkomponentenanalyse ist eine Technik zum Komprimieren der Datenabmessungen, um die Anzeige bei großen Abmessungen zu vereinfachen. Wie in der folgenden Abbildung gezeigt, können Sie zweidimensionale Daten in einer Dimension effizient darstellen, wenn Sie eine Achse in eine bestimmte Richtung nehmen und Punkte senkrecht zu dieser Achse ablegen. Natürlich gehen die Informationen verloren, die durch den Abstand zwischen der Achse und dem tatsächlichen Punkt (der von jedem Punkt ausgehenden Linie) gehalten werden. Bestimmen Sie daher die Achse so, dass die Verteilung maximiert wird, damit die Informationen nicht am meisten verloren gehen. (Details später)

スクリーンショット 2020-11-02 18.41.19.png Dieses Mal werden die zweidimensionalen Daten eindimensional gemacht, aber durch Komprimieren der hochdimensionalen Daten auf diese Weise wird es für uns einfacher zu interpretieren und die Genauigkeit der Klassifizierung kann verbessert werden.

Konkretes Beispiel

Betrachten Sie ein konkretes Beispiel. Die Noten von 5 Fächern von 5 Personen

Name Landessprache Gesellschaft Englisch Arithmetik Wissenschaft
A 60 70 70 40 30
B 70 60 80 30 30
C 40 20 30 70 80
D 30 20 40 80 80
E 30 30 30 80 70

Angenommen, es war. ~~ Offensichtlich voreingenommen ... ~~ Grafik ist eine Möglichkeit, über die Tendenzen dieser Menschen nachzudenken. Beim Zeichnen gegen 5-dimensionale Daten ist es jedoch ziemlich schwierig zu veranschaulichen und zu verstehen. Dies wird übrigens wie folgt als 3D-Raum + Farbe (roter Zustand und blauer Zustand) ausgedrückt. スクリーンショット 2020-11-02 18.49.12.png

Ich denke, es ist schwer zu verstehen, was Sie in dieser Grafik sagen. (Dieses Mal gibt es 5 Themen, es gibt also nichts, was Sie nicht verstehen, aber wenn dies eine Sammlung von Daten ist, die Sie nicht verstehen, ist es schwer zu erraten.) Dieses Mal, als ich dies durch die Hauptkomponentenanalyse komprimierte und eine zweidimensionale Figur machte, wurde es wie folgt. スクリーンショット 2020-11-02 17.41.35.png

(PC ist die Hauptkomponente: Hauptkomponente) Wir müssen interpretieren, was jede Achse in den Ergebnissen der Hauptkomponentenanalyse darstellt. In diesem Beispiel scheint PC1 einen hohen Wert für diejenigen zu haben, die in naturwissenschaftlichen Fächern hoch sind, und einen niedrigen Wert für diejenigen, die nicht gut in naturwissenschaftlichen Fächern sind. Daher interpretiere ich, dass PC1 den Grad der Stärke der Wissenschaft anzeigen kann. Es ist PC2, aber ehrlich gesagt kann ich nicht interpretieren, was es bedeutet (ich werde lernen, wie man es ein bisschen mehr interpretiert). Aber schauen wir uns hier den Beitragssatz an. Der Beitragssatz ist der Wert dafür, wie gut jede Achse die Originaldaten erklären kann. Ich werde es früher ausführlich erläutern, aber diesmal ist der Beitragssatz

PC Beitragssatz
PC1 9.518791e-01
PC2 3.441020e-02
PC3 1.275504e-02
PC4 9.556157e-04
PC5 8.271560e-35

Es ist ersichtlich, dass die Komponenten von PC1 95% und PC2 3,4% erklären können. Daher kann PC1 allein möglicherweise die meisten dieser Daten erklären. Dieses Mal sind die Ergebnisse in den Fächern der freien Künste und der Naturwissenschaften voreingenommen, um die Vorstellung zu erleichtern. Auf diese Weise ist die Hauptkomponentenanalyse eine der Analysemethoden, die es einfacher macht, sich Daten mit vielen Dimensionen vorzustellen. Dieses Mal möchte ich diese Hauptkomponentenanalyse erklären, damit selbst eine Person wie ich sie verstehen kann.

Was ist Hauptkomponentenanalyse? (Theorie)

スクリーンショット 2020-11-02 18.41.19.png

Schauen wir uns die Theorie der Hauptkomponentenanalyse genauer an. Die obige Abbildung konvertiert zweidimensionale Daten in neue eindimensionale Daten, wie oben beschrieben. Je größer der Abstand zwischen der Achse und dem Datenpunkt ist, desto mehr Datenverlust wird berücksichtigt. Daher muss die Richtung mit der größten Streuung ermittelt werden. (Die Richtung mit der größten Dispersion ist die erste Hauptkomponente) Um diese Richtung zu finden, muss der Eigenvektor gefunden werden, der dem größten Eigenwert der verteilten, gemeinsam verteilten Matrix entspricht. Ich würde jedoch gerne sehen, warum dies berücksichtigt werden kann.

Betrachten Sie zunächst nur einen Punkt. スクリーンショット 2020-11-03 15.55.49.png

Definieren Sie einen Datenpunkt und einen Achsenvektor wie folgt.

\vec{x}= \left[ \begin{array}{r} x_1 \\\ x_2 \end{array} \right] \\\
\vec{v}= \left[ \begin{array}{r} v_1 \\\ v_2 \end{array} \right] \\\
jedoch\|\vec{v}\|=1 \\\

Dann beträgt die Länge, wenn der Vektor $ \ vec {x} senkrecht zur Achse $ vector $ \ vec {v} $ abgelegt wird

\vec{v}^\mathrm{T}\vec{x}=\left[ \begin{array}{r} v_1 & v_2 \end{array} \right]\left[ \begin{array}{r} x_1 \\\ x_2 \end{array} \right]=v_1 x_1+v_2 x_2

Es wird angezeigt durch.

Nebenbei werde ich bestätigen, dass die Länge durch $ \ vec {v} ^ \ mathrm {T} \ vec {x} $ angegeben wird. Ich hoffe, Sie können nur diejenigen sehen, die interessiert sind. Definieren Sie zunächst den Vektor $ \ vec {a} $, der der Vektor $ \ vec {a} $ und der um $ \ theta $ gedrehte Vektor $ \ vec {a} $ ist, wie folgt. ![Screenshot 2020-11-03 23.43.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/707273/2b70d0bc-cf7a-700c-615a -81cc7c8e9aef.png)

\vec{a}= \left[ \begin{array}{r} a_1 \\\ a_2 \end{array} \right] \vec{b}= \left[ \begin{array}{r} b_1 \\\ b_2 \end{array} \right]=\left[ \begin{array}{r} cos\theta&-sin\theta \\\ sin\theta & cos\theta \end{array} \right]\left[ \begin{array}{r} a_1 \\\ a_2 \end{array} \right]

Grundsätzlich wird es mit dem Vektor $ \ vec {a} $ multipliziert

\left[ \begin{array}{r} cos\theta&-sin\theta \\\ sin\theta & cos\theta \end{array} \right]

Ist eine Matrix, die den Vektor $ \ vec {a} $ um $ \ theta $ dreht. Der Grund, warum sich die Transformation in dieser Matrix dreht, kann durch den Additionssatz bewiesen werden.

Beweis durch den Additionssatz ![Screenshot 2020-11-04 17.01.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/707273/08fa4b94-33c7-ed1a- 2648-2d93a92e7141.png) Wenn die Länge des Vektors r ist, werden der Vektor $ \ vec {a} $ und der Vektor $ \ vec {b} $ wie folgt ausgedrückt.

\vec{a}= \left[ \begin{array}{r} rcos\alpha \\\ rsin\alpha \end{array} \right] \vec{b}= \left[ \begin{array}{r} rcos(\alpha + \theta) \\\ rsin(\alpha + \theta) \end{array} \right]=\left[ \begin{array}{r} rcos(\alpha)cos(\theta) - rsin(\alpha)sin(\theta) \\\ rsin(\alpha)cos(\theta)+rcos(\alpha)sin(\theta) \end{array} \right]=\left[ \begin{array}{r} cos\theta&-sin\theta \\\ sin\theta & cos\theta \end{array} \right]\left[ \begin{array}{r} rcos(\alpha) \\\ rsin(\alpha) \end{array} \right]=\left[ \begin{array}{r} cos\theta&-sin\theta \\\ sin\theta & cos\theta \end{array} \right]\vec{a}

Deshalb ist es bewiesen.

Der Beweis ist, dass der Vektor $ \ vec {b} $ dieselbe Länge haben sollte, wenn er vertikal entlang des Vektors $ \ vec {a} $ abgelegt wird.

\|\vec{b}\|cos\theta=\vec{v}^\mathrm{T}\vec{b}

Wird angezeigt. Weil der Vektor $ \ vec {v} $ in die gleiche Richtung wie der Vektor $ \ vec {a} $ weist und eine Größe von 1 hat.

\vec{v}=\frac{1}{\sqrt{a_1^2+a_2^2}}\vec{a}

. Deshalb

\vec{v}^\mathrm{T}\vec{b}=\frac{1}{\sqrt{a_1^2+a_2^2}}\left[ \begin{array}{r} a_1 & a_2 \end{array} \right]\left[ \begin{array}{r} b_1 \\\ b_2 \end{array} \right] \quad\ =\frac{1}{\sqrt{a_1^2+a_2^2}}\left[ \begin{array}{r} a_1 & a_2 \end{array} \right]\\left[ \begin{array}{r} cos\theta&-sin\theta \\\ sin\theta & cos\theta \end{array} \right]\left[ \begin{array}{r} a_1 \\\ a_2 \end{array} \right] \quad\ =\frac{1}{\sqrt{a_1^2+a_2^2}}\left[ \begin{array}{r} a_1 & a_2 \end{array} \right]\left[ \begin{array}{r} a_1cos\theta-a_2sin\theta \\\ a_1sin\theta+a_2cos\theta \end{array} \right] \quad\ =\frac{1}{\sqrt{a_1^2+a_2^2}}(a_1^2cos\theta-a_1a_2sin\theta+a_1a_2sin\theta+a_2^2cos\theta) \quad\ =\frac{1}{\sqrt{a_1^2+a_2^2}}(a_1^2+a_2^2)cos\theta \quad\ =\sqrt{a_1^2+a_2^2}cos\theta \quad\ =\|\vec{b}\|cos\theta

Ermitteln Sie daher die Länge, wenn der Vektor $ \ vec {x} $ vertikal auf den Vektor $ \ vec {v} von $ \ vec {v} ^ \ mathrm {T} \ vec {x} $ abgelegt wird. Kann gemacht werden. $

Mit anderen Worten, das gewünschte $ \ vec {v} $ ist ein Vektor, der die Streuung dieser Länge $ \ vec {v} ^ \ mathrm {T} \ vec {x} $ erhöht, wenn n Datenpunkte vorhanden sind. Die Verteilung von $ \ vec {v} ^ \ mathrm {T} \ vec {x} $

\frac{1}{n-1}\sum_{i=1}^{n}\left[\vec{v}^\mathrm{T}(\vec{x_i}-\hat{\mu})\right]^2\ \;=\; \vec{v}^{\mathrm{T}}\frac{1}{n-1}\sum_{i=1}^n(\vec{x_i}-\hat{\mu})(\vec{x_i}-\hat{\mu})^\mathrm{T}\vec{v}

$ (\ vec {a} \ vec {b}) ^ \ mathrm {T} = \ vec {a} ^ {\ mathrm {T}} \ vec {b} ^ {\ mathrm {T}} $ ..

Da es vom Vektor $ \ vec {v} $ umgeben ist und der andere Teil in Form einer verteilten, gemeinsam verteilten Matrix vorliegt.

\Sigma=\frac{1}{n-1}\sum_{i=1}^n(\vec{x_i}-\hat{\mu})(\vec{x_i}-\hat{\mu})^\mathrm{T}\\

Und legen Die Verteilung ist

\vec{v}^\mathrm{T}\Sigma\vec{v}

Kann platziert werden. Mit anderen Worten, um den Vektor $ \ vec {v} $ in der Richtung zu finden, die diese Varianz maximiert

\max_{v:|v|=1}(\vec{v}^\mathrm{T}\Sigma\vec{v})

Nachdenken über. Hier ist $ \ Sigma $ eine semi-reguläre Festwertmatrix, sodass sie mit einer orthogonalen Matrix diagonalisiert werden kann.

Wenn für alle Nicht-Null-Vektoren $ x ∈ ℝ ^ n $ gilt, wird $ x ^ TAx ≥ 0 $ als positives Semidefinit bezeichnet. --Horn and Johnson(2013) Definition 4.1.11--

Mit anderen Worten

\Sigma\vec{v_i}=\lambda_i\vec{v_i}

Betrachten Sie den Eigenvektor und den Eigenwert

V=[v_1,v_2,...,v_d] \\\
\Lambda=diag(\lambda_1,\lambda_2,...,\lambda_d)

Wenn ich es sage $ \ Sigma V $ liegt daran, dass jeder V-Vektor in das entsprechende Eigenwert-Vielfache umgewandelt wird.

\Sigma V=V\Lambda

Ist Weil $ V $ eine orthogonale Matrix ist

\Sigma = V\Lambda V^\mathrm{T} \quad V^\mathrm{T}\Sigma V=\Lambda

Basierend darauf finden wir den Vektor, der die Varianz maximiert. In denjenigen, auf die ich mich bezog, erwies sich die maximierte Lösung wie folgt als der größte Eigenwert. (Referenz [1]) スクリーンショット 2020-11-11 16.02.25.png

Ich konnte das jedoch nicht gut verstehen und dachte darüber nach. (Bitte weisen Sie darauf hin, wenn es falsch ist) Betrachten Sie einen zweidimensionalen Fall, um die Berechnung zu vereinfachen. Zuerst

\begin{align}
V&=\left[\begin{array}{cc} v_1 & v_2\end{array} \right]=\left[\begin{array}{cc} v_{1x} & v_{2x} \\\ v_{1y} & v_{2y}\end{array} \right] \\\
\vec{v}&=\left[\begin{array}{c} v_x \\\ v_y \end{array}\right] \\\
\Lambda&=\left[\begin{array}{cc} \lambda_1 &0 \\\ 0 & \lambda_2 \end{array}\right] 
\end{align}

Und sag es. Und der Inhalt der Klammer wird transformiert.

\begin{align}
\vec{v}^\mathrm{T}\Sigma\vec{v} &= \vec{v}^\mathrm{T}V\Lambda V^\mathrm{T}\vec{v} \\\\

&= \vec{v}^\mathrm{T}\left[\begin{array}{cc} v_{1x} & v_{2x} \\\ v_{1y} & v_{2y}\end{array} \right]\left[\begin{array}{cc} \lambda_1 &0 \\\ 0 & \lambda_2 \end{array}\right]  \left[\begin{array}{cc} v_{1x} & v_{1y} \\\ v_{2x} & v_{2y}\end{array} \right]\vec{v} \\\\

&=\vec{v}^\mathrm{T}\left[ \begin{array}{cc} v_{1x}^2\lambda_1+v_{2x}^2 \lambda_2 & v_{1x} v_{1y} \lambda_1 +v_{2x} v_{2y} \lambda_2 \\\ v_{1x} v_{1y} \lambda_1 +v_{2x} v_{2y} \lambda_2 & v_{1y}^2\lambda_1+V_{2y}^2 \lambda_2 \end{array} \right]  \vec{v} \\\\

&=\vec{v}^\mathrm{T}\left( \left[ \begin{array}{cc} v_{1x}^2 & v_{1x} v_{1y} \\\ v_{1x} v_{1y} & v_{1y}^2 \end{array} \right]\lambda_1+\left[ \begin{array}{cc} v_{2x}^2& v_{2x} v_{2y} \\\ v_{2x} v_{2y} &V_{2y}^2  \end{array} \right]\lambda_2\right)  \vec{v} \\\\

&=\vec{v}^\mathrm{T} \left[ \begin{array}{cc} v_{1x}^2 & v_{1x} v_{1y} \\\ v_{1x} v_{1y} & v_{1y}^2 \end{array} \right]\vec{v}\lambda_1+\vec{v}^\mathrm{T}\left[ \begin{array}{cc} v_{2x}^2& v_{2x} v_{2y} \\\ v_{2x} v_{2y} &V_{2y}^2  \end{array} \right]\vec{v}\lambda_2  \\\
\end{align}

Wenn Sie nur den Abschnitt von $ \ lambda_1 $ herausnehmen und darüber nachdenken

\begin{align}
\vec{v}^\mathrm{T} \left[ \begin{array}{cc} v_{1x}^2 & v_{1x} v_{1y} \\\ v_{1x} v_{1y} & v_{1y}^2 \end{array} \right]\vec{v}\lambda_1&=\left[\begin{array}{c} v_x & v_y \end{array}\right] \left[ \begin{array}{cc} v_{1x}^2 & v_{1x} v_{1y} \\\ v_{1x} v_{1y} & v_{1y}^2 \end{array} \right]\left[\begin{array}{c} v_x \\\ v_y \end{array}\right]\lambda_1 \\\\

&=(v_{1x}^2 v_x^2+2v_{1x}v_{1y}v_xv_y+v_{1y}^2 v_y^2)\lambda_1 \\\\

&=(v_{1x}v_x+v_{1y}v_y)^2\lambda_1 \\\\

&=\left(\left[\begin{array}{c}v_{1x} & v_{1y} \end{array}\right]\left[\begin{array}{c} v_x \\\ v_y \end{array}\right]\right)^2\lambda_1 \\\\

&=\left(\vec{v_1}^\mathrm{T} \vec{v}\right)^2\lambda_1
\end{align}

Wird sein. Mit anderen Worten

\begin{align}
\max_{v:|v|=1}\left(\vec{v}^\mathrm{T}\Sigma\vec{v}\right) &=\max_{v:|v|=1}\left(\left(\vec{v_1}^\mathrm{T}\vec{v}\right)^2\lambda_1+\left(\vec{v_2}^\mathrm{T}\vec{v}\right)^2\lambda_2\right) \\\

&=\max_{v:|v|=1}\left(\sum_{i=1}^2\left(\vec{v_i}^\mathrm{T}\vec{v}\right)^2\lambda_i\right) \\\

Verallgemeinern\\\

&=\max_{v:|v|=1}\left(\sum_{i=1}^d\left(\vec{v_i}^\mathrm{T}\vec{v}\right)^2\lambda_i\right)
\end{align}

Wird sein. Zu diesem Zeitpunkt ist $ \ vec {v}, \ vec {v_i} $ ein Einheitsvektor, und $ \ vec {v_1}, \ vec {v_2}, ..., \ vec {v_d} $ sind orthogonal zueinander. Daher, wenn $ \ vec {v} = \ vec {v_i} $

\max_{v:|v|=1}\left(\vec{v_i}^\mathrm{T}\vec{v}\right)=1

Wird sein. (Das innere Produkt von Einheitsvektoren in derselben Richtung nimmt 1) Ebenso, wenn $ i \ neq j $

\max_{v:|v|=1}\left(\vec{v_j}^\mathrm{T}\vec{v}\right)=0

Ist. (Das innere Produkt orthogonaler Vektoren ist 0)

Mit anderen Worten wird der Maximalwert genommen, wenn der Vektor v gleich dem maximalen Eigenwert und dem entsprechenden Eigenvektor ist.

\max_{v:|v|=1}\left(\sum_{i=1}^d\left(\vec{v_i}^\mathrm{T}\vec{v}\right)^2\lambda_i\right)=\lambda_1

Wird sein.

Wenn Sie die Achse mit der zweitgrößten Varianz nehmen möchten, können Sie $ \ vec {v} $ in derselben Richtung wie der Eigenvektor ausrichten, der dem zweitgrößten Eigenwert entspricht.

Verteilte co-verteilte Matrix und Korrelationsmatrix

Möglicherweise haben Sie gehört, dass es zwei Möglichkeiten gibt, den Eigenvektor der Varianz-Kovarianz-Matrix und den Eigenvektor der Korrelationsmatrix bei der Durchführung der Hauptkomponentenanalyse zu verwenden. Erstens ist die Korrelationsmatrix die Dispersions-Co-Verteilungsmatrix der Daten geteilt durch die Standardabweichung der Daten. Es ist auch eine verteilte, gemeinsam verteilte Matrix standardisierter Daten, da es in Ordnung ist, zuerst den Durchschnitt zu subtrahieren. Mit anderen Worten, wenn die Daten zuerst standardisiert werden, ist die Theorie dieselbe wie zuvor, sodass Sie sehen können, dass die Hauptkomponentenanalyse auch mit dem Eigenvektor der Standardabweichung durchgeführt werden kann. Daher ist es möglich, eine Hauptkomponentenanalyse mit beiden Methoden durchzuführen, aber es wird gesagt, dass es besser ist, den Eigenvektor der Korrelationsmatrix zu nehmen. Dies liegt daran, dass, wenn die Daten so wie sie sind eine verteilte, gemeinsam verteilte Matrix sind, die Einheiten der Daten unterschiedlich sind und dies berücksichtigt werden muss. Daher wird gesagt, dass es besser ist, eine Hauptkomponentenanalyse ohne Einheiten durchzuführen. (Ich konnte nicht im Detail erklären, wie sich das auf mich auswirken würde, daher möchte ich es hinzufügen, wenn ich auf etwas stoße.)

Beitragssatz

Zum Schluss noch zum Beitragssatz. Der Beitragssatz bezieht sich darauf, wie viel die Daten darstellen. Und der Wert kann durch die Größe der Dispersion gezeigt werden, wie ich in der Theorie erwähnt habe, und die Größe der Dispersion wurde zum Eigenwert, wenn ein bestimmter Richtungsvektor genommen wurde. Da das Verhältnis des Eigenwertes erhalten werden kann, beträgt der Beitragssatz PV $PV_i=\frac{\lambda_i}{\sum_{j=1}^{d}\lambda_j}$

Wird von benötigt.

Implementierung#

Dann möchte ich es mit dieser Theorie umsetzen. Die hier verwendeten Daten sind die Notendaten der fünf Personen, die in der ersten Übersicht verwendet wurden.

Name Landessprache Gesellschaft Englisch Arithmetik Wissenschaft
A 60 70 70 40 30
B 70 60 80 30 30
C 40 20 30 70 80
D 30 20 40 80 80
E 30 30 30 80 70

Schauen wir uns zunächst die PCA-Implementierung von scicit-learn als die richtige Antwort an. Als ich es implementiert habe, sieht es so aus. ~~ Ich benutze Pandas nur zum Lernen, weil ich nicht daran gewöhnt bin ~~

scikit_pca.py


import matplotlib.pyplot as plt
import numpy as np
from sklearn.decomposition import PCA
import pandas as pd
                        

#Daten erstellen
name = ['a','b','c','d','e']                                                   
a = np.array([60,70,70,40,30])                                                 
b = np.array([70,60,80,30,30])
c = np.array([40,20,30,70,80])
d = np.array([30,20,40,80,80])
e = np.array([30,30,30,80,70])  
                        
#Im Framework speichern
df = pd.DataFrame([a,b,c,d,e],columns=['language','society','english','math','science'],index=name)
                                                                               
dfs = df.iloc[:,:].apply(lambda x:(x-x.mean())/x.std(),axis=0) #Datenstandardisierung

#scikit-PCA-Instanziierung und Lernen mit Lernen
pca = PCA()
pca.fit(dfs)
feature=pca.transform(dfs)

                                                           
#Ergebnisausgabe
print(pd.DataFrame(feature,columns=["PC{}".format(x+1) for x in range(len(dfs.columns))]).head())

plt.figure()                                                                   
                                                                               
for i in range(len(name)):                                                     
        plt.annotate(name[i],xy=(feature[i,0],feature[i,1]))
plt.scatter(feature[:,0],feature[:,1],marker='o')                              
plt.xlabel('PC1')                                                              
plt.ylabel('PC2')
plt.show()                                                                     

print(pd.DataFrame(pca.explained_variance_ratio_,index=["PC{}".format(x+1) for x in range(len(dfs.columns))]))   

Das Ergebnis ist wie folgt.

$python scikit_pca.py
        PC1       PC2       PC3       PC4           PC5
0 -2.161412  0.414977 -0.075496 -0.073419  4.163336e-17
1 -2.601987 -0.364980  0.088599  0.064849  4.163336e-17
2  1.479995 -0.437661 -0.290635 -0.037986  4.163336e-17
3  1.727683 -0.047103  0.382252 -0.035840 -1.387779e-17
4  1.555721  0.434767 -0.104720  0.082396 -1.457168e-16

                0
PC1  9.518791e-01
PC2  3.441020e-02
PC3  1.275504e-02
PC4  9.556157e-04
PC5  8.271560e-35

スクリーンショット 2020-11-02 17.41.35.png

Dann habe ich es basierend auf der Theorie implementiert. MyPCA ist als Klasse definiert und wird mit der Methode fit () trainiert und mit der Methode transform () in einen neuen Raum projiziert, sodass es auf die gleiche Weise wie scicit-learn verwendet werden kann. Mit Ausnahme der Klassendefinition des vorherigen Programms

pca=PCA()

Zu

pca=MyPCA()

Da es nur in geändert wurde, habe ich es weggelassen und nur die Klassendefinition aufgelistet, aber es wurde wie folgt.

my_pca.py


#myPCA program

class MyPCA:

        e_values = None #Eindeutige Werte speichern
        e_covs = None   #Eigenvektor speichern
        explained_variance_ratio_ = None
        def fit(self,dfs):
                #Verarbeitung, um die Verwendung von Pandas-Daten und Numpy-Daten zu ermöglichen
                if(type(dfs)==type(pd.DataFrame())):
                        all_data = dfs.values
                else:
                        all_data=dfs

                data_cov=np.cov(all_data,rowvar=0,bias=0) #Verteilte, gemeinsam verteilte Matrixverarbeitung
                self.e_values,self.e_vecs=np.linalg.eig(data_cov) #Berechnung von Eigenwerten und Eigenvektoren

                self.explained_variance_ratio_= self.e_values/self.e_values.sum() #Berechnung des Beitragssatzes

        def transform(self,dfs):
                #Verarbeitung, um die Verwendung von Pandas-Daten und Numpy-Daten zu ermöglichen
                if(type(dfs)==type(pd.DataFrame())):
                        all_data = dfs.values
                else:
                        all_data=dfs

                feature = []
                for e_vec in self.e_vecs.T:
                        temp_feature=[]
                        for data in all_data:
                                temp_feature.append(np.dot(e_vec,data)) #Berechnung des inneren Produkts
                        feature.append(temp_feature)
                return np.array(feature).T


Und das Ergebnis.

        PC1       PC2       PC3           PC4       PC5
0  2.161412 -0.414977 -0.075496 -7.771561e-16  0.073419
1  2.601987  0.364980  0.088599  1.665335e-15 -0.064849
2 -1.479995  0.437661 -0.290635 -4.996004e-16  0.037986
3 -1.727683  0.047103  0.382252 -5.551115e-16  0.035840
4 -1.555721 -0.434767 -0.104720  0.000000e+00 -0.082396
Attribute Qt::AA_EnableHighDpiScaling must be set before QCoreApplication is created.
                0
PC1  9.518791e-01
PC2  3.441020e-02
PC3  1.275504e-02
PC4  2.659136e-17
PC5  9.556157e-04

スクリーンショット 2020-11-12 20.59.31.png

Es wurde so. Wahrscheinlich, weil der Eigenvektor invertiert wurde, gibt es einige Stellen, an denen das Positive und das Negative umgekehrt sind, aber ich denke, dass das gleiche Analyseergebnis erhalten werden könnte.

Am Ende

Dieses Mal schrieb ich über die Theorie der Hauptkomponentenanalyse als persönliches Memorandum. Ich kann das Gefühl nicht leugnen, dass der Artikel schwer zu lesen war, weil ich einige Beweise hineingelegt habe, aber ich habe versucht, ihn so gut ich konnte zu beweisen, weil ich dachte, dass Leute wie ich sich über die Details Sorgen machen könnten und nicht weitermachen könnten.

Die Hauptkomponentenanalyse, die ich dieses Mal aufgenommen habe, ist einfach mit scicit-learn zu verwenden, daher fühlte ich mich unwohl, sie zu verwenden, ohne den Inhalt so gut zu verstehen, und ich hatte das Gefühl, dass ich sie diesmal verstehen konnte, also war ich erfrischt. Mit Ausnahme der Implementierung in Scikit-Learn scheint es jedoch, dass es durch Singularwertzerlegung implementiert wird. Im Fall einer symmetrischen Matrix scheinen die Ergebnisse der Eigenwertzerlegung und der Singularwertzerlegung jedoch gleich zu sein, so dass ich der Meinung war, dass es in Ordnung wäre, wenn man sie wie diesmal auf die Dispersionskovarianzmatrix oder Korrelationsmatrix anwendet. Wenn ich eine Chance habe, möchte ich die Vorteile einer anderen Singularwertzerlegung als der Verallgemeinerung untersuchen.

Referenz

[1] http://ibis.t.u-tokyo.ac.jp/suzuki/lecture/2015/dataanalysis/L7.pdf Datenanalyse 7. "Hauptkomponentenanalyse" [2] https://seetheworld1992.hatenablog.com/entry/2017/03/17/104807 Beweisen Sie, dass die verteilte, gemeinsam verteilte Matrix (und Korrelationsmatrix) ein halbnormaler Wert ist

Recommended Posts

Mathematisches Verständnis der Hauptkomponentenanalyse von Anfang an
Dies und das der Hauptkomponentenanalyse
[Verständnis in 3 Minuten] Der Beginn von Linux
Notizen vom Anfang von Python 1 lernen
Lassen Sie die Stückliste am Anfang der Zeichenfolge weg
[GWAS] Zeichnen Sie die Ergebnisse der Hauptkomponentenanalyse (PCA) von PLINK auf
Notizen vom Anfang von Python 2 lernen
Finden des Beginns der Avenomics anhand der NT-Vergrößerung 2
Finden des Beginns der Avenomics anhand der NT-Vergrößerung 1
Der Beginn von cif2cell
Hauptkomponentenanalyse (Hauptkomponentenanalyse: PCA)
Lerne Nim mit Python (ab Anfang des Jahres).
Studie vom Anfang von Python Hour1: Hallo Welt
Fordern Sie die Hauptkomponentenanalyse von Textdaten mit Python heraus
Hauptkomponentenanalyse mit Python von nim mit nimpy
Studie aus Python Hour8: Verwenden von Paketen
Lernen ohne Lehrer 3 Hauptkomponentenanalyse
Implementierung einer unabhängigen Komponentenanalyse
DJango Hinweis: Von Anfang an (Vereinfachung und Aufteilung von URLConf)
Visualisieren Sie die Korrelationsmatrix durch Hauptkomponentenanalyse mit Python
Beginn der Niko Niko Encyclopedia Analysis ~ JSON und berühren Sie die bereitgestellten Daten ~
Erster Python 3 ~ Der Beginn der Wiederholung ~
Einführung in die Python-Grundlagen des maschinellen Lernens (unbeaufsichtigtes Lernen / Hauptanalyse)
DJango Memo: Von Anfang an (Vorbereitung)
Gesichtserkennung mit Hauptkomponentenanalyse
Hauptkomponentenanalyse mit Spark ML
[Python] Die potenzielle Feldplanung von Python Robotics verstehen
Von der Einführung von JUMAN ++ bis zur morphologischen Analyse von Japanisch mit Python
Leiten Sie den Quadrantenbereich der Standardnormalverteilung von Anfang an sorgfältig ab
Erkennen Sie die Kontur und Richtung eines geformten Objekts mit OpenCV3 und Python3 (Hauptkomponentenanalyse: PCA, Eigenvektor)
Zeigen Sie das Ergebnis der Videoanalyse mit der Cloud Video Intelligence API von Colaboratory an.
DJango Memo: Von Anfang an (Modelleinstellung)
Hauptkomponentenanalyse mit Livedoor News Corpus --Practice--
Ruf Hallo, Reiwa! Am Anfang von Reiwa!
<Kurs> Maschinelles Lernen Kapitel 4: Hauptkomponentenanalyse
DJango Hinweis: Von Anfang an (Formularverarbeitung)
Mathematische Statistik aus den Grundlagen Probabilistische Variablen
[Python] Vergleich der Theorie und Implementierung der Hauptkomponentenanalyse durch Python (PCA, Kernel PCA, 2DPCA)
Einführung in die Quizstatistik (1) -Mathematische Analyse von Fragensätzen, um die Tendenz von Fragen zu kennen-
Ich habe versucht, die Wetterkarte einer Clusteranalyse zu unterziehen
Analyse von "XOR Network" aus dem offiziellen PyPhi-Dokument
Verkürzung der Analysezeit von Openpose mithilfe von Sound
Kaggle Zusammenfassung: Planet, den Amazonas aus dem Weltraum verstehen
Hauptkomponentenanalyse mit Livedoor News Corpus - Vorbereitung--
Vollständiges Verständnis der Konzepte von Bellmanford und Dyxtra
Dimensionskomprimierung durch Selbstcodierer- und Hauptkomponentenanalyse
DJango Memo: Von Anfang an (Erstellen einer Ansicht)
Ich habe versucht, die Hauptkomponenten mit Titanic-Daten zu analysieren!
Ändern Sie den Dezimalpunkt der Protokollierung von, nach.
PRML Kapitel 12 Bayesianische Hauptanalyse Python-Implementierung
[Python] Ein grobes Verständnis des Protokollierungsmoduls
Auszug nur vollständig aus dem Ergebnis von Trinity
DJango Memo: Von Anfang an (Fehlerbildschirmeinstellung)
Von der Einführung von Pyethapp bis zur Vertragsabwicklung
Übergang von Baseball aus Daten gesehen
Die Geschichte vom Umzug von Pipenv zur Poesie
Zusammenfassung von Anfang bis Kapitel 1 der Einführung in Entwurfsmuster, die in der Java-Sprache gelernt wurden