因子分析是一種常用的特征提取方法,可以被認為是主成分分析(Principal Component Analysis, PCA)的擴展。因子分析與PCA最大的區(qū)別在于,因子分析得到的隱藏因子具有可解釋性,具有較高的實用價值?,F(xiàn)如今,對于因子分析在提高模型可解釋性和有效性的研究還尚未得到徹底的分析和探索。?
因子分析通過對相關矩陣的分析,尋找一些支配特征間相關性的獨立的潛在因子,簡化觀測數(shù)據(jù),從而挖掘有效信息。為了獲得具有代表性的隱藏因子,只有當樣本充足且變量之間具有較強的相關性時,因子分析的結(jié)果才有效。因此,在因子分析之前,通常需要采用Kaiser-Meyer-Olkin(KMO)檢驗和巴特利特檢驗來判斷數(shù)據(jù)是否適合使用因子分析挖掘共性因子。
KMO檢驗基于皮爾遜相關系數(shù)和偏相關系數(shù)之間的關系。對于所有特征,當皮爾遜相關系數(shù)的平方和遠遠大于偏相關系數(shù)的平方和時,說明觀測數(shù)據(jù)的樣本量充足,特征之間存在共性因子。
假設預處理后的數(shù)值為數(shù)據(jù)[D, Y],是監(jiān)測特征的矩陣,
是因變量。如前文所述,對于包含N個特征和K個樣本的
,(Di?= [xi1,?xi2,?...,?xik], i?= 1,?2,?...,?N),變量Di和Dj的皮爾遜相關系數(shù)記為rij(i, j =1,?2,?...,?N),控制剩余變量的偏相關系數(shù)記為pij。則KMO檢驗的檢驗統(tǒng)計量M為:
? (1)
其中,R和Q分別是所有特征皮爾遜相關系數(shù)和偏相關系數(shù)的平方和。一般情況下,當M(也被稱為KMO值)大于0.5時,數(shù)據(jù)適合進行因子分析。
巴特利特檢驗的原假設是“特征的相關系數(shù)矩陣C是單位矩陣”,其檢驗統(tǒng)計量Φ是相關系數(shù)矩陣C的行列式。
? ? ? ?(2)
矩陣C中第i行j列元素rij是變量Di和Dj的皮爾遜相關系數(shù)(i, j =1,?2,?...,?N)。
根據(jù)自由度和統(tǒng)計值,通過查詢卡方分布表,可以近似地得到巴特利特檢驗的伴生概率。根據(jù)伴生概率p與顯著性水平α之間的關系,可以確定特征D1, D2, ..., DN是否適合進行因子分析。當p<α時,應拒絕原假設,則相關矩陣C不是一個單位矩陣,特征之間存在明顯的相關性。本論文的顯著性水平設為0.05,這也是當前最常用的顯著性水平。
對于,其因子分析模型的結(jié)果可以被描述為:
? ? ? (3)
其中F是得到的相互獨立的隱藏因子的矩陣(H?≤?N),轉(zhuǎn)化矩陣A被成為載荷矩陣,aij表示特征Di在因子Fj上的載荷,
是均值為零、方差為有限值的隨機誤差項。?
因子分析的目標是使相似(或相同類型)特征在每個因子上的載荷一致,即同時比較大或同時比較小。從而使得,單個因子對相似特征具有相同的意義表征。在這種情況下,就要求在不同的因子之間有明顯的差異。為了得到這樣的隱藏因子,我們需要在擬合公式(3)的基礎上盡可能地降低因子之間的相關性。從同樣是線性組合模型的PCA出發(fā),研究者們設計了一個便捷、有效的因子分析過程,大大降低了因子分析模型優(yōu)化的復雜度。這個方法基于對PCA得到的線性組合特征進行坐標旋轉(zhuǎn),以最大限度地提高這些線性組合特征之間的差距。得益于PCA的優(yōu)點,這一過程還可以觀測到隱藏因子對原始特征的信息提取程度。
因子分析的步驟如下所示:
- 計算(預處理后的)原始特征D1,D2, ...,DN的相關系數(shù)矩陣C,以及C的所有特征
(
)和相應的特征向量
(
)。當設置主成分個數(shù)為N時,基于PCA得到的線性組合特征被稱為主成分。對于主成分(i =1,?2,?...,?N),其方差貢獻率vcri和累積方差貢獻率ccri分別為:
? ? ? ?(4)
? ? ? ?(5)?
主成分分析中的主成分個數(shù)可以根據(jù)實際需求或數(shù)據(jù)特征來確定,這N個完整的主成分被認為是因子分析的基礎因子。
? ? ? (6)
2. 當設置隱藏因子的個數(shù)為H時,基礎的載荷矩陣可以由相關系數(shù)矩陣C的前H個特征值和特征向量
獲得。
? ? ? (7)
3. 需要進行坐標旋轉(zhuǎn),使相似(或相同類型)特征在各因子上的載荷大小保持一致,以提高因子的實際意義。Varimax準則是因子坐標旋轉(zhuǎn)中最常用的方法,通過最大化所有因子的載荷的方差和,使所得到的因子之間的差異更加明顯。具體而嚴,首先將原始特征按照相關性分組,使用Varimax準則進行坐標旋轉(zhuǎn),優(yōu)化過程使同組特征的載荷相似(距離小),不同組特征的載荷差別明顯(距離大)。從而確保相關性強的特征在同一因子上的載荷大小是一致的,且不同的因子對應不同的特征組組合。旋轉(zhuǎn)后的載荷矩陣被記為矩陣A(此即為因子分析模型中的載荷矩陣)。
? ? ? (8)
4. 使用回歸估計法,可以計算得到因子得分系數(shù)矩陣G,以及各個因子。
?? ? ? ?(9)
? ? ? ?(10)?
這里C-1是相關系數(shù)矩陣C的逆矩陣。則:
?? ? ? ? (11)?
確定共性因子個數(shù)是上述因子分析過程中的關鍵步驟。通常,因子個數(shù)可以根據(jù)實際需求或特征相關性分析來決定。但對于復雜系統(tǒng),由于復雜的功能和結(jié)構(gòu)難以分析,且監(jiān)測特征大多存在冗余,因此很難確定可能涵蓋的隱藏因子個數(shù)。因此,在本論文中,我們設計了選取因子個數(shù)的依據(jù):確保共性因素能夠盡可能多地從監(jiān)測特征中提取信息,且每個監(jiān)測特征都能有代表其的因子以便于后續(xù)分析特征之間關系。并給出了設置因子個數(shù)和給因子命名的一般規(guī)則,如下所示:
1. 首先,根據(jù)初始因子(即主成分)的累積方差貢獻率,可以得到累積方差貢獻率達到80%以上時的最小因子數(shù)(最小主成分數(shù)),定義為H1。
2. 其次,令H?≥H1,計算所有特征的因子提取度,使每個特征的因子提取度超過70%的最小因子數(shù)就是最終確定的因子個數(shù)。這里,因子提取度表示原始特征能被因子解釋的部分的方差在總體中的占比。當因子數(shù)為H時,特征Di(i =1,2,...,N)的因子提取度,記為,是載荷矩陣中第j列元素的平方和。
? ? ? ? ? (12)
3. 上述閾值80%和70%是特征提取中常用的數(shù)值,實際上也可根據(jù)需要選擇其他閾值,比如85%和75%的組合。此外,還可以根據(jù)實際數(shù)據(jù)的特征使用適當?shù)拈撝怠@?,當因子個數(shù)持續(xù)增加,但累積方差貢獻率或特征的因子提取度幾乎沒有增加時,則可以根據(jù)主觀經(jīng)驗選擇合適的因子個數(shù)。
4. 當特征Di在因子Fj上的載荷大于0.6時,我們稱Fj是Di的代表因子,或Di是Fj的一個表示特征。這里,閾值0.6是根據(jù)之前設置的因子提取度閾值計算得到的,也可以直接使用。這意味著因子Di從原始特征Di中提取了一半以上的有效信息。
隱藏因子實際上代表了原始監(jiān)測特征之間的關系。因此,在命名過程中,一個因子可以直接命名為其表示特征的組合。如果一個因子只有一個表示特征,則可以直接使用該特征的名稱為該因子命名。當然,當因子的實際意義可以根據(jù)其代表特征之間的共性分析得到時,可以用因子的實際意義來命名。此外,如果存在一個特征的因子提取度大于70%,但其卻沒有代表性因子時,可以認為該特征是一個受多種潛在因素影響的綜合性特征(即已經(jīng)融合了不同信息的特征)。
粗略的Python代碼:
import pandas as pd import numpy as np import numpy.linalg as nlg from factor_analyzer import FactorAnalyzer, calculate_kmo, calculate_bartlett_sphericity from sklearn import preprocessing source_data = pd.read_csv('data.csv') data = source_data.values ss = preprocessing.StandardScaler() array = ss.fit_transform(data) print(array) data = pd.DataFrame(list(array), columns=source_data.columns) #print(data) data_corr = data.corr() #print("\n相關系數(shù):\n",data_corr) kmo = calculate_kmo(data) bartlett = calculate_bartlett_sphericity(data) print("\n因子分析適用性檢驗:") print('kmo:{},bartlett:{}'.format(kmo[1], bartlett[1])) fa = FactorAnalyzer(rotation=None, n_factors=38, method='principal') fa.fit(data) fa_sd = fa.get_factor_variance() fa_df = pd.DataFrame( {'特征值': fa_sd[0], '方差貢獻率': fa_sd[1], '方差累計貢獻率': fa_sd[2]}) #各個因子的特征值以及方差貢獻率 print("\n", fa_df) factors = 19 #設置公因子個數(shù),重新擬合 fa = FactorAnalyzer(rotation=None, n_factors=factors, method='principal') fa.fit(data) #查看公因子提取度 print("\n公因子提取度:\n", fa.get_communalities()) #查看因子載荷 print("\n因子載荷矩陣:\n", fa.loadings_) #使用最大方差法旋轉(zhuǎn)因子載荷矩陣 fa_rotate = FactorAnalyzer(rotation='varimax', n_factors=factors, method='principal') fa_rotate.fit(data) #查看旋轉(zhuǎn)后的因子載荷 print("\n旋轉(zhuǎn)后的因子載荷矩陣:\n", fa_rotate.loadings_) # 因子得分(回歸方法)(系數(shù)矩陣的逆乘以因子載荷矩陣) X1 = np.mat(data_corr) X1 = nlg.inv(X1) factor_score = np.dot(X1, fa_rotate.loadings_) factor_score = pd.DataFrame(factor_score) factor_score.columns = ['F1', 'F2', 'F3', 'F4', 'F5', 'F6', 'F7', 'F8','F9', 'F10', 'F11','F12', 'F13', 'F14', 'F15', 'F16', 'F17', 'F18', 'F19'] factor_score.index = data_corr.columns print("\n因子得分:\n",factor_score) fa_t_score = np.dot(np.mat(data), np.mat(factor_score)) F_factors = pd.DataFrame(fa_t_score,columns=factor_score.columns) def writedata(data): writer = pd.ExcelWriter("得分_19.xlsx", encoding="utf-8-sig") data.to_excel(writer, 'Sheet1') writer.save() fa_zh = pd.DataFrame(fa_t_score) #factor_score.columns writedata(factor_score)
因子分析可用于解耦復雜結(jié)構(gòu)型數(shù)據(jù)的因果關系,得到的因子不僅互相獨立且具有實際意義(可解釋性),基于因子挖掘到的因果關系是稀疏、穩(wěn)定、可驗證的。
參考文章:https://onlinelibrary.wiley.com/doi/10.1111/exsy.13197
https://www.researchgate.net/publication/365665540_Fault_diagnosis_for_high-speed_train_braking_system_based_on_disentangled_causal_representation_learning
文章來源:http://www.zghlxwxcb.cn/news/detail-466369.html
?文章來源地址http://www.zghlxwxcb.cn/news/detail-466369.html
到了這里,關于因子分析(factor analysis)過程的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!