2017-07-06 104 views
0

我從維基百科如何在python中使用varimax旋轉?

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) 

一個最大旋轉代碼,我使用這種方式:

varimax(X) ## X is a numpy array 

但它返回這樣的數字:2.4243244e-15!那不是我預期的答案

我應該改變其他參數?例如gamma或q? 我不熟悉varimax旋轉

回答

0

你可以發表一個例子,你用什麼作爲X的輸入以及你期待什麼樣的輸出?

from numpy import eye, asarray, dot, sum, diag 
from numpy.linalg import svd 

def varimax(Phi, gamma = 1, 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/d_old < tol: break 
    return dot(Phi, R) 

,使一些虛設部件來測試它是這樣的::

import numpy as np 

comps = np.linalg.svd(
    np.random.randn(100,10), 
    full_matrices=False 
    )[0] 

rot_comps = varimax(comps) 

print("Original components dimension {}".format(comps.shape)) 
print("Component norms") 
print(np.sum(comps**2, axis=0)) 

print("Rotated components dimension {}".format(rot_comps.shape)) 
print("Rotated component norms") 
print(np.sum(rot_comps**2, axis=0)) 

的輸入和輸出是

我通過在代碼中固定了縮進,這樣測試的代碼正如您所期望的那樣,100 x 10個單位規範陣列。

+0

另外:我已經看過了解決方案堆棧溢出的蟒蛇做因素分析了這麼多次,我最近做了我自己的包(它不能有這麼多的人都複製粘貼同樣的一件好事神祕最大旋轉例如到他們的項目......)總之,包生活[這裏](https://github.com/bmcmenamin/fa_kit),你可以將它安裝爲'PIP安裝FA-kit'。 – bmcmenamin