Python使用factor_analyzer及碎石图做因子分析的特征值疑问
特征值计算与n_factors参数的作用说明
为什么得到的特征值数量和原始特征数一致
factor_analyzer包中,FactorAnalyzer类执行拟合时会先对输入的相关系数矩阵做完整的特征分解:维度为p×p的相关系数矩阵(这里p=432,即你的原始特征数),特征分解后天然会生成p个特征值,这一步是统计方法本身的固定逻辑,和你设置的拟合因子数没有任何关系。你获取的evs[0]就是全量特征分解得到的原始特征值数组,所以长度为432,其中155个大于1的结果是符合你的数据特征的正常输出。
初始设置n_factors=40的作用
你传入的第一个参数n_factors=40,仅作用于因子载荷矩阵的拟合阶段:当特征分解完成后,程序只会取前n_factors个特征值对应的因子来计算载荷、公共因子方差、特殊方差等后续拟合指标,不会影响前序全量特征值的计算。
你在探索因子数的阶段设置的40不会干扰碎石图的判断,后续你确定最优因子数为155后,重新初始化FactorAnalyzer传入155做带旋转的拟合即可。
代码补充说明
你提供的代码中缺少evs = fa.get_eigenvalues()这一行,这是获取特征值的标准调用方式,补充后逻辑即可闭环。
相关完整代码示例:
import numpy as np import pandas as pd import matplotlib.pyplot as plt from factor_analyzer import FactorAnalyzer # 你的相关系数矩阵corr已提前定义,特征数为432 fa = FactorAnalyzer(40, is_corr_matrix=True, rotation=None) fa.fit(corr) # 获取特征值:evs[0]为原始特征值,evs[1]为公共因子解释的特征值 evs = fa.get_eigenvalues() # 绘制碎石图 x = range(1, len(evs[0])+1) y = evs[0] n_useful_factors = sum(y>1) ones_x = np.arange(1, len(evs[0])+1, 0.25) ones_y = np.ones(len(ones_x)) plt.scatter(x,y) plt.plot(x,y) plt.plot(ones_x,ones_y) plt.title('Scree Plot') plt.xlabel(f'Features - {n_useful_factors} useful') plt.ylabel('Eigenvalue') plt.grid() plt.xlim(0,n_useful_factors*1.2) plt.show() print(len(evs), len(evs[0])) pd.DataFrame(evs)
碎石图效果:
内容的提问来源于stack exchange,提问作者ambose
相关产品推荐
相关产品推荐

