[Python] PCA-Scratch im Beispiel "Einführung in die multivariate Analysemethode"

Einführung

Ich habe versucht, dem Beweis der Hauptkomponentenanalyse zu folgen, aber ich habe nicht verstanden, wie man sie verwendet, und dachte, ich würde mein Verständnis vertiefen, indem ich Kapitel 9, Beispiel 4 des von Science veröffentlichten Buches "Einführung in die multivariate Analyse" kratzte. Dieser Artikel soll diese Erinnerung sein.

Was zu verwenden

・ VSCode (... nun, jeder Editor ist in Ordnung) ・ Python Version 3.7.0 ·Bibliothek -Numpy (zum Verwalten der Matrix) -Matplotlib (im Streudiagramm verwendet) ・ Einführung in die multivariate Analysemethode (Wissenschaft) ← Im Folgenden wird dieses Buch als Lehrbuch bezeichnet.

fließen

Überprüfen Sie einfach die Scratch-Richtlinie. ① Dateneingabe ② Datenstandardisierung ③ Berechnen Sie die Korrelationskoeffizientenmatrix ④ Eigenwert und Eigenvektor berechnen ⑤ Führen Sie eine Hauptkomponentenanalyse durch und komprimieren Sie sie auf zwei Dimensionen ⑥ Zusätzlich wird auch die Faktorlast angegeben. ⑦ Zeichnen Sie ein Streudiagramm jeder Faktorbelastung und Hauptkomponentenbewertung

Datenmatrix

Die Daten im Beispiel habe ich von Hand eingegeben.

ex9_4.txt


86 79 67 68
71 75 78 84
42 43 39 44
62 58 98 95
96 97 61 63
39 33 45 50
50 53 64 72
78 66 52 47
51 44 76 72
89 92 93 91

Code

Ich werde den Code setzen.

scratch.py


import numpy as np
import numpy.linalg as LA
import matplotlib.pyplot as plt

#Geben Sie die Stichprobengröße ein(Linie)
n = int(input())

#Daten eingeben
a = [input().split() for l in range(n)]
data = np.array(a, dtype=float)
line = int(data.shape[0])
row = int(data.shape[1])
print(line, row)

means = np.empty(row)
sds = np.empty(row)

#Durchschnitt berechnen
sum = 0
for i in range(row):
    for j in range(line):
        sum +=  data[j][i]
    else:
        means[i] = sum / line
        sum = 0
print("durchschnittlich:")
print(means)

#Standardabweichung berechnen
for i in range(row):
    for j in range(line):
        sum += (data[j][i]-means[i]) ** 2
    else:
        sds[i] = (sum / (line - 1)) ** 0.5
        sum = 0
print("Standardabweichung:")
print(sds)

#Standardisierung
standardized_data = np.zeros((line,row))
for i in range(row):
    for j in range(line):
        standardized_data[j][i] = (data[j][i] - means[i]) / sds[i]  
print(standardized_data)

#Berechnen Sie die Korrelationskoeffizientenmatrix
cc_matrix = np.zeros((row, row))
for i in range(row):
    for j in range(row):
        if(cc_matrix[i][j] == 0):
            for k in range(line):
                sum += standardized_data[k][i] * standardized_data[k][j]
            else:
                cc_matrix[i][j] = sum / (line - 1)
                cc_matrix[j][i] = cc_matrix[i][j]
                sum = 0

#Einzigartiges Wertproblem
w,v = LA.eig(cc_matrix)
#print(w)
#print(v)

#Durch Hauptkomponentenanalyse auf 2 Dimensionen komprimiert
main_component = np.zeros((line, 2))
z_1, z_2 = 0, 0
for i in range(line):
    for j in range(row):
        z_1 += standardized_data[i][j] * v[j][0]
        z_2 += standardized_data[i][j] * v[j][1]
    else:
        main_component[i][0] = z_1
        main_component[i][1] = z_2
        z_1, z_2 = 0, 0
print("Hauptbestandteil:")
print(main_component)

#Faktor laden
factor_load = np.zeros((2, row))
for i in range(2):
    for j in range(row):
        factor_load[i][j] = (w[i] ** 0.5) * v[j][i]
print("Faktor laden:")
print(factor_load)

#Zeichnen Sie ein Streudiagramm

#Streudiagramm der Faktorbelastung
for label in range(row):
    plt.scatter(factor_load[0][label], factor_load[1][label], marker="$"+str(label+1)+"$")
    plt.title('factor_load')
    plt.xlabel('pc1')
    plt.ylabel('pc2')
plt.show()

#Streudiagramm der Bewertungen der Hauptkomponenten
for label in range(line):
    plt.scatter(main_component[label][0], main_component[label][1], marker="$"+str(label+1)+"$")
    plt.title('principal component')
    plt.xlabel('pc1')
    plt.ylabel('pc2')
plt.show()

Jeder Prozess des Codes wird unten erklärt.

Dateneingabe

Verwenden Sie zunächst input (), um die Anzahl der Zeilen der Matrix einzugeben, die über die Tastatur erstellt werden sollen. Dies ist die Stichprobengröße in den Originaldaten. Geben Sie als Nächstes die Matrixdaten mit der Tastatur ein und verwalten Sie sie mit numpy. Ich denke, es gibt eine andere gute Methode für diese Eingabemethode. (Dieses Mal wird dieser Teil jedoch mit der Ziel-Hauptkomponentenanalyse verglichen. Ich dachte, es sei eine triviale Angelegenheit, und ich wollte nicht zu viel Zeit verbringen, also beschloss ich, sie ins Regal zu stellen und fortzufahren.) Ermitteln Sie dann die Anzahl der Zeilen und Spalten der erstellten Matrix. Diese Typen verwenden sie häufig. Mit diesem Code werden zu diesem Zeitpunkt auch der Mittelwertvektor und der Standardabweichungsvektor initialisiert.


#Geben Sie die Stichprobengröße ein(Linie)
n = int(input())

#Daten eingeben
a = [input().split() for l in range(n)]
data = np.array(a, dtype=float)
line = int(data.shape[0])
row = int(data.shape[1])
print(line, row)

means = np.empty(row)
sds = np.empty(row)

Datenstandardisierung

Ermitteln Sie aus der Datenmatrix den Mittelwert und die Standardabweichung für jede Spalte und erstellen Sie daraus eine Matrix, die die Originaldaten standardisiert. (Standardized_data) Von hier aus ist es im Grunde ein Sturm von Sätzen. Ich habe meinen Kopf sehr oft im Index verwendet. Beachten Sie auch, dass bei der Berechnung der Standardabweichung die zu teilende Zahl n-1 anstelle von n sein muss, da sonst der Wert nicht dem Lehrbuch entspricht.


#Durchschnitt berechnen
sum = 0
for i in range(row):
    for j in range(line):
        sum +=  data[j][i]
    else:
        means[i] = sum / line
        sum = 0
print("durchschnittlich:")
print(means)

#Standardabweichung berechnen
for i in range(row):
    for j in range(line):
        sum += (data[j][i]-means[i]) ** 2
    else:
        sds[i] = (sum / (line - 1)) ** 0.5
        sum = 0
print("Standardabweichung:")
print(sds)

#Standardisierung
standardized_data = np.zeros((line,row))
for i in range(row):
    for j in range(line):
        standardized_data[j][i] = (data[j][i] - means[i]) / sds[i]  
print(standardized_data)

Berechnen Sie die Korrelationskoeffizientenmatrix

Wir schätzen die Lehrbuchgleichungen (9.2) und (9.3) und berechnen die Korrelationskoeffizientenmatrix. Natürlich bestätigen wir den Beweis auf Papier, bevor wir die Gleichungen verwenden. Darüber hinaus versuchen wir, den Rechenaufwand zu reduzieren, indem wir die Tatsache nutzen, dass die Korrelationskoeffizientenmatrix eine symmetrische Matrix ist.

#Berechnen Sie die Korrelationskoeffizientenmatrix
cc_matrix = np.zeros((row, row))
for i in range(row):
    for j in range(row):
        if(cc_matrix[i][j] == 0):
            for k in range(line):
                sum += standardized_data[k][i] * standardized_data[k][j]
            else:
                cc_matrix[i][j] = sum / (line - 1)
                cc_matrix[j][i] = cc_matrix[i][j]
                sum = 0

Einzigartiges Wertproblem

Ich werde den Eigenwert und den Eigenvektor berechnen ... aber ich konnte mir nicht vorstellen, wie ich hier kratzen soll, also habe ich beschlossen, ihn in die Funktion linalg.eig zu werfen und fortzufahren. Ich habe den Eigenwert in w und den Eigenvektor in v gesetzt. Masu. Wenn Sie hier eine gute Möglichkeit zum Kratzen haben, lassen Sie es mich bitte wissen.

#Einzigartiges Wertproblem
w,v = LA.eig(cc_matrix)
#print(w)
#print(v)

Schließlich Hauptkomponentenanalyse

Dies ist das Hauptthema. Dieses Mal möchte ich den Fluss überprüfen, bis er in ein Streudiagramm umgewandelt wird. Daher habe ich beschlossen, zwei Dimensionen, dh zwei Hauptkomponenten, zu löschen und den Code zu schreiben. denn Aussage ist schwer ...


#Durch Hauptkomponentenanalyse auf 2 Dimensionen komprimiert
main_component = np.zeros((line, 2))
z_1, z_2 = 0, 0
for i in range(line):
    for j in range(row):
        z_1 += standardized_data[i][j] * v[j][0]
        z_2 += standardized_data[i][j] * v[j][1]
    else:
        main_component[i][0] = z_1
        main_component[i][1] = z_2
        z_1, z_2 = 0, 0
print("Hauptbestandteil:")
print(main_component)

Faktor laden

Übrigens ist es eine Faktorbelastung.


#Faktor laden
factor_load = np.zeros((2, row))
for i in range(2):
    for j in range(row):
        factor_load[i][j] = (w[i] ** 0.5) * v[j][i]
print("Faktor laden:")
print(factor_load)

Streudiagramm

Ich werde die Hauptkomponentenbewertung und den Faktorladungsbetrag, an dem ich hart gearbeitet habe, im Streudiagramm darstellen. Die x-Achse ist die erste Hauptkomponente und die y-Achse ist die zweite Hauptkomponente.

#Zeichnen Sie ein Streudiagramm

#Streudiagramm der Faktorbelastung
for label in range(row):
    plt.scatter(factor_load[0][label], factor_load[1][label], marker="$"+str(label+1)+"$")
    plt.title('factor_load')
    plt.xlabel('pc1')
    plt.ylabel('pc2')
plt.show()

#Streudiagramm der Bewertungen der Hauptkomponenten
for label in range(line):
    plt.scatter(main_component[label][0], main_component[label][1], marker="$"+str(label+1)+"$")
    plt.title('principal component')
    plt.xlabel('pc1')
    plt.ylabel('pc2')
plt.show()

Streudiagramm

load.png main_component.png Ich konnte fast das Gleiche zeichnen wie ein Lehrbuch. Ist es gut

Am Ende

Ich habe zum ersten Mal einen Artikel über Qiita geschrieben. Ich denke, es gibt viele Dinge, die schwer zu lesen sind. Da ich unreif bin, denke ich, dass der obige Code viele Tsukkomi enthält. Ich bin sehr willkommen, Tsukkomi für sie zu verwenden. Vielmehr habe ich es an Qiita gesendet, um Tsukkomi zu erhalten.

Verweise

Yasushi Nagata, Masahiko Muchinaka Einführung in die multivariate Analysemethode Wissenschaft, 10. April 2001

Recommended Posts

[Python] PCA-Scratch im Beispiel "Einführung in die multivariate Analysemethode"
Von der Einführung von JUMAN ++ bis zur morphologischen Analyse von Japanisch mit Python
[Einführung in Python] Eine ausführliche Erklärung der in Python verwendeten Zeichenkettentypen!
Ein Beispiel für die Antwort auf die Referenzfrage der Studiensitzung. Mit Python.
So ermitteln Sie die Anzahl der Stellen in Python
Reproduzieren Sie das Ausführungsbeispiel von Kapitel 4 von Hajipata in Python
[Einführung in Python] Grundlegende Verwendung der Bibliothek matplotlib
Reproduzieren Sie das Ausführungsbeispiel von Kapitel 5 von Hajipata in Python
Um das Äquivalent von Rubys ObjectSpace._id2ref in Python zu tun
[Python] Wie man PCA mit Python macht
Im Python-Befehl zeigt Python auf Python3.8
Einführung in die Bildanalyse opencv python
So bestimmen Sie die Existenz eines Selenelements in Python
Wie Sie die interne Struktur eines Objekts in Python kennen
Einführung in die Python-Grundlagen des maschinellen Lernens (unbeaufsichtigtes Lernen / Hauptanalyse)
So überprüfen Sie die Speichergröße einer Variablen in Python
[Einführung in Python] Ich habe die Namenskonventionen von C # und Python verglichen.
Geben Sie den Inhalt von ~ .xlsx im Ordner mit Python in HTML aus
Fühlen Sie sich frei, das Legendenlabel mit Seaborn in Python zu ändern
Ich habe den Code geschrieben, um den Brainf * ck-Code in Python zu schreiben
[Einführung in Python] Wie verwende ich den Operator in in der for-Anweisung?
So überprüfen Sie die Speichergröße eines Wörterbuchs in Python
[Einführung in Python] Wie verwende ich eine Klasse in Python?
Überprüfen Sie das Verhalten des Zerstörers in Python
Allgemeine Relativitätstheorie in Python: Einführung
"Ein Buch zum Trainieren von Programmierkenntnissen für den Kampf in der Welt" Python-Code-Antwortbeispiel --1.4 Satzfolge
Beispiel einer dreidimensionalen Skelettanalyse von Python
Das Ergebnis der Installation von Python auf Anaconda
Grundlagen zum Ausführen von NoxPlayer in Python
Kapitel 1 Einführung in Python Schneiden Sie nur die guten Punkte des Deeplearning aus, die von Grund auf neu erstellt wurden
Auf der Suche nach dem schnellsten FizzBuzz in Python
Praktisches Beispiel für hexagonale Architektur in Python
Einführung in Vektoren: Lineare Algebra in Python <1>
Einführung in die Überprüfung der Wirksamkeit Kapitel 1 in Python geschrieben
[Einführung in Data Scientist] Grundlagen von Python ♬
[Einführung in Python] So sortieren Sie den Inhalt einer Liste effizient mit Listensortierung
Ich möchte das Ergebnis von "Zeichenfolge" .split () in Python stapelweise konvertieren
Ich möchte die abstrakte Klasse (ABCmeta) von Python im Detail erklären
Ich habe ein Programm erstellt, um die Größe einer Datei mit Python zu überprüfen
[Einführung in Python] Wie wird mit der continue-Anweisung wiederholt?
"Buch, um die Programmierfähigkeit zu trainieren, um in der Welt zu kämpfen" Python-Code-Antwortbeispiel --1.9 Drehung der Zeichenkette
Einführung von Python
Verwendung der C-Bibliothek in Python
Geben Sie die Anzahl der CPU-Kerne in Python aus
[Einführung in die Udemy Python3 + -Anwendung] 26. Kopie des Wörterbuchs
[Python] Sortieren Sie die Liste von pathlib.Path in natürlicher Reihenfolge
Einführung in die Überprüfung der Wirksamkeit Kapitel 3 in Python geschrieben
Zusammenfassung zum Importieren von Dateien in Python 3
Holen Sie sich den Aufrufer einer Funktion in Python
tse - Einführung in den Text Stream Editor in Python
Passen Sie die Verteilung jeder Gruppe in Python an
[Einführung in die Udemy Python3 + -Anwendung] 19. Kopie der Liste
Zeigen Sie das Ergebnis der Geometrieverarbeitung in Python an
Dynamisches Ersetzen der nächsten Methode in Python
Kopieren Sie die Liste in Python
Geschrieben "Einführung in die Effektüberprüfung" in Python
Zusammenfassung der Verwendung von MNIST mit Python
Zeichnen Sie Diagramme in Julia ... Überlassen Sie die Diagramme Python
Finden Sie den Bruchteil des in Python eingegebenen Werts heraus
Tipps zum Schreiben werden in Python kurz abgeflacht