Python之因子分析詳細步驟

1.數學原理

1.1數學模型

1.2正交因子模型假設

注意:下面的推導都是基于這一假設。因此,這里的模型都是屬于正交因子模型

1.3正交因子模型的協方差結構

1.4各類方差貢獻的介紹

? ? ? ?在1.3正交因子模型的協方差結構中,我們介紹了“方差貢獻”,下面給出關于“方差貢獻”更詳細的介紹。

1.5因子表示具有不唯一性

? ? ? ? 利用此性質,我們可以選擇不同的正交矩陣T_{m\times m},做以下操作:?

?從而獲得容易解釋的載荷矩陣和因子。

? ? ? ? 這一操作被稱為“因子旋轉”。

因子旋轉的類型

? ? ? ?因子載荷的正交變換和伴隨的因子正交變換為因子正交旋轉

???????進一步地, 可以修改正交因子模型, 允許共同因子之間相關, 稱這樣的變換為因子斜交旋轉(bolique rotation)。 如果中的矩陣不是正交陣, 則中的各個公共因子可能相關,但公共因子的方差仍要求等于1。

因子分析中常用的正交旋轉和斜交旋轉方法:

  • varimax旋轉:正交旋轉方法, 要求每個因子僅有少數絕對值較大的載荷, 多數載荷接近0。 通過迭代最小化載荷系數的一個二次函數實現。 結果使得每個因子僅與少數原始變量有強相關, 而與其余原始變量近似不相關。
  • quartimax旋轉:正交旋轉方法, 要求每個原始變量僅與一個公共因子強相關, 而與其余公共因子近似不相關。 不如varimax接受程度高。
  • oblimin旋轉:斜交旋轉方法, 追求載荷陣中0盡可能多, 設置公共因子之間的相關系數在較小值。
  • promax旋轉:斜交旋轉方法, 追求載荷陣中0盡可能多, 方法是取正交旋轉得到的載荷陣元素的冪次。 要求冪次盡可能低, 公共因子間的相關性盡可能低。

1.6計算因子得分

? ? ? ? 在1.1數學模型中,我們建立了如下模型:

因子分析中, 首先要得到因子載荷陣, 對因子進行解釋。

其次,可以從數據中估計公共因子的取值(注意公共因子在模型中是不可觀測的,或者說是未知的)。 公共因子的取值的估計稱為因子得分。?

注意:在模型中,m<p,因此無法得到公共因子的精確值(即:因子得分),只能估計。

? ? ? 常使用加權最小二乘法估計因子得分。

加權最小二乘法估計因子得分

? ? ? ? 得到因子得分后,就可以利用因子得分進行其他分析。

2.Python代碼實現

關鍵的庫:factor_analyzer、scipy

下面用這個例子來說明Python中實現因子分析的步驟?

?

2.0導入庫和數據

import numpy as np
from numpy.linalg import inv
import pandas as pd
from scipy.stats import zscore
from  factor_analyzer import FactorAnalyzer as FA
from factor_analyzer.factor_analyzer import calculate_bartlett_sphericity  # 用于Bartlett's球狀檢驗
from factor_analyzer.factor_analyzer import calculate_kmo  # 用于KMO檢驗# 導入數據
data=np.loadtxt("data12_5_1.txt")
print(data)

2.1數據標準化

zscore()

# 數據標準化
data_norm=zscore(data,ddof=1)

對應的數學公式:

2.2Bartlett's球狀檢驗和KMO檢驗

  1. Bartlett's球狀檢驗:計算巴特利特P值
    ? ? ? ?若P值<0.05,則說明變量間有相關性,則可因子分析
  2. KMO檢驗:計算KMO值
    ? ? ? ?KMO值介于0~1之間,越接近1,說明變量間相關性越強,偏相關性越弱,因子分析的效果越好。
    ? ? ? ?若KMO值>0.6,說明變量間有相關性,則可因子分析。
# Bartlett's球狀檢驗:計算巴特利特P值
chi_square_value,p_value=calculate_bartlett_sphericity(data_norm)
print("Bartlett's球狀檢驗:\n","卡方值:",chi_square_value,"\nP值(若<0.05,則說明變量間有相關性,則可因子分析):",p_value)# KMO檢驗:計算KMO值
kmo_all,kmo_model=calculate_kmo(data_norm)
print("\nKMO(KMO值介于0~1之間,越接近1,說明變量間相關性越強,偏相關性越弱,因子分析的效果越好。\n""若KMO值>0.6,說明變量間有相關性,則可因子分析):",kmo_model)

2.3求相關系數矩陣?

np.corrcoef()

# 求相關系數矩陣
r=np.corrcoef(data_norm.T)

對應的數學公式及分析:

2.4求相關系數矩陣的特征值、特征向量,并排序

法一:np.linalg.eig(r)

  • 注意:此法得到的特征值沒有按從大到小的順序排列,需要自行排序
  • 排序的目的:后面需要利用特征值來求累積貢獻率,然后利用累積貢獻率\geqslant85%來挑選前n個公共因子。只有這樣,才能保證挑選出來公共因子,既能代表較多的信息,又數量較少。
# 求相關系數矩陣的特征值、特征向量
eigval,eigvec=np.linalg.eig(r)
print("特征值:\n",eigval)
print("特征向量:\n",eigvec)# 對特征值、特征向量按從大到小排序
address_sort=np.argsort(-eigval)
result_sort=np.zeros(len(eigval))
result_sort[address_sort]=np.arange(0,len(eigval))
result_sort=[int(i) for i in result_sort]
print("特征值從大到小的順序",result_sort)eigval=eigval[result_sort]
eigvec=eigvec[:,result_sort]
print("排序后的特征值:\n",eigval)
print("排序后的特征向量:\n",eigvec)

?法二:建立一個不旋轉的因子分析模型,再利用FA.get_eigenvalues()

注意:此法會得到2組特征值,但只有第一組是需要的,本人不太清楚是為什么

優點:得到的特征值已經按從大到小的順序排列

fa0=FA(n_factors=len(r),rotation=None)
fa0.fit(data_norm)
val1,val2=fa0.get_eigenvalues()  # 注意:這里會得到2組特征值,但只有第一組是需要的
print("fa0的特征值:\n",val1)

2.5求累積貢獻率

contibute_ratio=eigval/sum(eigval)
print("貢獻率:\n",contibute_ratio)
print("累積貢獻率:\n",np.cumsum(contibute_ratio))

?對應的數學公式及分析:

2.6選公共因子數量

選取累積貢獻率達到85%以上的前n個公共因子?

'''由于前3個公共因子的累計貢獻率已經超過0.85,
因此認為用3個公共因子 就能較好地進行評價'''
n=3

2.7構建并訓練模型

FA(n_factors,rotation)

# 構建模型
fa=FA(n_factors=n,rotation="varimax")
'''FA
參數解讀:
n_factors:公共因子數
rotation:因子旋轉方式
有以下的選擇:
varimax (orthogonal rotation):正交旋轉方法,方差最大化
promax (oblique rotation):斜交旋轉方法,追求載荷陣中0盡可能多,方法是取正交旋轉得到的載荷陣元素的冪次。要求冪次盡可能低,公共因子間的相關性盡可能低。
oblimin (oblique rotation)斜交旋轉方法,追求載荷陣中0盡可能多,設置公共因子之間的相關系數在較小值。
oblimax (orthogonal rotation)
quartimin (oblique rotation)
quartimax (orthogonal rotation)正交旋轉方法,要求每個原始變量僅與一個公共因子強相關,而與其余公共因子近似不相關。 
equamax (orthogonal rotation)
'''
fa.fit(data_norm)  # 訓練模型

2.8因子載荷矩陣

FA.loadings_

factor_load=fa.loadings_
print("因子載荷矩陣:\n",factor_load)

?對應的數學公式及分析:

?2.9求各類方差貢獻

# 各因子對總方差貢獻
factor_contribute=np.sum(factor_load**2,axis=0)
print("各因子對總方差貢獻:\n",factor_contribute)# 共性方差
same_variance=np.sum(factor_load**2,axis=1)# 特殊方差
specific_variance=1-same_variance  # 如果數據已經標準化,則 共性方差+特殊方差=1
print("特殊方差:\n",specific_variance)

2.10求因子得分

法一:自己用矩陣運算

# 求因子得分
ss=inv(np.diag(specific_variance))  # 因子得分函數的一部分
factor_score=data_norm@ss@factor_load@inv(factor_load.T@ss@factor_load)
print("因子得分:\n",factor_score)

法二:FA.transform()

# 計算因子得分
factor_score=fa.transform(data_norm)
print("因子得分:\n",factor_score)

?注意:兩種方法求出的因子得分有一些差別,具體原因不明。

對應的數學公式及分析:

? ? ? 至此,因子分析的步驟已經完成!

? ? ? 下面用因子得分進行評價

2.11計算評價得分?

# 計算評價得分
evaluate=factor_score@factor_contribute/sum(factor_contribute)  # 以 各因子對總方差貢獻 為權重,求因子得分的加權平均,即可得到評價得分
print("評價得分:\n",evaluate)

對應的數學公式及分析:

2.12按評價得分排序?

address_sort=np.argsort(-evaluate)
result_sort=np.zeros(17)
result_sort[address_sort]=np.arange(1,18)
print("排名次序:\n",result_sort)

2.13代碼匯總

import numpy as np
from numpy.linalg import inv
import pandas as pd
from scipy.stats import zscore
from  factor_analyzer import FactorAnalyzer as FA
from factor_analyzer.factor_analyzer import calculate_bartlett_sphericity  # 用于Bartlett's球狀檢驗
from factor_analyzer.factor_analyzer import calculate_kmo  # 用于KMO檢驗# 導入數據
data=np.loadtxt("data12_5_1.txt")
print(data)# 數據標準化
data_norm=zscore(data,ddof=1)# Bartlett's球狀檢驗:計算巴特利特P值
chi_square_value,p_value=calculate_bartlett_sphericity(data_norm)
print("Bartlett's球狀檢驗:\n","卡方值:",chi_square_value,"\nP值(若<0.05,則說明變量間有相關性,則可因子分析):",p_value)# KMO檢驗:計算KMO值
kmo_all,kmo_model=calculate_kmo(data_norm)
print("\nKMO(KMO值介于0~1之間,越接近1,說明變量間相關性越強,偏相關性越弱,因子分析的效果越好。\n""若KMO值>0.6,說明變量間有相關性,則可因子分析):",kmo_model)# 求相關系數矩陣
r=np.corrcoef(data_norm.T)# 求相關系數矩陣的特征值、特征向量
eigval,eigvec=np.linalg.eig(r)
print("特征值:\n",eigval)
print("特征向量:\n",eigvec)# 對特征值、特征向量按從大到小排序
address_sort=np.argsort(-eigval)
result_sort=np.zeros(len(eigval))
result_sort[address_sort]=np.arange(0,len(eigval))
result_sort=[int(i) for i in result_sort]
print("特征值從大到小的順序",result_sort)eigval=eigval[result_sort]
eigvec=eigvec[:,result_sort]
print("排序后的特征值:\n",eigval)
print("排序后的特征向量:\n",eigvec)contibute_ratio=eigval/sum(eigval)
print("貢獻率:\n",contibute_ratio)
print("累積貢獻率:\n",np.cumsum(contibute_ratio))# 用此法也能獲得相關系數矩陣的特征值
fa0=FA(n_factors=len(r),rotation=None)
fa0.fit(data_norm)
val1,val2=fa0.get_eigenvalues()  # 注意:這里會得到2組特征值,但只有第一組是需要的?
print("fa0的特征值:\n",val1)'''由于前3個公共因子的累計貢獻率已經超過0.85,因此認為用3個公共因子 就能較好地進行評價'''
n=3
# 構建模型
fa=FA(n_factors=n,rotation="varimax")
'''FA
參數解讀:
n_factors:公共因子數
rotation:因子旋轉方式
有以下的選擇:
varimax (orthogonal rotation):正交旋轉方法,方差最大化
promax (oblique rotation):斜交旋轉方法,追求載荷陣中0盡可能多,方法是取正交旋轉得到的載荷陣元素的冪次。要求冪次盡可能低,公共因子間的相關性盡可能低。
oblimin (oblique rotation)斜交旋轉方法,追求載荷陣中0盡可能多,設置公共因子之間的相關系數在較小值。
oblimax (orthogonal rotation)
quartimin (oblique rotation)
quartimax (orthogonal rotation)正交旋轉方法,要求每個原始變量僅與一個公共因子強相關,而與其余公共因子近似不相關。 
equamax (orthogonal rotation)
'''
fa.fit(data_norm)  # 訓練模型factor_load=fa.loadings_
print("因子載荷矩陣:\n",factor_load)# 各因子對總方差貢獻
factor_contribute=np.sum(factor_load**2,axis=0)
print("各因子對總方差貢獻:\n",factor_contribute)# 共性方差
same_variance=np.sum(factor_load**2,axis=1)
# 特殊方差
specific_variance=1-same_variance  # 如果數據已經標準化,則 共性方差+特殊方差=1
print("特殊方差:\n",specific_variance)# 求因子得分
ss=inv(np.diag(specific_variance))  # 因子得分函數的一部分
factor_score=data_norm@ss@factor_load@inv(factor_load.T@ss@factor_load)
print("因子得分:\n",factor_score)
print("因子得分2:\n",fa.transform(data_norm))# 計算評價得分
evaluate=factor_score@factor_contribute
print("評價得分:\n",evaluate)address_sort=np.argsort(-evaluate)
result_sort=np.zeros(17)
result_sort[address_sort]=np.arange(1,18)
print("排名次序:\n",result_sort)

參考資料

9 因子分析 | 多元統計分析講義 (pku.edu.cn)

Python數學建模算法與應用 (司守奎,孫璽菁主編)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/62464.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/62464.shtml
英文地址,請注明出處:http://en.pswp.cn/web/62464.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

unity3d—demo(2d人物左右移動發射子彈)

目錄 人物代碼示例&#xff1a; 子彈代碼示例&#xff1a; 總結上面代碼&#xff1a; 注意點&#xff1a; 人物代碼示例&#xff1a; using System.Collections; using System.Collections.Generic; using UnityEngine;public class PlayerTiao : MonoBehaviour {public f…

linux之vim

一、模式轉換命令 vim主要有三種模式&#xff1a;命令模式&#xff08;Normal Mode&#xff09;、輸入模式&#xff08;Insert Mode&#xff09;和底線命令模式&#xff08;Command-Line Mode&#xff09;。 從命令模式切換到輸入模式&#xff1a;i&#xff1a;在當前光標所在…

顯存和GPU之間的通信;GPUDirect P2P,NVLink,NCCL;聚合通信和點對點通信

目錄 顯存和GPU之間的分配 顯存和GPU之間的通信 原語是什么,簡單舉例說明 GPUDirect P2P,NVLink,NCCL的全稱及解釋 聚合通信和點對點通信 聚合通信(Collective Communication) 點對點通信(Point-to-Point Communication) 為什么使用GPUDirect P2P,NVLink,NCCL…

Mysql 的 B+ 樹是否包含行數據?

在 MySQL 中&#xff0c;是否在 B樹 的葉子節點上存儲完整的行數據&#xff0c;取決于使用的 存儲引擎 和 索引類型&#xff1a; 聚簇索引 (Clustered Index) 葉子節點包含完整的行數據。 適用場景&#xff1a;MySQL InnoDB 存儲引擎的主鍵索引&#xff08;或聚簇索引&#xf…

【記錄】用JUnit 4的@Test注解時報錯java.lang.NullPointerException的原因與解決方法

項目場景&#xff1a; 在練習黑馬點評的邏輯過期解決緩存擊穿時&#xff0c;編寫了一個預熱緩存數據的單元測試 SpringBootTest public class HmDianPingApplicationTests {Resourceprivate ShopServiceImpl shopService;Testpublic void testSaveShop() throws InterruptedE…

echarts使用整理

4、條形分區統計 <div ref"chartsVal1" class"chartsline-div"></div> const chartsVal1 ref(null); const chartsVal1Title ref(運行時間統計);drewCharts2(chartsVal1, chartsVal1Title.value);function drewCharts2(id, title) {const m…

【八股】HTTP

瀏覽器輸入URL之后發生的過程 瀏覽器解析URL中的協議&#xff0c;主機&#xff0c;端口&#xff0c;路徑參數等DNS域名解析得到對應的IP地址通過IP和PORT對服務器發送TCP三次握手建立連接瀏覽器發送請求服務器接受請求&#xff0c;處理并響應瀏覽器得到HTTP響應&#xff0c;對…

torch.optim.lr_scheduler.ReduceLROnPlateau

torch.optim.lr_scheduler.ReduceLROnPlateau 是 PyTorch 中的一種學習率調度器&#xff0c;主要用于在模型訓練過程中根據某些指標&#xff08;如驗證損失&#xff09;動態調整學習率。它是一種基于性能指標動態調整學習率的策略&#xff0c;而不是預定義的固定時間調整。 主要…

ubuntu下的chattts 學習6:音色固定的學習

魔搭社區 該區提供了隨機種子級音樂的試聽與下載。 spk torch.load(<PT-FILE-PATH>) params_infer_code {spk_emb: spk, } 略 測試過程&#xff1a; 1.先建一個文件夾&#xff1a;然后從上面的網站上下載了兩個。放在里面測試 2 2.測試代碼 import ChatTTS impo…

數據集的重要性:如何構建AIGC訓練集

文章目錄 一、為什么數據集對AIGC如此重要&#xff1f;1. 數據決定模型的知識邊界2. 數據質量直接影響生成效果3. 數據集多樣性提升模型魯棒性 二、構建AIGC訓練集的關鍵步驟1. 明確目標任務和生成需求2. 數據源的選擇3. 數據清洗與預處理4. 數據標注5. 數據增強 三、針對不同類…

47 基于單片機的書庫環境監測

目錄 一、主要功能 二、硬件資源 三、程序編程 四、實現現象 一、主要功能 基于51單片機&#xff0c;采用DHT11濕度傳感器檢測濕度&#xff0c;DS18B20溫度傳感器檢測溫度&#xff0c; 采用滑動變阻器連接數模轉換器模擬二氧化碳和氧氣濃度檢測&#xff0c;各項數值通過lc…

【操作系統】每日 3 題(五十五)

?個人博客&#xff1a;https://blog.csdn.net/Newin2020?typeblog &#x1f4e3;專欄地址&#xff1a;https://blog.csdn.net/newin2020/category_12820365.html &#x1f4da;專欄簡介&#xff1a;在這個專欄中&#xff0c;我將會分享操作系統面試中常見的面試題給大家~ ??…

服務器加固

1.服務器密碼復雜度 密碼最小長度&#xff0c;密碼復雜度策略 vim /etc/pam.d/system-auth --------------- #密碼配置 #ucredit&#xff1a;大寫字母個數&#xff1b;lcredit&#xff1a;小寫字母個數&#xff1b;dcredit&#xff1a;數字個數&#xff1b;ocredit&#xff1a;…

spring boot 同一個redis 操作不同的庫

1.下面是在Spring Boot中配置多個Redis數據庫的幾種方式&#xff1a; 1.1 配置如下# application.yml spring:redis:host: localhostport: 6379password: your_password# 連接池配置lettuce:pool:max-active: 8max-idle: 8min-idle: 0max-wait: -1mstimeout: 5000ms# 多個數據…

C語言面試題/筆試題/高頻面試題_2

9. 全局變量和局部變量的區別 定義&#xff1a;全局變量是定義在函數外部的變量&#xff0c;局部變量是定義在 函數內部的變量 存儲位置&#xff1a;全局變量存儲在全局區&#xff0c;局部變量存儲在棧區 作用域&#xff1a;全局變量可以在程序任意位置使用&#xff0c;局部變量…

Brain.js(八):RNNTimeStep 實戰教程 - 股票價格預測 - 實操需警慎

前置聲明&#xff0c;個人淺度炒股&#xff0c;但計劃將基金轉入股市。然后 股市有風險&#xff0c;不是技術可以完全預測的&#xff0c;但是在無頭緒的時候&#xff0c;用技術指標做個參考也不錯。 本文涉及到的股票預測&#xff0c;只是代碼簡單示例&#xff0c;實操需警慎&a…

MySQL | 尚硅谷 | 第13章_約束

MySQL筆記&#xff1a;第13章_約束 文章目錄 MySQL筆記&#xff1a;第13章_約束第13章_約束 1. 約束(constraint)概述1.1 為什么需要約束1.2 什么是約束1.3 約束的分類演示代碼 2. 非空約束2.1 作用2.2 關鍵字2.3 特點2.4 添加非空約束2.5 刪除非空約束演示代碼 3. 唯一性約束3…

《計算機網絡》(408大題)

2009 路由轉發和靜態路由的計算 子網劃分、路由聚合的計算 注&#xff1a;CIDR中的子網號可以全為0或1&#xff0c;但是其主機號不允許。 注&#xff1a; 這里其實是把到互聯網的路由當做了一個默認路由&#xff08;當一個目的網絡地址與路由表中其他都不匹配時&#xff0c;…

NanoLog起步筆記-6-StaticLogInfo

nonolog起步筆記-6-StaticLogInfo StaticLogInfo文件名和行號文件名和行號的傳入log參數 RuntimeLogger::registerInvocationSitelogid為什么只能被賦一次值 reserveAlloc加入消息頭finishAlloc返回 StaticLogInfo 寫C語言編譯前端時&#xff0c;給我印象深刻的一部分是&#…

軟件工程 概述

軟件 不僅僅是一個程序代碼。程序是一個可執行的代碼&#xff0c;它提供了一些計算的目的。 軟件被認為是集合可執行的程序代碼&#xff0c;相關庫和文檔的軟件。當滿足一個特定的要求&#xff0c;就被稱為軟件產品。 工程 是所有有關開發的產品&#xff0c;使用良好定義的&…