主成分分析与因子分析-原理及python实现

下面两种算法一般都需标准化消除量纲影响

主成分分析(PCA)

目的

数据降维,将n维数据降为n’维数据。原数据 X : n × m , s a m p l e   p o i n t : ( x 1 , . . . , x n ) T , b a s e : { w 1 , . . . , w n } X:n\times m,sample\,point:(x_1,...,x_n)^T,base:\lbrace w_1,...,w_n\rbrace X:n×m,samplepoint:(x1,...,xn)T,base:{w1,...,wn}

转换到n‘维空间中, x ( i ) → z ( i ) = ( z i ( i ) , . . . , z n ′ ( i ) ) T x^{(i)}\rightarrow z^{(i)}=(z_i^{(i)},...,z_{n'}^{(i)})^T x(i)z(i)=(zi(i),...,zn(i))T对应n’维空间标准正交基: w ′ = { w ^ 1 ′ , . . . , w ^ n ′ ′ } = W : n × n ′ w'=\lbrace \hat w'_1,...,\hat w'_{n'}\rbrace=W:n\times n' w={w^1,...,w^n}=W:n×n

有: W T x ( i ) = z ( i ) W^Tx^{(i)}=z^{(i)} WTx(i)=z(i),n’维空间中数据还原到n维空间中有 W z ( i ) = x ˉ ( i ) Wz^{(i)}=\bar x^{(i)} Wz(i)=xˉ(i)

caution: W T W = E , W W T ≠ E , W T X = Z W^TW=E,WW^T\neq E,W^TX=Z WTW=E,WWT=E,WTX=Z

优化函数

使得降维后的数据与原数据距离和最小(尽可能维持原来位置,保持尽可能多的数据)
∑ i = 1 m ∣ ∣ x ˉ ( i ) − x ( i ) ∣ ∣ 2 2 = ∑ i = 1 m ∣ ∣ W z ( i ) − x ( i ) ∣ ∣ 2 2 = ∑ i = 1 m ( W z ( i ) ) T ( W z ( i ) ) − 2 ∑ i = 1 m ( W z ( i ) ) T x ( i ) + ∑ i = 1 m x ( i ) T x ( i ) = − ∑ i = 1 m z ( i ) T z ( i ) + ∑ i = 1 , x ( i ) T x ( i ) = − t r ( X T W W T X + X T X ) m i n ∑ i = 1 m ∣ ∣ x ˉ ( i ) − x ( i ) ∣ ∣ 2 2 ⇔ a r g m a x   t r ( X T W W T X ) , s . t . W T W = E \sum_{i=1}^m ||\bar x^{(i)}-x^{(i)}||_2^2\\ =\sum_{i=1}^m ||Wz^{(i)}-x^{(i)}||_2^2\\ =\sum_{i=1}^m (Wz^{(i)})^T(Wz^{(i)})-2\sum_{i=1}^m (Wz^{(i)})^Tx^{(i)}+\sum_{i=1}^m x^{(i)T}x^{(i)}\\ =-\sum_{i=1}^m z^{(i)T}z^{(i)}+\sum_{i=1}^,x^{(i)T}x^{(i)} =-tr(X^TWW^TX+X^TX)\\ min \sum_{i=1}^m ||\bar x^{(i)}-x^{(i)}||_2^2 \Leftrightarrow argmax\,tr(X^TWW^TX),s.t. W^TW=E i=1mxˉ(i)x(i)22=i=1mWz(i)x(i)22=i=1m(Wz(i))T(Wz(i))2i=1m(Wz(i))Tx(i)+i=1mx(i)Tx(i)=i=1mz(i)Tz(i)+i=1,x(i)Tx(i)=tr(XTWWTX+XTX)mini=1mxˉ(i)x(i)22argmaxtr(XTWWTX),s.t.WTW=E

用Lagrange函数求最优解:

因为: t r ( X T W W T X ) = t r ( W T X X T W ) tr(X^TWW^TX)=tr(W^TXX^TW) tr(XTWWTX)=tr(WTXXTW)

J = t r ( W T X X T W − Λ W T W ) = t r ( W T ( X X T − Λ I ) W ) J=tr(W^TXX^TW-\Lambda W^TW)=tr(W^T(XX^T-\Lambda I)W) J=tr(WTXXTWΛWTW)=tr(WT(XXTΛI)W)

∂ J ∂ W = 2 ( X X T − Λ I ) W = 0 ⇒ X X T W = Λ I W = Λ ′ W \frac{\partial J}{\partial W}=2(XX^T-\Lambda I)W=0 \Rightarrow XX^TW=\Lambda I W=\Lambda' W WJ=2(XXTΛI)W=0XXTW=ΛIW=ΛW 微分具体过程见Appendix

Λ ′ \Lambda' Λ是对角矩阵,对角线值为 X X T XX^T XXT的特征值

∑ i = 1 m ∣ ∣ x ˉ ( i ) − x ( i ) ∣ ∣ 2 2 = − t r ( Λ W T W ) − t r ( X T X ) \sum_{i=1}^m ||\bar x^{(i)}-x^{(i)}||_2^2=-tr(\Lambda W^TW)-tr(X^TX) i=1mxˉ(i)x(i)22=tr(ΛWTW)tr(XTX)

从而要使得上式最小则取 X X T XX^T XXT最大的n’个特征值作为 Λ i i \Lambda_{ii} Λii,对应n’特征向量 ( x ^ 1 , . . . x ^ n ′ ) (\hat x_1,...\hat x_{n'}) (x^1,...x^n)即为W

计算方式

  • 将X每个样本关于每个特征维度中心化得到 X ^ \hat X X^,从而 X ^ X ^ T = c o v ( X , X ) \hat X\hat X^T=cov(X,X) X^X^T=cov(X,X)

  • 计算协方差矩阵特征值选择最大的n’个,对应特征向量组成W

  • X转化 : Z = W T X Z=W^TX Z=WTX

Appendix

  • 对矩阵的迹求导计算方法可以先拆开成求和形式再求

在上述优化过程中求 W T ( X X T − Λ I ) W = W T A W = P W^T(XX^T-\Lambda I)W=W^TAW=P WT(XXTΛI)W=WTAW=P

t r ( P ) = ∑ p = 1 n ′ ∑ j = 1 n ∑ i = 1 n w j p a j i w i p tr(P)=\sum_{p=1}^{n'}\sum_{j=1}^n\sum_{i=1}^n w_{jp}a_{ji}w_{ip} tr(P)=p=1nj=1ni=1nwjpajiwip

∂ t r ( P ) ∂ w j p = ∑ i a j i w i p = [ A W ] j p \frac{\partial tr(P)}{\partial w_{jp}}=\sum_i a_{ji}w_{ip}=[AW]_{jp} wjptr(P)=iajiwip=[AW]jp

∂ t r ( P ) ∂ w i p = ∑ j w j p a j i = [ A T W ] i p \frac{\partial tr(P)}{\partial w_{ip}}=\sum_j w_{jp}a_{ji}=[A^T W]_{ip} wiptr(P)=jwjpaji=[ATW]ip

∂ t r ( P ) ∂ W = A W + A T W = 2 A W \frac{\partial tr(P)}{\partial W}=AW+A^TW=2AW Wtr(P)=AW+ATW=2AW

因子分析(FA)

目的

找到影响现有几个特征的影响因子,方便进行聚类。

以计量经济学对中国家庭金融调查CHFS中金融知识相关问题(是否了解利率,是否正确计算利率,对投资风险是否了解,是否了解投资相关概念),四个问题的回答构成样本 ( x 1 , x 2 , x 3 , x 4 ) (x_1,x_2,x_3,x_4) (x1,x2,x3,x4),其中12,34问题有极大相关性,则可以通过因子分析得到两个变量 ( F 1 , F 2 ) (F_1,F_2) (F1,F2)分布表示受访者对利率和投资的认识程度。因子分析将 x 1 , . . . , x 4 x_1,...,x_4 x1,...,x4转换为 F 1 , F 2 F_1,F_2 F1,F2,并得到相关信息。

过程

sample point: ( x 1 , . . . , x n ) (x_1,...,x_n) (x1,...,xn)
{ x 1 = a 11 F 1 + . . . + a 1 n ′ F n ′ + ϵ 1 . . . x n = a n 1 F 1 + . . . + a n n ′ F n ′ + ϵ n x = A F + E \begin{cases} x_1=a_{11}F_1+...+a_{1n'}F_{n'}+\epsilon_1\\ \qquad\qquad ...\\ x_n=a_{n1}F_1+...+a_{nn'}F_{n'}+\epsilon_n \end{cases} \\ x=AF+\Epsilon x1=a11F1+...+a1nFn+ϵ1...xn=an1F1+...+annFn+ϵnx=AF+E

检验是否适合因子分析
  • KMO检验

    K M O j = ∑ i ≠ j r i j 2 ∑ i ≠ j r i j 2 + ∑ i ≠ j u KMO_j=\frac{\sum_{i\neq j}r_{ij}^2}{\sum_{i\neq j }r_{ij}^2+\sum_{i\neq j}u} KMOj=i=jrij2+i=jui=jrij2

    R = [ r i j ] : c o r r e l a t i o n   m a t r i x R=[r_{ij}]:correlation \,matrix R=[rij]:correlationmatrix

    U = [ u i j ] : p a r t i a l   c o v a r i a n c e   m a t r i x U=[u_{ij}]:partial\,covariance\,matrix U=[uij]:partialcovariancematrix

    K M O = ∑ ∑ i ≠ j r i j 2 ∑ ∑ i ≠ j r i j 2 + ∑ ∑ i ≠ j u KMO=\frac{\sum\sum_{i\neq j}r_{ij}^2}{\sum\sum_{i\neq j }r_{ij}^2+\sum\sum_{i\neq j}u} KMO=i=jrij2+i=jui=jrij2

    其中对应偏相关系数的计算参考

    u越大表示该变量在其它方向投影越分散,从而对应KMO值越小,一般总体KMO值大于0.7较好,计量中使用因子分析KMO较小的值为避免影响总体结果建议删去

  • bartlett球形检验

    零假设为相关系数矩阵是单位矩阵,对应检验统计量(非常复杂)[参考](Bartlett’s test - Wikipedia)

因子的选择

因子分析中有很多确定因子变量的方法,如基于主成分模型的主成分分析和基于因子分析模型的主轴因子法、极大似然法、最小二乘法等,前者应用最为广泛

  • 主成分分析中一般取 X X T XX^T XXT前n’个最大的特征向量;在计量中,例如stata软件中默认取特征值大于1对应的因子
  • 在中心化之后 X X T XX^T XXT代表协方差,从而特征向量对应特征值即为方差贡献率,一般也取累计方差贡献率超过85%的前几个特征向量作为因子
因子旋转
  • 特征向量表示原来n个变量在特征向量对应新因子中的构成,如果对于新因子F1,例子中是否了解利率,是否正确计算利率 两个变量占比最大,我们可以说F1可以对利率问题回答情况做出解释。
  • 在上例中,如果F1,F2中四个问题占比没有明显差异,则为方便解释,使用旋转矩阵进行正交旋转,将F1,F2旋转为F1’,F2’使得对不同问题的解释性更突出。

因子旋转矩阵对应方差最大旋转矩阵,对应取值R为:
R V a r m a x = a r g m a x R ( ∑ j = 1 n ′ ∑ i = 1 n ( W R ) i j 4 − γ n ∑ j = 1 n ′ ( ∑ i = 1 n ( W R ) i j 2 ) 2 R_{Varmax}=argmax_{R}(\sum_{j=1}^{n'}\sum_{i=1}^n (W R)_{ij}^4-\frac{\gamma}{n}\sum_{j=1}^{n'}(\sum_{i=1}^n(W R)^2_{ij})^2 RVarmax=argmaxR(j=1ni=1n(WR)ij4nγj=1n(i=1n(WR)ij2)2
即使得任何一个因子只在少数变量上有高载荷,而在其它变量上的载荷几乎为0。

因子得分

在类似主成分分析的因子选取后,得到新的n’个因子 z ( i ) = W T x ( i ) z^{(i)}=W^Tx^{(i)} z(i)=WTx(i)

通过n’个新因子的方差贡献率 λ \lambda λ得到综合得分,即:

s c o r e i = ∑ j = 1 n ′ λ j z j ∑ j = 1 n ′ λ j score^i=\frac{\sum_{j=1}^{n'}\lambda_j z_j}{\sum_{j=1}^{n'}\lambda_j} scorei=j=1nλjj=1nλjzj

如果进行因子旋转则按照旋转后对应的 W ˉ = W × R , R : n ′ × n ′ \bar W=W\times R,\qquad R:n'\times n' Wˉ=W×R,R:n×n进行计算

程序

因子分析 stata程序

factor Q1_1 Q1_2 Q2_1 Q2_2 Q3_1 Q3_2, pcf
estat kmo
rotate
predict f1 f2 f3   #按照因子选择数
gen knowledge=(0.3083*f1+f2*0.2428+f3*0.1361)/(0.3083+0.2428+0.1361)#按照输出的因子载荷

主成分分析 python程序

参考

import numpy as np
from sklearn.decomposition import PCA
X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
pca = PCA(n_components=2)
newX = pca.fit_transform(X)     #=pca.fit(X) pca.transform(X)
invX = pca.inverse_transform(X)  #还原为Xbar
print(pca.explained_variance_ratio_)

因子分析 python程序

sklearn没有因子旋转相关函数,需要调用factor_analyzer这个包[具体API看文档](factor_analyzer package — factor_analyzer 0.3.1 documentation (factor-analyzer.readthedocs.io))

import factor_analyzer 
f=factor_analyzer.FactorAnalyzer
data=[[1,2,3,4],[23,33,44,55],[3,4,5,6],[12,44,56,77]]
f=f(rotation='varimax', n_factors=2, method='principal')
f.fit(data)
FactorAnalyzer(bounds=(0.005, 1), impute='median', is_corr_matrix=False,
               method='principal', n_factors=2, rotation='varimax',
               rotation_kwargs={}, use_smc=True)
 f.loadings_
array([[0.44773561, 0.89416599],
       [0.91066904, 0.41305279],
       [0.89686514, 0.44229149],
       [0.92472224, 0.38061092]])
f.get_communalities()#公因子方差:累计贡献率
array([0.99999999, 0.99993071, 0.99998885, 0.9999759 ])
  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值