2013-07-13 4 views
9

Ich arbeite an Hauptkomponentenanalyse einer Matrix. Ich habe bereits festgestellt, die Komponentenmatrix unterFühren Sie Varimax-Rotation in Python mit numpy

gezeigt
A = np.array([[-0.73465832 -0.24819766 -0.32045055] 
       [-0.3728976 0.58628043 -0.63433607] 
       [-0.72617152 0.53812819 -0.22846634] 
       [ 0.34042864 -0.08063226 -0.80064174] 
       [ 0.8804307 0.17166265 0.04381426] 
       [-0.66313032 0.54576874 0.37964986] 
       [ 0.286712 0.68305196 0.21769803] 
       [ 0.94651412 0.14986739 -0.06825887] 
       [ 0.40699665 0.73202276 -0.08462949]]) 

Ich brauche Varimax Rotation in dieser Komponente Matrix auszuführen, konnte aber nicht die genaue Methode und Grad zu drehen finden. Die meisten Beispiele sind in R dargestellt. Allerdings brauche ich die Methode in Python.

+1

+1 gute Frage, ich habe auch das gleiche Problem .. – nKandel

Antwort

7

Sie viele Beispiele mit Python finden. Hier ist ein Beispiel, das ich für Python mit nur numpy gefunden, auf Wikipedia:

def varimax(Phi, gamma = 1, q = 20, tol = 1e-6): 
    from numpy import eye, asarray, dot, sum, diag 
    from numpy.linalg import svd 
    p,k = Phi.shape 
    R = eye(k) 
    d=0 
    for i in xrange(q): 
     d_old = d 
     Lambda = dot(Phi, R) 
     u,s,vh = svd(dot(Phi.T,asarray(Lambda)**3 - (gamma/p) * dot(Lambda, diag(diag(dot(Lambda.T,Lambda)))))) 
     R = dot(u,vh) 
     d = sum(s) 
     if d/d_old < tol: break 
    return dot(Phi, R) 
+0

Danke jetzt seine Arbeit –

+1

Ich glaube, das sollte "Gamma = 1.0" in der Argumentliste sein. Andernfalls wird das "gamma/p" bei der Berechnung der SVD-Eingabe als ganzzahlige Division behandelt und führt zu 0, wenn p> 1 ist (was normalerweise der Fall ist). –

+0

@rmg Es sei denn, das ist Python 3 oder er benutzt 'from __future__ import division'. – gerrit

5

Wikipedia hat ein Beispiel in Python here!

Heben Sie das Beispiel und Schneider es für numpy:

from numpy import eye, asarray, dot, sum, diag 
from numpy.linalg import svd 
def varimax(Phi, gamma = 1.0, q = 20, tol = 1e-6): 
    p,k = Phi.shape 
    R = eye(k) 
    d=0 
    for i in xrange(q): 
     d_old = d 
     Lambda = dot(Phi, R) 
     u,s,vh = svd(dot(Phi.T,asarray(Lambda)**3 - (gamma/p) * dot(Lambda, diag(diag(dot(Lambda.T,Lambda)))))) 
     R = dot(u,vh) 
     d = sum(s) 
     if d_old!=0 and d/d_old < 1 + tol: break 
    return dot(Phi, R) 
+0

Eigentlich wollte ich mit numpy anstelle von scipy, aber danke sowieso. Ich habe schon in die –

+2

@SteveBarnes: 'numpy.linalg.svd' geschaut. –

+1

@Rajsubit: Der Import in diesem Beispiel kann (und sollte wahrscheinlich) in zwei Zeilen geändert werden: 'von numpy import eye, asarray, dot, sum' und' from numpy.linalg import svd'. –

1

ich geschaut habe up-Lösungen zu tun Faktoranalyse in Python auf Stack-Überlauf so viele Male, dass ich vor kurzem mein eigenes Paket gemacht, fa-kit. Auch wenn es sich um einen alten Post handelt, gebe ich diesen Link für den Fall auf, dass noch jemand in der Zukunft über Google kommt.