Die Hauptkomponentenanalyse ist eine Methode zum Erstellen von Hauptkomponenten (Features) durch Gruppieren mehrerer Variablen aus multivariaten Daten, die die Features eines Objekts darstellen. Diese Methode kann die Dimension reduzieren, die Struktur der Daten besser erkennen und den Rechenaufwand beim maschinellen Lernen reduzieren, um die Berechnungsgeschwindigkeit zu verbessern. Einfach ausgedrückt handelt es sich um eine Methode zum Ausdrücken korrelierter multivariater Daten durch eine Funktion mit geringerer Korrelation, wobei die Richtung und Größe der Variation im Mittelpunkt stehen. Dieses Mal möchte ich den Mechanismus bei der Implementierung in Python bestätigen, der in den auf der Seite des Ministeriums für Bildung, Kultur, Sport, Wissenschaft und Technologie veröffentlichten Materialien zur Lehrerausbildung von Information II unter "Analyse der Hauptkomponenten und Dimensionsreduzierung" behandelt wird. Überlegen.
[Informationsabteilung der High School "Information II" Lehrmaterialien für Lehrer (Hauptband): Ministerium für Bildung, Kultur, Sport, Wissenschaft und Technologie](https://www.mext.go.jp/a_menu/shotou/zyouhou/detail/mext_00742.html "Informationsabteilung der High School Unterrichtsmaterialien "Information II" für die Lehrerausbildung (Hauptteil): Ministerium für Bildung, Kultur, Sport, Wissenschaft und Technologie ") Kapitel 3 Erste Hälfte der Informations- und Datenwissenschaft (PDF: 8,9 MB)
Nachdem Sie einen Überblick über die Hauptkomponentenanalyse gegeben haben, ohne so viele mathematische Formeln wie möglich zu verwenden,
Lernen 14 Hauptkomponentenanalyse und Dimensionsreduktion: "4. Analysieren wir die Daten zur körperlichen Fitness mit R"
Ich würde gerne sehen, wie es funktioniert, wenn der in R in Python geschriebene Quellcode implementiert wird.
Um den Mechanismus der Hauptkomponentenanalyse (PCA) kurz zu erläutern, eine neue Merkmalsgröße namens Hauptkomponente, die den Unterschied zwischen einzelnen Objekten maximiert, indem Variablen mit starker Kovarianz und Korrelation zwischen Variablen gruppiert werden ( Es ist eine Variable zu erstellen).
Wie in der Abbildung gezeigt, werden aus p Variablen $ (X_1, X_2, \ cdots, X_p) $ p voneinander unabhängige Gesamtvariablen durch lineare Verbindung (gewichtete Summe) ohne Informationsverlust erhalten. Erstellen Sie als Hauptkomponente $ (Z_1, Z_2, \ cdots, Z_p) $.
Die Hauptkomponenten werden in der Reihenfolge erstellt, in der die Dispersion am größten ist, und die Schwankung (Dispersion) des Werts der Hauptkomponente (Hauptkomponentenbewertung) zwischen den Objekten wird kleiner, wenn die unteren Hauptkomponenten werden.
Das heißt, indem die untere Komponente mit einem kleinen Beitrag verworfen und nur die obere Komponente übernommen wird, ist es möglich, das Merkmal des Ziels mit einer Zahl zu profilieren, die kleiner als die ursprüngliche Zahl p ist, und die Dimension zu verringern. Es heißt (Dimensionsreduktion).
Betrachten Sie das folgende einfache Beispiel (Ergebnisdaten für Prüfungen in 5 Fächern).
Betrachten Sie eine zusammengesetzte Variable, die als a, b, c, d, e erstellt wurde, indem Sie die Koeffizienten jedes Subjekts verallgemeinern.
Gesamtvariablen = a x Landessprache + b x Englisch + c x Mathematik + d x Physik + e x Chemie
Durch Angabe verschiedener numerischer Werte für a, b, c, d und e können verschiedene andere Gesamtpunkte als die einfachen Gesamtpunkte erstellt werden. Die durch die Hauptkomponentenanalyse erzeugte Hauptkomponente ist so, dass die Koeffizienten a, b, c, d und e die variabelste im Wert ** (Hauptkomponentenbewertung) ** der Gesamtvariablen von 50 Schülern sind, dh die Varianz ist Eine Variable, die als maximal bestimmt wird.
Große Variabilität entspricht der Informationsmenge in dieser Variablen. Die erste zu erhaltende Hauptkomponente wird als erste Hauptkomponente bezeichnet, und die als nächstes zu erhaltende zweite Hauptkomponente maximiert die Dispersion unter der Bedingung, dass sie von der ersten Komponente unabhängig ist (keine Korrelation). Es handelt sich um eine Feature-Menge, die nicht miteinander korreliert und keine Informationen dupliziert.
Aus Unterrichtsmaterialien
Beim Erstellen synthetischer Variablen gibt es zwei Positionen.
- (1) Richten Sie die Bewertungsstufen (Positionen) der fünf Probanden aus (machen Sie den Durchschnitt gleich, machen Sie eine Abweichung vom Durchschnitt).
- (2) Richten Sie sowohl die Punktzahl (Position) der fünf Probanden als auch die Größe der Variation aus (machen Sie den Durchschnitt und die Standardabweichung gleich, standardisieren Sie sie (standardisieren Sie sie) oder machen Sie den Abweichungswert).
Wenn Sie mit mehreren Variablen mit unterschiedlichen Einheiten arbeiten, müssen Sie die Einheiten standardisieren (2) und ausrichten. Wenn die Einheiten gleich sind, kann die Analyse unter den Gesichtspunkten von ① und ② durchgeführt werden. In (1) wird ein Koeffizient erhalten, der die Größe der Varianz jeder Variablen berücksichtigt, und in (2) wird ein Koeffizient erhalten, der die Varianzdifferenz jeder Variablen ignoriert.
Für die Diskussion darüber, welche von (1) und (2) angenommen werden sollten, werden die nachstehend zusammengefassten Informationen detailliert beschrieben.
https://qiita.com/koshian2/items/2e69cb4981ae8fbd3bda
- Es ist nicht immer gut, die Hauptkomponentenanalyse zu standardisieren (durch Standardabweichung zu teilen)
- Im Gegenteil, die Division durch die Standardabweichung wirkt sich nachteilig aus.
- Ob es standardisiert werden soll, hängt davon ab, wo Sie die Hauptkomponentenanalyse verwenden (ob Sie es als Visualisierung oder als Pipeline verwenden). Denken Sie also richtig darüber nach.
Die Elemente werden aus den Daten zur körperlichen Fitness (Griffkraft, Anheben des Oberkörpers usw.) extrahiert und die Hauptkomponentenanalyse durchgeführt. Ich möchte die folgenden vorverarbeiteten Daten verwenden, die hier erstellt wurden.
https://gist.github.com/ereyester/5bf6d48fe966238632eca537756a06b0/raw/805c2eea83c7608d4d85ec15e56761133dc5ff4d/high_male2.csv
import numpy as np
import pandas as pd
import urllib.request
import matplotlib.pyplot as plt
import sklearn #Bibliothek für maschinelles Lernen
from sklearn.decomposition import PCA #Hauptkomponentenanalysator
from sklearn.preprocessing import StandardScaler
from IPython.display import display
high_male2 = pd.read_csv('/content/high_male2.csv')
high_male3 = high_male2[['Griff', 'Heben Sie Ihren Oberkörper an', 'Langsitz-Vorwärtsbeugung', 'Wiederholter Seitensprung', 'Shuttle fahren', 'X50m laufen', 'Stehender Weitsprung', 'Handball werfen']]
display(high_male3)
Dieses Mal möchte ich zwei Methoden implementieren, eine mit dem Scicit-Learn-Modul und eine ohne. Die Methode, die das scikit-learn-Modul verwendet, verwendet sklearn.decomposition.PCA und sklearn.preprocessing.StandardScaler. Die Methode, die das Scikit-Lernmodul nicht verwendet, besteht darin, die Verarbeitung selbst mit Numpy und Pandas zu implementieren.
Dieses Mal möchte ich pandas.DataFrame aktiv nutzen, um mit der Implementierung fortzufahren.
#Matrix-Standardisierung
#Standardisierung(Verwendung von Standard Scaler)
std_sc = StandardScaler()
std_sc.fit(high_male3)
std_data = std_sc.transform(high_male3)
std_data_df = pd.DataFrame(std_data, columns = high_male3.columns)
display(std_data_df)
#Führen Sie eine Hauptkomponentenanalyse durch
pca = PCA()
pca.fit(std_data_df)
#Zuordnen von Daten zum Hauptkomponentenraum
pca_cor = pca.transform(std_data_df)
#print(pca.get_covariance()) #Verteilte mitverteilte Matrix
#Matrixanzeige von Eigenvektoren
eig_vec = pd.DataFrame(pca.components_.T, index = high_male3.columns, \
columns = ["PC{}".format(x + 1) for x in range(len(std_data_df.columns))])
display(eig_vec)
#Eigenwert
eig = pd.DataFrame(pca.explained_variance_, index=["PC{}".format(x + 1) for x in range(len(std_data_df.columns))], columns=['Eigenwert']).T
display(eig)
#Im Quellcode von R wird die Standardabweichung anstelle des Eigenwerts (Verteilung) berechnet.
#Standardabweichung der Hauptkomponente
dv = np.sqrt(eig)
dv = dv.rename(index = {'Eigenwert':'Standardabweichung der Hauptkomponente'})
display(dv)
#Beitragssatz
ev = pd.DataFrame(pca.explained_variance_ratio_, index=["PC{}".format(x + 1) for x in range(len(std_data_df.columns))], columns=['Beitragssatz']).T
display(ev)
#Kumulativer Beitragssatz
t_ev = pd.DataFrame(pca.explained_variance_ratio_.cumsum(), index=["PC{}".format(x + 1) for x in range(len(std_data_df.columns))], columns=['Kumulativer Beitragssatz']).T
display(t_ev)
#Hauptkomponentenbewertung
print('Hauptkomponentenbewertung')
cor = pd.DataFrame(pca_cor, columns=["PC{}".format(x + 1) for x in range(len(std_data_df.columns))])
display(cor)
Zunächst verwenden wir sklearn.preprocessing.StandardScaler, um die Daten zu standardisieren. Durch Standardisierung wird es in Daten mit einem Durchschnitt von 0 und einer Verteilung von 1 konvertiert.
Die Hauptkomponentenanalyse wird an den standardisierten Daten mit sklearn.decomposition.PCA durchgeführt. In der Hauptkomponentenanalyse können die Ergebnisse des Eigenvektors, des Eigenwerts, des Beitragssatzes und der Hauptkomponentenbewertung bestätigt werden.
Aus diesen Ergebnissen wurde gezeigt, dass das Ausgabeergebnis in R nahezu gleich war.
Hier ist die Beziehung zwischen der Hauptkomponentenbewertung, dem Eigenvektor und den standardisierten Daten wie folgt.
Hauptkomponentenbewertung = Eigenvektor (Griffkraft) x Griffkraftwert nach Standardisierung + Eigenvektor (Anheben des Oberkörpers) x Anheben des Oberkörpers nach Standardisierung + ... + Eigenvektor (Handballwerfen) x Handballwurfwert nach Standardisierung
Die Unterrichtsmaterialien beschreiben die Kriterien zur Reduzierung der Dimensionen.
- Kumulativer Beitragssatz: Verwenden Sie als Richtlinie den kumulierten Beitragssatz von 70% bis 80%.
- Inhärenter Wert (Dispersion) ist 1 oder mehr (Kaiser-Standard): Hauptkomponente mit einem Eigenwert größer als 1 wird übernommen (bei Analyse der Korrelationsmatrix = in diesem Fall), Beitragssatz ist (1 / Anzahl der Variablen) x 100 (%) ) Übernehmen Sie bis zu den oben genannten Hauptkomponenten (bei der Analyse der Kovarianzmatrix). --Screep-Diagramm: Von links nach rechts in absteigender Reihenfolge des Eigenwerts (Dispersion) Für das Liniendiagramm (Screep-Diagramm) werden die Hauptkomponenten bis zur Abnahme des Ausmaßes der Abnahme der Dispersion (allmähliche Abnahme) übernommen.
#Standardisierung(So verwenden Sie den Standard Scaler nicht)
# default:axis = 0(Anwendung zur Spaltenorientierung)
std_data_df_noskl = (high_male3 - high_male3.mean()) / high_male3.std(ddof = 0)
display(std_data_df_noskl)
#Kovarianzmatrix
cov_vec = np.cov(std_data_df_noskl.T, bias = 0)
#Finden Sie Eigenwerte und Eigenvektoren
# np.linalg.svd: Singularitätszerlegung
# np.linalg.eig:Einzigartige Wertzerlegung
#Wählen Sie hier die Singularwertzerlegung
eig_vec_noskl_l, eig_noskl_l, _ = np.linalg.svd(cov_vec)
#Hauptkomponentenbewertung
pca_cor_noskl = np.dot(std_data_df_noskl, eig_vec_noskl_l)
#display(cor_noskl)
#Matrixanzeige des Eigenwertvektors
eig_vec_noskl = pd.DataFrame(eig_vec_noskl_l, index = high_male3.columns, \
columns = ["PC{}".format(x + 1) for x in range(len(std_data_df_noskl.columns))])
display(eig_vec_noskl)
#Eigenwert
eig_noskl = pd.DataFrame(eig_noskl_l, index=["PC{}".format(x + 1) for x in range(len(std_data_df_noskl.columns))], columns=['Eigenwert']).T
display(eig_noskl)
#Im Quellcode von R wird die Standardabweichung anstelle des Eigenwerts (Verteilung) berechnet.
#Standardabweichung der Hauptkomponente
dv_noskl = np.sqrt(eig_noskl)
dv_noskl = dv_noskl.rename(index = {'Eigenwert':'Standardabweichung der Hauptkomponente'})
display(dv_noskl)
#Beitragssatz
ev_noskl_l = eig_noskl_l / eig_noskl_l.sum()
ev_noskl = pd.DataFrame(ev_noskl_l, index=["PC{}".format(x + 1) for x in range(len(std_data_df_noskl.columns))], columns=['Beitragssatz']).T
display(ev_noskl)
#Kumulativer Beitragssatz
t_ev_noskl = pd.DataFrame(ev_noskl_l.cumsum(), index=["PC{}".format(x + 1) for x in range(len(std_data_df_noskl.columns))], columns=['Kumulativer Beitragssatz']).T
display(t_ev_noskl)
#Hauptkomponentenbewertung
print('Hauptkomponentenbewertung')
cor = pd.DataFrame(pca_cor_noskl, columns=["PC{}".format(x + 1) for x in range(len(std_data_df_noskl.columns))])
display(cor)
Erstens standardisieren wir
Die Standardisierungsformel lautet wie folgt.
X_{i,j}^{(std)} ← \frac{x_{i,j} - \mu}{\sigma}
\mu:\frac{1}{n}\sum_{i=1}^{n} X_{i,j}
\sigma:\sqrt{\frac{1}{n}\sum_{i=1}^{n} (X_{i,j} - \mu)^2 }
{\boldsymbol{X}}=
\begin{pmatrix}
X_{1,1}^{(std)} & \cdots & X_{135,1}^{(std)} \\
\vdots & \ddots & \vdots \\
X_{1,8}^{(std)} & \cdots & X_{135,8}^{(std)}
\end{pmatrix}
Hier ist x = 1,…, 135 = N, j = 1,…, 8
In diesem Python-Code wird die Standardabweichung mit 0 Freiheitsgraden berechnet. https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.std.html Es ist zu beachten, dass es sich bei pandas.DataFrame.std um ddofint, Standard 1, handelt. Wenn kein Argument angegeben wird, wird die Standardabweichung aufgrund der unverzerrten Verteilung mit 1 Freiheitsgrad verwendet. Apropos, https://numpy.org/doc/stable/reference/generated/numpy.std.html Es ist dd von int, der optionale Standardwert ddof ist in numpy.std Null und der Freiheitsgrad ist 0. https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.StandardScaler.html Beachten Sie, dass die Standardabweichung, die bei der Berechnung von sklearn.preprocessing.StandardScaler verwendet wird, ddof = 0 ist.
Als nächstes lautet für die standardisierten Daten die Formel der verteilten, gemeinsam verteilten Matrix (selbstverteilte Matrix)
E[\boldsymbol{X}]=0
Als,
cov({\boldsymbol{X,X}})=E[\boldsymbol{X^TX}]-E[{\boldsymbol{X}}]^TE[{\boldsymbol{X}}]=E[\boldsymbol{X^TX}]=\frac{1}{N-1}\boldsymbol{X^TX}
cov({\boldsymbol{X,X}})=\Sigma
Dann $ U $: $ 135 \ mal 135 $ orthogonale Matrix $ S $: $ 135 \ mal 8 $ echte Diagonalmatrix (Komponente nicht negativ) $ V_ {svd} $: $ 8 \ mal 8 $ orthogonale Matrix
\boldsymbol{X}=U S {V^T_{svd}}
\boldsymbol{X^TX}=[U S {V^T_{svd}}]^T[U S {V^T_{svd}}]=V_{svd} S^T SV^T_{svd}
\Sigma=\frac{V_{svd} S^T SV^T_{svd}}{N-1}
$ S ^ 2 $: Eindeutige Werte, diagonal angeordnet Eindeutiger Vektor von $ V_ {svd} $: $ \ boldsymbol {X ^ TX} $
Der folgende Artikel beschreibt die Singularwertzerlegung.
https://qiita.com/kidaufo/items/0f3da4ca4e19dc0e987e
Der folgende Artikel beschreibt die Beziehung zwischen der Hauptkomponentenanalyse und der Singularwertzerlegung.
https://qiita.com/horiem/items/71380db4b659fb9307b4 https://qiita.com/sakami/items/50b8485159312573e3c7
Unter den folgenden Gesichtspunkten wurde ausgewählt, ob eine Eigenwertzerlegung oder eine Singularwertzerlegung verwendet werden soll.
https://numpy.org/doc/stable/reference/generated/numpy.linalg.eig.html
Rückgabe: w: ... Die Eigenwerte sind nicht unbedingt geordnet. In numpy.linalg.eig sind die Eigenwerte nicht unbedingt geordnet, daher möchten wir PC1 PC2 ... in absteigender Reihenfolge der Eigenwerte ordnen, sodass eine Ordnungsoperation erforderlich ist. Wird sein.
https://numpy.org/doc/stable/reference/generated/numpy.linalg.svd.html
Rückgabe: Vektor (en) mit den Singularwerten innerhalb jedes Vektors in absteigender Reihenfolge sortiert. Dies ist einfacher, da Sie die Vektoren in absteigender Reihenfolge sortieren können.
#Hauptkomponentenanalyse unter Verwendung von 8 Variablen von der Griffkraft bis zum Handballwerfen, ausgenommen Größe, Gewicht und Sitzhöhe #Korrelationsmatrix #Datensatz(Spalten 4 bis 11)Importieren high_male2 <- read.csv("high_male2.csv") high_male3 <- high_male2[c(4:11)] #Durchführung der Hauptkomponentenanalyse prcomp basierend auf der Korrelationsmatrix (res2 <- prcomp(high_male3, scale=T)) summary(res2) pc <- res2$x #Fegen der Partitur der Hauptkomponente in die Datei write.csv(pc, file = "pca_cor.csv")
Das Argument scale = T von prcomp () gibt scale = True an Dies ist ein Parameter, der angibt, dass die Hauptkomponentenanalyse unter Verwendung der Korrelationsmatrix der Daten durchgeführt werden soll. In Bezug auf die Ereignisse, die dieses Mal behandelt wurden, wird gesagt, dass die Hauptkomponentenanalyse an den Daten durchgeführt wurde, die im Wesentlichen standardisiert waren. Wird voraussichtlich gleichwertig sein.
Standard deviations (1, .., p=8): [1] 1.9677462 0.9524611 0.9096410 0.8553785 0.7327083 0.6857621 0.6399714 [8] 0.4949534
Rotation (n x k) = (8 x 8): PC1 PC2 PC3 PC4 PC5 Griffkraft 0.3252018 0.2682176 -0.53297421 0.39993408 -0.3653663 Heben Sie Ihren Oberkörper an 0.3141190 0.4351668 0.42225757 0.40834395 0.4032249 Langsitz-Vorwärtsbeugung 0.3077864 0.3745785 0.01503113 -0.75987597 -0.2411453 Wiederholter Seitensprung 0.3933948 0.1203619 0.05183489 -0.20404673 0.4967487 Shuttle-Fahrt 0.3132617 -0.4444223 0.59760197 0.01703693 -0.3900527 X50m laufen-0.4057185 0.4620511 0.11729178 -0.10636452 -0.0709927 Stehender Breitensprung 0.3681042 -0.3669386 -0.40018514 -0.13933339 0.3055848 Handballwurf 0.3844997 0.1955680 0.06075045 0.15245958 -0.3852838 PC6 PC7 PC8 Griff-0.31441687 0.34209544 -0.17004275 Heben Sie Ihren Oberkörper an-0.33321281 -0.29431157 0.08168542 Langsitz-Vorwärtsbeugung-0.28776668 -0.10238851 0.18941208 Wiederholter Seitensprung 0.35638527 0.61198108 -0.19529718 Shuttle fahren-0.21759749 0.17541898 -0.34157859 X50m Lauf 0.04215936 -0.08597965 -0.76329592 Stehender Weitsprung-0.10049579 -0.50594605 -0.43684157 Handballwurf 0.72184877 -0.34234695 0.01636705 Importance of components: PC1 PC2 PC3 PC4 PC5 PC6 PC7 Standard deviation 1.968 0.9525 0.9096 0.85538 0.73271 0.68576 0.6400 Proportion of Variance 0.484 0.1134 0.1034 0.09146 0.06711 0.05878 0.0512 Cumulative Proportion 0.484 0.5974 0.7008 0.79229 0.85940 0.91818 0.9694 PC8 Standard deviation 0.49495 Proportion of Variance 0.03062 Cumulative Proportion 1.00000
Für pca_cor.csv lautet die Ausgabe wie folgt.
Python-Version https://gist.github.com/ereyester/3c2173eb61cbcd64b61f23b3d4d6480c
R-Version https://gist.github.com/ereyester/cd309a9ab46c37a3f594963d1ad55495
Recommended Posts