2017-12-14 5 views
0

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:

enter image description here

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:

enter image description here

Zum Beispiel habe ich BinImg_20.png angebracht, für die es funktioniert.

Attached files are on Dropbox.

Antwort

2

ich das Problem, sagen würde, ist hier:

evec1, evec2 = evecs[:, sort_indices] 

An diesem Punkt haben Sie

evecs = [[ 0.70926191 0.70494507] 
     [-0.70494507 0.70926191]] 
evec1 = [ 0.70926191 0.70494507] 
evec2 = [-0.70494507 0.70926191] 

Die Indizierung von sort_indices richtig dieSpalten sortiert. Aber die Entpackungsaufgabe entpackt sich dann durch Zeilen, was zu dem Fehler führt, den Sie beobachtet haben.

Siehe auch the documentation for numpy.linalg.eig dem es heißt:

v: (..., M, M) array - Die normierte (Einheit „length“) Eigenvektoren, derart, dass die Spalte v[:,i] wird der Eigenvektor mit dem entsprechenden Eigenwert w[i].

Und die tutorial schreibt:

Iterieren über mehrdimensionale Arrays in Bezug auf die erste Achse


ich einige Cross-checking in R tat getan wird, um stellen Sie sicher, dass die Berechnung als solche vernünftig ist und die Eigenvektoren so sind, wie Sie es erwarten würden. Wenn Sie interessiert sind, hier ist die Eingabe und Ausgabe von diesem, mit der Mitte um eins als R macht 1-basierte Indizierung.

> install.packages("pixmap") 
> library(pixmap) 
> pix <- read.pnm("BinImg_209.pbm") 
> mask = which([email protected] != 0, arr.ind=T) 
> mask = data.frame(x=mask[,"col"], y=mask[,"row"]) 
> prcomp(mask)   # single step principal component analysis 
Standard deviations (1, .., p=2): 
[1] 117.84952 44.23114 

Rotation (n x k) = (2 x 2): 
     PC1  PC2 
x 0.7092619 0.7049451 
y -0.7049451 0.7092619 

> cov <- cov.wt(mask) # manual covariance computation 
> cov     # show computed data 
$cov 
      x   y 
x 7958.874 -5965.947 
y -5965.947 7886.030 

$center 
     x  y 
593.1907 519.1019 

$n.obs 
[1] 47909 

> eigen(cov$cov)  # manual computation of eigenvectors 
eigen() decomposition 
$values 
[1] 13888.510 1956.394 

$vectors 
      [,1]  [,2] 
[1,] -0.7092619 -0.7049451 
[2,] 0.7049451 -0.7092619 

Auch hier die Spalten der vectors Matrix sind die Eigenvektoren. Die Rotationsmatrix in prcomp ist deutlicher gekennzeichnet: die Spalten sind Hauptkomponenten, die Zeilen sind Originalkoordinaten.

+0

Vorgeschlagene Änderung der Blog-Seite: https://github.com/alysaq/alysaq.github.io/pull/4 – MvG

Verwandte Themen