赞
踩
主成分分析在降维中主要是对原始变量进行线性组合,如 Y = AX , X ∈ R n × p \textbf Y =\textbf {AX},X\in \mathbf R^{n\times p} Y=AX,X∈Rn×p首先对原始数据进行标准化后取协方差矩阵所得的m个(或者说成m维数)较大的特征值 λ i \lambda_i λi,且满足 ∑ i m λ i p > 80 % \frac{\sum\limits_i^m \lambda_i}{p} > 80\% pi∑mλi>80%(通常意义下),则可以放心的将p维的数据降维成m维的,这在后续数据的处理中可以减少计算量及方便可视化。但主成分只涉及一般的变量变换,并且对降维后的数据进行解释较为困难。
设数据中的p个变量可以归功于m个因素(或m件事被分为有p个人做)
x
i
=
u
i
+
a
i
1
f
1
+
a
i
2
f
2
+
⋯
+
a
i
m
f
m
+
ε
i
x_i = u_i+a_{i1}f_1+a_{i2} f_2 +\cdots+a_{im}f_m+\varepsilon_i
xi=ui+ai1f1+ai2f2+⋯+aimfm+εi
采用矩阵的形式表示,
x
=
(
x
1
,
⋯
,
x
p
)
T
\mathbf x=(x_1,\cdots,x_p)^T
x=(x1,⋯,xp)T,公共因子
f
=
(
f
1
,
⋯
,
f
m
)
T
\mathbf f=(f_1,\cdots,f_m)^T
f=(f1,⋯,fm)T,特殊因子
ε
=
(
ε
1
,
⋯
,
ε
p
)
T
\mathbf \varepsilon=(\varepsilon_1,\cdots,\varepsilon_p)^T
ε=(ε1,⋯,εp)T;在处理前对数据进行标准化后变量均值
u
i
=
0
∀
i
=
1
,
2
,
⋯
,
p
u_i =0 \quad \forall i=1,2,\cdots ,p
ui=0∀i=1,2,⋯,p,
A
=
(
a
i
j
)
A=(a_{ij})
A=(aij)称为因子载荷矩阵。故可以表示为
x
=
A
f
+
ε
\mathbf x= A \mathbf f+\mathbf \varepsilon
x=Af+ε
下面我们作几个假设,并且可以说是显然的。
两边同时求方差可以得 Σ = A A T + D \Sigma = AA^T+D Σ=AAT+D,其中D=Var( ε \varepsilon ε)是对角阵.
初始化特殊方差
σ
i
2
\sigma_i^2
σi2,计算
Σ
−
D
\Sigma -D
Σ−D的特征值
λ
1
,
⋯
,
λ
m
\lambda_1,\cdots,\lambda_m
λ1,⋯,λm和线性无关的特征向量
t
1
,
⋯
,
t
m
t_1,\cdots,t_m
t1,⋯,tm,则前m个较大的组成A的主因子分解
A
^
=
(
λ
1
t
1
,
⋯
,
λ
m
t
m
)
\hat{A}=(\sqrt{\lambda_1}t_1,\cdots,\sqrt{\lambda_m}t_m)
A^=(λ1
t1,⋯,λm
tm)
再计算特殊因子方差
σ
i
2
=
1
−
h
i
2
\sigma_i^2 = 1- h_i^2
σi2=1−hi2,代入上式迭代知道所求主因子稳定即可.
当主因子仍不好解释时采用,正交因子旋转是对公共因子作用一个正交旋转变换, f ∗ = T T f f^*=T^Tf f∗=TTf,载荷矩阵相应的变为 A ∗ = A T A^* =AT A∗=AT。可以发现正交旋变换后结构不变。
以一个简单的例子展现python中factor_analyzer库中的因子分析
import pandas as pd
import numpy as np
from pandas import DataFrame,Series
from factor_analyzer import FactorAnalyzer
datafile = u'f:\\Factor\data.xls'
data = pd.read_excel(datafile)
data = data.fillna(0)#用0填充空值
fa = FactorAnalyzer()
fa.analyze(data, 5, rotation=None)#固定公共因子个数为5个
print("公因子方差:\n", fa.get_communalities())#公因子方差
print("\n成分矩阵:\n", fa.loadings)#成分矩阵
var = fa.get_factor_variance()#给出贡献率
print("\n解释的总方差(即贡献率):\n", var)
fa_score = fa.get_scores(data)#因子得分
fa_score.head()
#将各因子乘上他们的贡献率除以总的贡献率,得到因子得分中间值
a = (fa.get_scores(data)*var.values[1])/var.values[-1][-1]
#将各因子得分中间值相加,得到综合得分
a['score'] = a.apply(lambda x: x.sum(), axis=1)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。