机器学习降维:因子分析(Factor Analysis)超通俗完整版
因子分析是专门用来找"隐藏底层原因"的降维方法 。它不只是简单压缩维度,更能帮你从一堆指标里,挖出背后真正起作用的潜在因子,比如"学习能力""智力""幸福感""消费能力"这种没法直接测量的变量。
这篇文章用大白话+原理拆解+可运行代码+对比总结,把因子分析讲得通俗易懂,本科生、研究生都能轻松掌握。
一、先看懂:因子分析到底是什么?
1. 一句话理解
因子分析 = 从一堆可观测指标里,挖出少数几个"隐藏的潜在因子"
它认为:你看到的所有特征,都是由几个看不见的公共因子 + 噪声共同决定的。
2. 超通俗例子
你有学生的 6 个指标:
- 数学、语文、英语、艺术、体育、社交参与
这些指标背后其实只有 2 个隐藏因子:
- 学习能力(决定各科成绩)
- 活跃程度(决定体育、社交)
因子分析就是自动把这 2 个因子挖出来。
3. 和 PCA 最核心区别
- PCA:保方差、降维、不太好解释
- 因子分析:找潜在结构、可解释、带噪声模型
二、因子分析核心思想
模型公式(最简单版):
X=ΛF+ϵX = \Lambda F + \epsilonX=ΛF+ϵ
- XXX:你能看到的观测变量
- FFF:隐藏的公共因子
- Λ\LambdaΛ:因子载荷(每个变量受因子影响多大)
- ϵ\epsilonϵ:噪声/独特因子
思想总结:
所有可观测特征,都由少数几个隐藏因子 + 各自的噪声生成。
三、3 个关键概念(必须懂)
1. 因子载荷(Loading)
表示变量和因子的相关程度,绝对值越大,关系越强。
2. 因子旋转(Rotation)
让载荷向 0 或 1 靠拢,让因子更容易命名解释 。
常用:Varimax(正交旋转)
3. 因子得分(Score)
每个样本在隐藏因子上的取值,就是降维后的结果。
四、因子分析标准流程(一步不落)
- 数据标准化(必须做)
- 计算协方差矩阵
- 确定因子个数(碎石图/特征值>1)
- 估计因子载荷(最大似然/主成分法)
- 因子旋转(增强可解释性)
- 计算因子得分(降维完成)
- 解释并命名因子
五、实战代码:学生数据因子分析(可直接运行)
python
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.decomposition import FactorAnalysis, PCA
from sklearn.preprocessing import StandardScaler
# ====================== 1. 生成模拟数据 ======================
np.random.seed(42)
n_samples = 2000
data = {
'Math': np.random.normal(75, 10, n_samples),
'Science': np.random.normal(80, 12, n_samples),
'English': np.random.normal(70, 8, n_samples),
'Art': np.random.normal(65, 5, n_samples),
'Sport': np.random.normal(50, 15, n_samples),
'Social': np.random.normal(60, 10, n_samples)
}
df = pd.DataFrame(data)
# ====================== 2. 标准化 ======================
scaler = StandardScaler()
scaled = scaler.fit_transform(df)
# ====================== 3. 因子分析(提取2个因子) ======================
fa = FactorAnalysis(n_components=2, random_state=42)
factor_scores = fa.fit_transform(scaled)
# ====================== 4. 查看因子载荷 ======================
loadings = fa.components_.T
loadings_df = pd.DataFrame(
loadings,
index=df.columns,
columns=['Factor1', 'Factor2']
)
print("因子载荷矩阵:")
print(loadings_df.round(2))
# ====================== 5. 热力图可视化 ======================
plt.figure(figsize=(10, 5))
sns.heatmap(loadings_df, annot=True, cmap='coolwarm', center=0)
plt.title('因子载荷热力图')
plt.tight_layout()
plt.show()
# ====================== 6. 降维结果散点图 ======================
plt.figure(figsize=(8, 6))
plt.scatter(factor_scores[:, 0], factor_scores[:, 1], alpha=0.5, s=30)
plt.xlabel('Factor 1(学习能力)')
plt.ylabel('Factor 2(活跃程度)')
plt.title('因子分析降维结果')
plt.grid(alpha=0.3)
plt.show()
# ====================== 7. 和 PCA 对比 ======================
pca = PCA(n_components=2)
pca_scores = pca.fit_transform(scaled)
plt.figure(figsize=(8, 6))
plt.scatter(pca_scores[:, 0], pca_scores[:, 1], alpha=0.5, s=30, c='orange')
plt.xlabel('PCA 1')
plt.ylabel('PCA 2')
plt.title('PCA 降维结果')
plt.grid(alpha=0.3)
plt.show()
结果解释
- Factor1 :在数学、科学、英语上载荷高 → 学习能力
- Factor2 :在体育、社交上载荷高 → 活跃程度
完美挖出隐藏结构!
六、因子分析的优缺点(面试高频)
✅ 优点
- 可解释性极强:能挖出有实际意义的潜在因子
- 带噪声模型:把噪声单独分离,更符合真实数据
- 旋转优化:让因子更容易命名
- 适合社科/心理/教育/问卷:专门用来挖隐藏特质
❌ 缺点
- 假设严格:要求因子独立、数据近似正态
- 因子个数难确定:带主观性
- 命名依赖经验:不同人可能解释不同
- 只能线性:无法处理复杂非线性流形
七、因子分析 vs PCA(最清晰对比)
| 对比项 | 因子分析 FA | 主成分分析 PCA |
|---|---|---|
| 目标 | 找隐藏潜在因子 | 保最大方差 |
| 噪声 | 显式建模噪声 | 不区分噪声 |
| 可解释性 | 高,可命名 | 低,多为数学方向 |
| 旋转 | 支持,效果更好 | 一般不旋转 |
| 模型思想 | 生成式:观测=因子+噪声 | 投影式:线性组合 |
| 适用场景 | 问卷、心理、社科、找原因 | 通用降维、去冗余、提速 |
八、什么时候用因子分析?
✅ 推荐使用
- 你相信数据背后有隐藏因素(能力、态度、特质)
- 你需要可解释的维度,不只是黑箱降维
- 数据来自问卷、考试、评分、行为指标
- 社科、教育、心理、市场调研、用户画像
❌ 不推荐使用
- 数据明显非线性流形(瑞士卷、环形)
- 只需要快速降维,不关心解释
- 数据不符合正态假设
- 超大规模图像/文本高维数据
九、总结(一句话记住)
因子分析是"找隐藏原因"的降维工具,它能从一堆可观测指标里,自动挖出少数几个有实际意义的潜在因子,既降维又可解释,是社科、问卷、用户研究里最常用的降维方法。