2013-07-13 23 views
9

Tôi đang nghiên cứu phân tích thành phần chính của ma trận. Tôi đã tìm thấy ma trận thành phần được hiển thị bên dướithực hiện phép quay varimax trong python bằng cách sử dụng numpy

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

Tôi cần thực hiện xoay vòng trong ma trận thành phần này nhưng không tìm được phương pháp và mức độ chính xác để xoay. Hầu hết các ví dụ được hiển thị trong R. Tuy nhiên tôi cần phương pháp trong python.

+1

+1 câu hỏi hay, tôi cũng phải đối mặt với cùng một vấn đề .. – nKandel

Trả lời

7

Bạn có thể tìm thấy rất nhiều ví dụ với Python. Dưới đây là một ví dụ tôi tìm thấy cho Python chỉ numpy sử dụng, trên 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

Cảm ơn bạn đang làm việc –

+1

Tôi tin rằng điều này nên là "gamma = 1.0" trong danh sách đối số. Nếu không, "gamma/p" khi tính toán đầu vào SVD sẽ được coi là phân chia số nguyên và sẽ dẫn đến 0 nếu p> 1 (thường là). –

+0

@rmg Trừ khi đây là Python 3 hoặc anh ta đang sử dụng 'từ __future__ bộ phận nhập khẩu'. – gerrit

5

Wikipedia có ví dụ trong python here!

nâng ví dụ và điều chỉnh nó cho 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

Thực ra tôi đang tìm kiếm bằng cách sử dụng numpy thay vì scipy nhưng thanx anyway. tôi đã xem xét điều đó –

+2

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

+1

@Rajsubit: Việc nhập khẩu trong ví dụ đó có thể được (và có lẽ nên được) thay đổi thành hai dòng: 'từ con mắt nhập khẩu gumpy, asarray, dot, sum' và' từ numpy.linalg import svd'. –

1

Tôi đã nhìn lên những giải pháp để thực hiện phân tích nhân tố trong python trên stack tràn rất nhiều lần, mà tôi gần đây đã gói riêng tôi, fa-kit. Mặc dù đây là một bài viết cũ, tôi đang ném lên liên kết này trong trường hợp có ai khác trong tương lai mà được ở đây thông qua google.

Các vấn đề liên quan