effectuer la rotation de varimax en python en utilisant numpy

je travaille sur l'analyse en composantes principales d'une matrice. J'ai déjà trouvé la matrice des composants ci-dessous

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]])

j'ai besoin d'effectuer la rotation varimax dans cette matrice de composants mais n'ai pas pu trouver la méthode exacte et le degré de rotation. La plupart des exemples sont affichés en R. cependant, j'ai besoin de la méthode en python.

10
demandé sur Saullo G. P. Castro 2013-07-13 12:55:47

3 réponses

Vous pouvez trouver beaucoup d'exemples avec Python. Voici un exemple que j'ai trouvé pour Python en utilisant seulement numpyWikipédia:

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)
9
répondu Sudip Kafle 2016-12-23 15:59:30

Wikipédia a un exemple en python ici!

la Levée de l'exemple et en l'adaptant pour num PY:

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)
7
répondu Steve Barnes 2016-12-23 15:57:30

j'ai cherché des solutions pour faire l'analyse factorielle en python sur stack-overflow tellement de fois, que j'ai récemment fait mon propre paquet, fa-kit. Même si c'est un vieux post, je vomis ce lien au cas où il ya quelqu'un d'autre dans le futur qui arrive ici via google.

2
répondu bmcmenamin 2017-09-13 02:11:41