Ich versuche, PCA Bilder using this code by Alyssa in Python zu berechnen.Erste zwei Hauptkomponenten sind umgekehrt
# Read the image into palmFingers_mask:
# we use PCA and otain 2 principal components
y, x = np.nonzero(palmFingers_mask)
# Subtract mean from each dimension
x = x - np.mean(x)
y = y - np.mean(y)
coords = np.vstack([x, y])
# Covariance matrix and its eigenvectors and eigenvalues
cov = np.cov(coords)
evals[:,frm_cnt], evecs = np.linalg.eig(cov)
# Sort eigenvalues in decreasing order
sort_indices = np.argsort(evals[:,frm_cnt])[::-1]
evec1[:,frm_cnt], evec2[:,frm_cnt] = evecs[:, sort_indices]
x_v1, y_v1 = evec1[:,frm_cnt] # Eigenvector with largest eigenvalue
x_v2, y_v2 = evec2[:,frm_cnt]
# Plot the principal components
scale = 20
plt.figure(1)
plt.plot(x, y, 'y.')
plt.plot([x_v1*-scale*2, x_v1*scale*2],
[y_v1*-scale*2, y_v1*scale*2], color='red')
plt.plot([x_v2*-scale, x_v2*scale],
[y_v2*-scale, y_v2*scale], color='blue')
plt.axis('equal')
plt.gca().invert_yaxis() # Match the image system with origin at top left
plt.show()
Ich markiere die zwei Achsen mit roten und blauen Linien (rot ist die größere Komponente, die Länge der Linien bedeutet nichts).
Während Dabei stieß ich auf einen fehlerhaften Fall, unten gezeigt:
Wie kann es möglich sein? Dies zeigt, dass der rote Eigenvektor größer ist, aber intuitiv sollte dies nicht der Fall sein. Die Achsen (entlang der blauen Linie) sollten größer sein, richtig? Für alle anderen Bilder in meiner Datenbank sehe ich, dass die Achsen korrekt sind. Nur für dieses Bild ist es vertauscht; Ich habe das Eingabebild angehängt (Img 209.png)
Gibt es etwas falsch in meinem Verständnis?
Dies ist, was ich erwarten:
Zum Beispiel habe ich BinImg_20.png angebracht, für die es funktioniert.
Attached files are on Dropbox.
Vorgeschlagene Änderung der Blog-Seite: https://github.com/alysaq/alysaq.github.io/pull/4 – MvG