机器学习-一篇入门

【算法】一篇入门之-FA因子分析

作者 : 老饼 发表日期 : 2022-12-08 18:33:29 更新日期 : 2024-10-06 16:23:53
本站原创文章,转载请说明来自《老饼讲解-机器学习》www.bbbdata.com



因子分析FA是机器学习中常用的降维算法之一,它可以从数据中分解出隐因子

本文讲解因子分析的模型、思想以及损失函数等,并展示因子分析的具体使用例子

通过本文可以快速了解因子分析是什么,有什么用,以及如何使用因子分析进行降维




   01. 什么是因子分析    




本节快速了解因子分析是什么,用来干什么




     因子分析是干什么的     


因子分析FA(Factor Analysis)是机器学习中一种常用的因子提取、变量降维技术
它假设我们所观察到的数据是由隐变量与噪声混合生成的,如下:
 因子分析是什么
  用数学表示,则x与h的关系为:
 
  其中, 
即背后存在一些隐变量h,且这些隐变量h之间都是两两独立标准正态分布的
而我们所观察到的x则是由这些隐变量h与常量u、噪声e混合之后衍生出来的
而因子分析则希望根据追溯出隐变量的值,即还原出背后后原始的、纯粹的本质因子






        因子分析的用途     


因子分析与声源分解
声源分解就是因子分析应用的一个经典场景
 如下图所示,台上站着两个正在说话的人,并在台下三个不同方位放了3台录音机
 因子分析与声源分解
 台上的声音就是原始隐变量,而台下录制的声音就是我们事后能观察到的数据
 由于距离不同,录音机以不同的权重接收声源,并受环境中的噪声e影响
  而声源分解则是希望通过3个录音机录的数据,分解出两人的声音
因子分析与降维
因子分析在机器学习中也常常被用于降维,如下:
由于隐变量h是独立正态分布的,所以h的每个变量之间包含的信息更为"纯粹"
因此将x转换回h之后,所需要的变量往往更少,因此因子分析可以被用于降维
 因子分析用于降维
 需要注意,通过因子分析进行的降维是有损降维,因为  
因此,使用
来将隐因子转换回原始数据时,实际是忽略了噪声





    02. 因子分析的模型与求解    




本节讲解因子分析FA的模型表达式、损失函数以及求解主流程




     因子分析-模型表达式    


因子分析模型表达式-x与h的关系
因子分析假设由隐因子线性组合而成,并与常量、噪声叠加,如下:
   
其中, :观察到的数据                   
  :生成x的隐变量        
 :隐变量h的权重        
   :h生成x时叠加的常量
          :h生成x时叠加的噪声变量
  且有:
                 
          为对角矩阵
 解释:每个隐因子都是一个独立的正态分布随机变量,每个隐因子的方差都为1
    而每个x所受到的噪声也是独立的正态分布随机变量,但方差不一定相同
因子分析模型表达式-h与x的关系
在上述假设下,当知道时,最可能的取值为

 
 其中的是需要进行训练的参数
 
 
在求得后,也可以将因子分析模型简记为:
  
 其中
  
                                              






      因子分析的损失函数与求解      


因子分析的损失函数
因子分析的损失函数为最大化x的似然函数,如下:
 
 因子分析的求解流程
因子分析的求解过程是将依次调整到L的驻点位置,相当于依次优化
但由于 的驻点与无关,所以实际上 只需调整一次,然后再依次调整即可
 因子分析的求解算法主流程如下:
 因子分析的算法流程 
由于的驻点公式略为复杂,这里不再作展示
因子分析的具体求解及相关原理详见《》







    03. 因子分析使用示例     



本节展示因子分析的一个使用实例,以及代码实现




     因子分析-例子解说     


下面以iris鸢尾花数据为例,展示如何通过因子分析将iris的四个变量进行降维
 iris鸢尾花数据如下:
 因子分析例子-数据 
下面我们使用sklearn的FactorAnalysis来实现因子分析降维,具体代码如下:
from sklearn.decomposition import FactorAnalysis
from sklearn.datasets import load_iris
import numpy as np
import scipy
# -----训练模型-------
iris = load_iris()                                           # 加载iris数据
X    = iris.data                                             # 用iris数据作为X    
FA   = FactorAnalysis()                                      # 初始化因子分析模型
FA.fit(X)                                                    # 训练因子分析
h = FA.transform(X)                                          # 用模型提取X的隐因子h

# -----提取模型的参数-------
W = FA.components_                                           # 隐变量权重
D = FA.noise_variance_                                       # 噪声方差
u = FA.mean_                                                 # 阈值
A = (W/D).T@scipy.linalg.inv(np.eye(len(W)) + (W/D)@W.T)     # 计算模型系数
B = -u@A                                                     # 计算模型阈值
print('\n------使用因子分析函数求解W,D,u-----')
print(' W =\n',W)                                            # 隐变量权重                                
print('\n D =\n',D)                                          # 噪声方差
print('\n u =\n',u)                                          # 阈值
print('\n--------模型系数与阈值-----------')
print(' A =\n',A)                                            # 模型系数
print('\n B =\n',B)                                          # 模型阈值
print('\n 前10条数据的隐因子h=\n',h[:10,:])                  # 打印隐变量(h也可以由X@A+B求得)
运行结果如下:
 因子分析代码运行结果 
上述结果中,我们通过sklearn求得了因子分析模型中的D,W,u,
并进一步用D,W,u计算出模型的参数A,B,可知隐变量h与x的关系如下:
  
由于h之间是独立标准正态分布的,它的信息更为"纯粹"
因此x原本的四个变量,在h中只需两个变量就可以表示












 End 








联系老饼