我正在寻找一种用Python展示旋转PCA组件矩阵的方法。
我编写了一个Python函数,该函数接受Pandas数据框并返回PCA Analysis的一些基本元素。我也有其他地方提到的“ varimax”旋转函数。但是,我似乎找不到任何可以显示“旋转”组件矩阵的东西。当前,PCA仅显示未旋转的组件加载矩阵。在下面的第一个函数中,x_comp2返回已排序的,未旋转的加载矩阵。相比之下,如果您要求“旋转”作为PCA或FA的一部分,SPSS(及其他)将返回旋转的加载矩阵。旋转的分量矩阵有助于解释加载到每个分量上的变量。
#function to run PCA analysis. yes, I'm sure this can be cleaner... first attempt. x is the name of the dataframe, n is the number of Principal Components to extract.
def pca(x, n):
pca = PCA(n_components=n)
l = len(x.columns)
x_pca = pca.fit(x.iloc[:,0:l])
pca_t = pca.transform(x.iloc[:,0:l])
e = pca.explained_variance_
x_comp = pd.DataFrame(x_pca.components_.T * np.sqrt(x_pca.explained_variance_))
x_comp['variable'] = np.array(x.columns[0:l])
x_comp1 = pd.DataFrame(x_comp.set_index('variable'))
x_comp2 = x_comp1.apply(lambda x: np.where(x < .2,'',round(x,2)))
x_comp2.sort_values([0,1], ascending=False)
var=pd.DataFrame(np.cumsum(np.round(x_pca.explained_variance_ratio_, decimals=3)*100))
return x_comp2, var, pca_t, e
#function to perform Varimax rotation
def varimax(Phi, gamma = 1.0, q = 20, tol = 1e-6):
from scipy import eye, asarray, dot, sum, linalg
p,k = Phi.shape
R = eye(k)
d=0
for i in range(q):
d_old = d
Lambda = dot(Phi, R)
u,s,vh = linalg.svd(dot(Phi.T,asarray(Lambda)**3 - (gamma/p) * dot(Lambda, np.diag(np.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)