2013-07-13 11 views
9

kullanarak gerçekleştiriyorum Bir matrisin ana bileşen analizi üzerinde çalışıyorum. Zaten bu bileşen matrisinde varimax rotasyonu gerçekleştirmek için gereken ancak döndürmek için kesin yöntem ve derecesini bulamadıkpython'da varimaks rotasyonunu

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

aşağıda gösterilen bileşen matrisi bulduk. Örneklerin çoğu R'de gösterilmiştir. Ancak python'da yönteme ihtiyacım var.

+1

+1 İyi bir soru, ben de aynı sorunla karşı karşıyayım .. – nKandel

cevap

7

Sen Python ile bir çok örnek bulabilirsiniz. İşte Wikipedia üzerine, sadece numpy kullanarak Python için bulunan bir örnektir: Geçenlerde kendi paket yaptığını ben, yığın-taşma üzerindeki piton pek çok kez faktör analizi yapmaya yönelik çözümler saygı duydum

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

Teşekkürler, çalışma –

+1

Bu argüman listesinde "gama = 1.0" olması gerektiğine inanıyorum. Aksi takdirde, SVD girişini hesaplarken "gama/p", tamsayı bölme olarak kabul edilir ve eğer p> 1 ise (bu tipik olarak) 0 ile sonuçlanır. –

+0

@rmg Bu, Python 3 değilse veya "__future__ import division" kaynağından 'kullanmaktadır. – gerrit

5

Wikipedia, python here'da bir örneğe sahiptir!

örnek Kaldırma ve Numpy için terzilik:

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

Aslında ben scipy ama thanx yerine neyse numpy kullanarak arıyordum. Ben zaten bu –

+2

@SteveBarnes: 'numpy.linalg.svd' içine baktım. –

+1

@Rajsubit: Bu örnekteki içe aktarma iki satıra dönüştürülebilir (ve büyük olasılıkla): "numpy.linalg import svd" ifadesinden numpy.linalg örneğinden numpy.linalg numol.de içe aktarma göz, asarray, nokta, toplam ve. –

1

, fa-kit. Bu eski bir yazı olmasına rağmen, gelecekte burayı google yoluyla alan başka biri varsa bu bağlantıyı atarım.

İlgili konular