You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 03:06:03