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.
・ 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.
Ü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
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
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.
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)
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)
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
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)
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)
Ü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)
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()
Ich konnte fast das Gleiche zeichnen wie ein Lehrbuch. Ist es gut
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.
Yasushi Nagata, Masahiko Muchinaka Einführung in die multivariate Analysemethode Wissenschaft, 10. April 2001
Recommended Posts