2013-07-13 57 views
9

私は行列の主成分分析を行っています。私はすでに私はこの成分行列にバリマックス回転を実行する必要がなく、回転する正確な方法及び程度を見つけることができなかったnumpyを使ってPythonでバリマックスローテーションを実行

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

下記に示す成分マトリックスを発見しました。ほとんどの例はRで示されていますが、私はPythonでメソッドが必要です。

+1

+1良い質問ですが、私も同じ問題に直面しています。 – nKandel

答えて

7

あなたは、Pythonでの例をたくさん見つけることができます。ここで私はWikipediaに、唯一numpy使ってPython見つかり例である:私は最近、自分のパッケージを作ったことを、私は、スタックオーバーフローの上にPythonで非常に多くの時間を因子分析を行うためのソリューションを見てきました

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

ありがとうございました –

+1

私はこれが引数リストの "gamma = 1.0"であるべきだと思います。それ以外の場合、SVD入力を計算する際の「ガンマ/ p」は整数除算として扱われ、p> 1ならば0になります(通常はそれです)。 –

+0

@rmgこれがPython 3でないか、彼は 'from __future__ import division'を使用しています。 – gerrit

5

ウィキペディアはpythonで例を示していますhere

例を持ち上げて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

実際には、私はscipyの代わりにnumpyを使用していましたが、とにかくthanxです。私はすでに –

+2

@SteveBarnes: 'numpy.linalg.svd'を調べました。 –

+1

@Rajsubit:その例のインポートは、 'from numpy import eye、asarray、dot、sum'と' numpy.linalg import svd'という2つの行に変更することができます。 –

1

は、 fa-kit。これは古い投稿ですが、Googleを介してここに来る他の誰かがいる場合に備えて、このリンクを投げかけています。

関連する問題